騰訊 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章