TarsGo 快速入门

服务编写

创建服务

运行create_tars_server.sh脚本,自动创建服务必须的文件, 执行过程中如果出现语法错误尝试使用dos2unix create_tars_server.sh进行转码。

  1. sh $GOPATH/src/github.com/TarsCloud/TarsGo/tars/tools/create_tars_server.sh [App] [Server] [Servant]
  2. 例如:
  3. sh $GOPATH/src/github.com/TarsCloud/TarsGo/tars/tools/create_tars_server.sh TestApp HelloGo SayHello

命令执行后将生成代码至GOPATH中,并以APP/Server命名目录,生成代码中也有提示具体路径。

  1. [root@1-1-1-1 ~]# sh $GOPATH/src/github.com/TarsCloud/TarsGo/tars/tools/create_tars_server.sh TestApp HelloGo SayHello
  2. [create server: TestApp.HelloGo ...]
  3. [mkdir: $GOPATH/src/TestApp/HelloGo/]
  4. >>>Now doing:./start.sh >>>>
  5. >>>Now doing:./Server.go >>>>
  6. >>>Now doing:./Server.conf >>>>
  7. >>>Now doing:./ServantImp.go >>>>
  8. >>>Now doing:./makefile >>>>
  9. >>>Now doing:./Servant.tars >>>>
  10. >>>Now doing:client/client.go >>>>
  11. >>>Now doing:vendor/vendor.json >>>>
  12. # runtime/internal/sys
  13. >>> GreatDone! You can jump in $GOPATH/src/TestApp/HelloGo
  14. >>> 当编辑完成Tars文件后,使用如下自动生成go文件
  15. >>> $GOPATH/bin/tars2go *.tars

定义接口文件

接口文件定义请求方法以及参数字段类型等,有关接口定义文件说明参考tars_tup.md

为了测试我们定义一个echoHello的接口,客户端请求参数是短字符串如 “tars”,服务响应”hello tars”.

  1. # cat $GOPATH/src/TestApp/HelloGo/SayHello.tars
  2. module TestApp{
  3. interface SayHello{
  4. int echoHello(string name, out string greeting);
  5. };
  6. };

注意: 参数中out修饰关键字标识输出参数。

服务端开发

首先把tars协议文件转化为Golang语言形式

  1. $GOPATH/bin/tars2go SayHello.tars

现在开始实现服务端的逻辑:客户端传来一个名字,服务端回应hello name。

  1. cat $GOPATH/src/TestApp/HelloGo/SayHelloImp.go
  1. package main
  2. type SayHelloImp struct {
  3. }
  4. func (imp *SayHelloImp) EchoHello(name string, greeting *string) (int32, error) {
  5. *greeting = "hello " + name
  6. return 0, nil
  7. }

注意: 这里函数名要大写,Go语言方法导出规定。

编译main函数,初始代码以及有tars框架实现了。

cat $GOPATH/src/TestApp/HelloGo/HelloGo.go

  1. package main
  2. import (
  3. "github.com/TarsCloud/TarsGo/tars"
  4. "TestApp"
  5. )
  6. func main() { //Init servant
  7. imp := new(SayHelloImp) //New Imp
  8. app := new(TestApp.SayHello) //New init the A JCE
  9. cfg := tars.GetServerConfig() //Get Config File Object
  10. app.AddServant(imp, cfg.App+"."+cfg.Server+".SayHelloObj") //Register Servant
  11. tars.Run()
  12. }

编译生成可执行文件,并打包发布包。

  1. cd $GOPATH/src/TestApp/HelloGo/ && make && make tar

将生成可执行文件HelloGo和发布包HelloGo.tgz

客户端开发

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/TarsCloud/TarsGo/tars"
  5. "TestApp"
  6. )
  7. //只需初始化一次,全局的
  8. var comm *tars.Communicator
  9. func main() {
  10. comm = tars.NewCommunicator()
  11. obj := "TestApp.HelloGo.SayHelloObj@tcp -h 127.0.0.1 -p 3002 -t 60000"
  12. app := new(TestApp.SayHello)
  13. /*
  14. // if your service has been registered at tars registry
  15. comm = tars.NewCommunicator()
  16. obj := "TestApp.HelloGo.SayHelloObj"
  17. // tarsregistry service at 192.168.1.1:17890
  18. comm.SetProperty("locator", "tars.tarsregistry.QueryObj@tcp -h 192.168.1.1 -p 17890")
  19. */
  20. comm.StringToProxy(obj, app)
  21. reqStr := "tars"
  22. var resp string
  23. ret, err := app.EchoHello(reqStr, &resp)
  24. if err != nil {
  25. fmt.Println(err)
  26. return
  27. }
  28. fmt.Println("ret: ", ret, "resp: ", resp)
  29. }
  • TestApp依赖是tars2go生成的代码。
  • obj指定服务端地址端口,如果服务端未在主控注册,则需要知道服务端的地址和端口并在Obj中指定,在例子中,协议为TCP,服务端地址为本地地址,端口为3002。如果有多个服务端,则可以这样写TestApp.HelloGo.SayHelloObj@tcp -h 127.0.0.1 -p 9985:tcp -h 192.168.1.1 -p 9983这样请求可以分散到多个节点。

    如果已经在主控注册了服务,则不需要写死服务端地址和端口,但在初始化通信器时需要指定主控的地址。

  • com通信器,用于与服务端通信。

编译测试

  1. # go build client.go
  2. # ./client
  3. ret: 0 resp: hello tars

HTTP 服务开发

tarsgo支持http服务,按照上面的步骤创建好服务,tarsgo中处理http请求是在GO原生中的封装,所以使用很简单。

  1. package main
  2. import (
  3. "net/http"
  4. "github.com/TarsCloud/TarsGo/tars"
  5. )
  6. func main() {
  7. mux := &tars.TarsHttpMux{}
  8. mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  9. w.Write([]byte("Hello tars"))
  10. })
  11. cfg := tars.GetServerConfig()
  12. tars.AddHttpServant(mux, cfg.App+"."+cfg.Server+".HttpSayHelloObj") //Register http server
  13. tars.Run()
  14. }

另外还可以直接调用其他tars服务,调用方式和“客户端开发”提到一样。