专栏首页后台全栈之路腾讯 Tars-Go 服务 Hello World——从 HTTP 开始
原创

腾讯 Tars-Go 服务 Hello World——从 HTTP 开始

引言

本人上一篇文章《腾讯 Tars 基础框架手动搭建》简单介绍了 Tars 框架及其搭建方法。在我们的实际应用中,目前基于 Taf / Tars,主要采用 Node.js 和 C++ 进行开发。对于 C++ 程序员来说,目前最热门的后台开发语言莫过于 Google 的 Go。Tars 框架最新的版本已经把内部的 Taf-Go 开源为 Tars-Go。作为与时俱进的程序员,当然要尝鲜啦。

本文中的代码均可以在 我的 GitHub repo 中查阅。

本系列文章:


环境准备

Go 环境

开发环境显然要安装好 Go 了。请注意的是,TarsGo 要求 Go 版本 1.9 以上。最新稳定版已经是 1.11 了。安装最新版即可。

Go 安装好之后,请注意配置好 $GOPATH$GOROOT 环境变量,建议配置为 $HOME/go 目录。尽管在 Go 1.8 之后,go 命令的运行已经不再需要程序员配置上述变量(go 会自动配置,可执行 $ go env 查看),但是 TarsGo 的脚本在执行的时候还是需要依赖。

TarsGo 包

执行 go 安装命令并编译:

$ 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 安装好。


代码设计

TarsGo 的官方 Quick Start 文档 的第一个例子,就是使用 tars 协议进行 server-client 的通信。不过我个人觉得,要说后台服务程序的 hello world 的话,第一个应该是 http 服务嘛,毕竟程序一运行就可以看到效果,这才是 hello world 嘛。

给服务命名

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

接着是修改代码了。首先是 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()
}

代码还是比较简单的,无需多言。

GoWebImp.go

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
  • 节点:填写你打算部署的 IP 地址
  • OBJ: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 国际许可协议 进行许可。

原文发布于:https://cloud.tencent.com/developer/article/1381300

目前发现以下博客未按上述协议进行转载,已构成侵权:

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 腾讯 Tars 基础框架手动搭建——填掉官方 Guide 的坑

    腾讯 Tars 是腾讯内部使用的 TAF(Tencent Application Framework)的对外开源版,去掉了许多冗杂多余的部分。该框架集开发、运维...

    amc
  • 腾讯 Tars Web 管理端用户体系对接

    这段时间一直在基于 Tars 作开发。最近的文章也多是针对 Tars 的一些学习笔记。前面我们搭建了 Tars 基础框架,打开了 Tars web 管理界面进行...

    amc
  • 腾讯 Tars-Go 服务 Hello World——RPC 通信

    上一篇文章介绍了如何创建安装 TarsGo,同时也阐述了如何开始一个 Tars-Go HTTP 服务。本文就要开始 Tars-Go 的主力业务了:基于 Tars...

    amc
  • Java:并发不易,先学会用

    我的脑袋没有被如来佛祖开过光,所以喜欢一件事接着一件事的想,做不到“一脑两用”。但有些大佬就不一样,比如说诸葛亮,就能够一边想着琴谱一边谈着弹着琴,还能夹带着盘...

    java架构师
  • 分布式系统监控:通过JMX看对象模型的优势

    在Java的圈子里面,任何一个技术产品,一般会先公开一系列的接口定义,然后推出对这个接口的一系列实现软件,这种做法,是一个对软件开发非常有益的进步。因为这让使用...

    韩伟
  • 继续造轮子-MongoDB写日志

    MongoDB我们都知道是一个Nosql,其次MongoDB可以存储海量数据,正好满足我们的需求,日志本身就会很多,基本每一个操作可能都会保存一条日志记录,如果...

    用户7386338
  • [脑海成像]科学家利用动态电极绕过眼睛直接刺激大脑,在盲人脑海画出字母

    5 月 14 日,国际顶级期刊《Cell》杂志发表了一项黑科技成果,来自美国贝勒医学院 Daniel Yoshor 教授带领的研究团队,通过动态电流电极刺激大脑...

    脑机接口社区
  • Centos7 安装 redis

    1.修改/root/redis-stable/redis.conf: daemonize no 将值改为yes 保存退出

    Devops海洋的渔夫
  • 【干货】关于C/C++中的++i和i++实现机制的探讨

    下面我们通过模仿前置和后置操作符的实现方式,来加深对前置、后置操作符实现原理的理解:

    老九君
  • 【人工智能】动物、植物、车型、菜品、LOGO识别示例代码

    图像识别部分接口Java-API调用示例代码 https://gitee.com/xshuai/ai/不是完整的web项目大家没必要下载运行。复制|下载相关代码...

    小帅丶

扫码关注云+社区

领取腾讯云代金券