本人上一篇文章《腾讯 Tars 基础框架手动搭建》简单介绍了 Tars 框架及其搭建方法。在咱们的实际应用中,目前基于 Taf / Tars,主要采用 Node.js 和 C++ 进行开发。对于 C++ 程序员来讲,目前最热门的后台开发语言莫过于 Google 的 Go。Tars 框架最新的版本已经把内部的 Taf-Go 开源为 Tars-Go。做为与时俱进的程序员,固然要尝鲜啦。git
本文中的代码都可以在 个人 GitHub repo 中查阅。程序员
本系列文章:github
开发环境显然要安装好 Go 了。请注意的是,TarsGo 要求 Go 版本 1.9 以上。最新稳定版已是 1.11 了。安装最新版便可。shell
Go 安装好以后,请注意配置好 $GOPATH
和 $GOROOT
环境变量,建议配置为 $HOME/go
目录。尽管在 Go 1.8 以后,go 命令的运行已经再也不须要程序员配置上述变量(go 会自动配置,可执行 $ go env
查看),可是 TarsGo 的脚本在执行的时候仍是须要依赖。json
执行 go 安装命令并编译:centos
$ go get github.com/TarsCloud/TarsGo/tars $ cd $GOPATH/src/github.com/TarsCloud/TarsGo/tars/tools/tars2go && go build . $ sudo cp tars2go $GOPATH/bin
上述命令会把 TarsGo 下载下来,而且将比较重要的一个命令 tars2go
安装好。bash
TarsGo 的官方 Quick Start 文档 的第一个例子,就是使用 tars 协议进行 server-client 的通讯。不过我我的以为,要说后台服务程序的 hello world 的话,第一个应该是 http 服务嘛,毕竟程序一运行就能够看到效果,这才是 hello world 嘛。app
Tars 实例的名称,有三个层级,分别是 App(应用)、Server(服务)、Servant(服务者,有时也称 Object)三级。在前文咱们已经初步接触到了:好比 Tars 基础框架中的 tarsstat
,其服务的完整名称即为:tars.tarsstat.StatObj
。框架
Tars 实例的名称其中一个很是重要的做用就是用于服务间名字服务寻址。而对于 HTTP 这样的直接对外提供服务的实例而言,其实这块相对不是很重要,咱们更多的是以描述服务功能的角度去命名。这里我把个人 HTTP 服务命名为 amc.GoWebServer.GoWebObj
运维
和 TarsCpp 同样,TarsGo 也提供了一个 create_tars_server.sh
脚本用于生成 tars 服务,但却没有提供 create_http_server.sh
生成 HTTP 服务。因此这里咱们就直接用它就好了:
$ cd $GOPATH/src/github.com/TarsCloud/TarsGo/tars/tools $ chmod +x create_tars_server.sh $ ./create_tars_server.sh amc GoWebServer GoWeb
执行后咱们能够查看生成的文件,清除不须要的:
$ cd $GOPATH/src/amc/GoWebServer $ rm -rf GoWeb.tars client debugtool $ chmod +x start.sh $ ls -l total 44 -rw-rw-r-- 1 centos centos 303 Jan 5 22:09 GoWebImp.go -rw-rw-r-- 1 centos centos 964 Jan 5 22:09 GoWebServer.conf -rw-rw-r-- 1 centos centos 422 Jan 5 22:09 GoWebServer.go -rw-rw-r-- 1 centos centos 252 Jan 5 22:09 makefile -rw-rw-r-- 1 centos centos 59 Jan 5 22:09 start.sh drwxrwxr-x 2 centos centos 4096 Jan 5 22:09 vendor
其实留下的,各文件里的内容,实际上咱们都要彻底替换掉的……首先是修改 makefile,自动生成的 makefile 内容是这样的:
$ cat makefile APP := amc TARGET := GoWebServer MFLAGS := DFLAGS := CONFIG := client STRIP_FLAG:= N J2GO_FLAG:= libpath=${subst :, ,$(GOPATH)} $(foreach path,$(libpath),$(eval -include $(path)/src/github.com/TarsCloud/TarsGo/tars/makefile.tars))
咱们把 “CONFIG := client
” 行去掉就好了。
接着是修改代码了。首先是 GoWebServer.go
,这里参照官方 Guide 的写法就行了,TarsGo 的 HTTP 实现用的是 Go 原生的组件。我稍微调整了一下,把回调函数放在 GoWebImp.go
中("imp" 是 implementation,我之前一直觉得是小恶魔的意思……),将 GoWebServer.go
简化为:
package main import ( "github.com/TarsCloud/TarsGo/tars" ) func main() { mux := &tars.TarsHttpMux{} mux.HandleFunc("/", HttpRootHandler) cfg := tars.GetServerConfig() tars.AddHttpServant(mux, cfg.App+"."+cfg.Server+".GoWebObj") //Register http server tars.Run() }
代码仍是比较简单的,无需多言。
GoWebServer.go
中的 HTTPRootHandler
回调函数定义在业务的主要实现逻辑 GoWebImp.go
文件中:
package main import ( "fmt" "time" "net/http" ) func HttpRootHandler(w http.ResponseWriter, r *http.Request) { time_fmt := "2006-01-02 15:04:05" local_time := time.Now().Local() time_str = local_time.Format(time_fmt) ret_str = fmt.Sprintf("{\"msg\":\"Hello, Tars-Go!\", \"time\":\"%s\"}", time_str) w.Header().Set("Content-Type", "application/json;charset=utf-8") w.Write([]byte(ret_str)) return }
编译打包上面的工程:
$ cd $GOPATH/src/amc/GoWebServer $ make && make tar
成功后,会在目录下生成目标文件 GoWebServer.tgz
,后文部署发布时须要上传这个包。
在 Tars 管理平台主页中,点击 “运维管理”,界面以下:
Tars 管理平台没有专门的 “新增应用” 功能,全部 app、server、object 的新增都在这个界面中配置。输入一个不存在的对象,就至关于新增操做。因此咱们新增 “amc.GoWebServer.GoWebObj
”,就是在各项中以下填写:
amc
GoWebServer
tars_go
tars.default
GoWebObj
TCP
非TARS
各项填写完毕后,点 “肯定”,而后刷新界面,从新进入 Tars 管理平台主页,能够看到界面左边的列表就多了上面的配置:
点击 “GoWebServer
”,显示 “发布管理” 子标签。在 “服务列表” 中选中须要发布的节点,而后点击 “发布选中节点” 按钮:
再点击 “上传发布包”,进入以下界面:
点击 “发布包” 右边的 “肯定” 按钮,在弹出的对话框中选择前面提到的 GoWebServer.tgz
文件。给这个发布包写好描述以后,点击确认,开始上传发布包:
发布成功后,回到 “发布管理” 界面,在该界面中,选择刚才发布的包,而后点击发布,一切正常状况下,便可发布成功。
假设前面获取到的 servant 端口为 10008,那么能够在机器上执行 curl
命令(好比个人机器 IP 是 10.0.4.11
):
$ curl 10.0.4.11:10008 {"msg":"Hello, Tars-Go!","unix":1546747070,"time":"2019-01-06 11:57:50","client":":-1"}
这就验证 OK 啦,同时也说明了 Tars 管理平台的配置值配置正确了。
此外,本人开始的时候用的是 localhost 地址,可是却错误了:
$ curl 127.0.0.1:10008 curl: (52) Empty reply from server
这里让我误觉得服务没有发布成功,折腾了很久。究其缘由,是由于在 Tars 中对 servant 自动生成的配置是这样的(以个人为例,在 “服务管理” 中点击 ”管理Servant“):
留意在 “绑定地址” 中,线程监听的 IP 地址是 10.0.4.11
,因此 localhost
天然就访问不到了。这里不建议修改,若是要修改的话,还须要修改 “服务配置”。这歌内容相对比较深刻,本文就不详述了。
本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。