本人上一篇文章《騰訊 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 國際許可協議 進行許可。