騰訊 Tars-Go 服務獲取自定義模版(配置)值

weixin_34127717發表於2019-02-25

Tars 模版是什麼?

騰訊 Tars 框架中,有兩種可以稱之為 “配置” 的地方:其中一個是可以自定義的,在 Tars 管理頁面中稱為 “服務配置”。在這裡,可以按照開發者喜歡的格式上傳檔案,並且支援配置的熱更新。

而另一個地方,則是本文要講的。這個在 Tars 中稱為 “模版”。模版可以在 Tars 管理平臺頂部的 “運維管理” 進去後,再進入 “模版管理” 可以看到。

檢視下面那些已有的模版可以看到,一般而言,模版是用於對整個服務的引數進行配置,其配置項更加偏向運維,而不是偏業務。

Tars 模版的內容

TarsGo 服務一般使用 tars.default 模板。檢視這個模板的內容,可以看到如下:

<tars>
    <application>
        enableset=${enableset}        #是否啟用SET分組
        setdivision=${setdivision}    #SET分組的全名.(mtt.s.1)
        <client>
            locator =${locator}        #地址
            sync-invoke-timeout = 3000    #同步呼叫超時時間,預設3s(毫秒)
            async-invoke-timeout =5000    #非同步超時時間,預設5s(毫秒)
            refresh-endpoint-interval = 60000    #重新獲取服務列表時間間隔(毫秒)
            stat = tars.tarsstat.StatObj        #模組間呼叫服務[可選]
            property = tars.tarsproperty.PropertyObj    #屬性上報服務[可選]
            report-interval = 60000    #上報間隔時間,預設60s(毫秒)
            sample-rate = 100000    #stat取樣比1:n 例如sample-rate為1000時 取樣比為千分之一
            max-sample-count = 50    #1分鐘內stat最大采樣條數
            asyncthread = ${asyncthread}    #網路非同步回撥執行緒個數
            modulename = ${modulename}    #模組名稱
        </client>
        <server>
            app      = ${app}    #應用名稱
            server  = ${server}    #服務名稱
            localip  = ${localip}    #本地ip
            local  = ${local}        #本地管理套接字[可選]
            basepath = ${basepath}    #服務的資料目錄,可執行檔案,配置檔案等
            datapath = ${datapath}
            logpath  = ${logpath}    #日誌路徑
            logsize = 10M        #日誌大小
            lognum = 10            #日誌數量
            config  = tars.tarsconfig.ConfigObj    #配置中心的地址[可選]
            notify  = tars.tarsnotify.NotifyObj    #資訊中心的地址[可選]
            log = tars.tarslog.LogObj            #遠端LogServer[可選]
            deactivating-timeout = 3000            #關閉服務時等待時間
            logLevel=DEBUG                        #滾動日誌等級預設值
        </server>          
    </application>
</tars>

上面這些就是 Tars 平臺中固定配置的一些引數。在 TarsGo 中,我們可以以如下引數來讀取:

import (
    "github.com/TarsCloud/TarsGo/tars"
)

func main() {
    cfg := tars.GetServerConfig()            // 1
    server := cfg.App + "." + cfg.Server    // 2
    
    ...
}

說明如下:

  1. 獲取 <server> 下的配置總項,也就是對應著配置的 “域” 為 "tars/application/server"
  2. 獲取 <server> 下的 appserver

但是上面程式碼的 appserver 都是預定義值,如果我們額外新增了一個鍵值對,那麼用這個方法就沒法讀到了。

自定義模版配置

這裡需要提一下如何自定義模版配置。我們點選 Tars 管理平臺的 “服務管理”,再點選具體的服務,比如這裡我拿之前的例子中用到的 GoWebServer 為例,點選具體服務,然後在 “服務管理” tab 中,在指定的服務點 “編輯”:

在談出來的對話方塊中,拉到最下方,在 “私有模板” 中可以配置自己的值。如果配置了與預設模版相同的 key,則 tars 會將值替換為這裡所配置的私有模板值。可以看到在圖中我覆蓋修改了遠端日誌的伺服器。


獲取自定義的模板配置值

TarsGo 獲取模版的原理

這裡其實我們只要看一下 TarsGo 的程式碼,從 GetServerConfig() 函式(檔案是 config.go)往裡看。函式呼叫了 Init(),而這個函式又呼叫了 initConfig() 函式(檔案是 application.go)。該函式的邏輯很清晰,就是利用 github.com/TarsCloud/TarsGo/tars/util/conf 包來解析模版檔案的內容。

解析模版條件的基本邏輯是:

  • 如果遇到一個 xml 屬性,比如 <server>...</server>,那麼這個屬性下本身會被儲存為一個 Go map[string]string 型別,下面儲存以 key = value 格式儲存的鍵值對資訊

因此,我們就可以利用這個 util 包,來獲取解析到的原始配置值了

獲取模版配置值封裝

為了便於使用,我基於 github.com/TarsCloud/TarsGo/tars/util/conf 封裝了一個簡易的包來讀取自定義的模版,安裝如下:

$ go get github.com/Andrew-M-C/tarsgo-tools/config

比如我自定義了以下私有模版:

<tars>
    <application>
        <server>
                  myStr=This is a string
            myInt=54321
            myLong=12345
            myErrorInt=abcde
        </server>
    </application>
</tars>

那麼在服務啟動時我就可以這樣去讀取:

import (
    "github.com/Andrew-M-C/tarsgo-tools/config"
)

func main() {
    tarsconf, err := config.NewConfig()
    if err != nil {
        fmt.Println("Failed to get config: " + err.Error())
    } else {
        myStr, exist := tarsconf.GetString("/tars/application/server", "myStr", "WHAT?")
        fmt.Printf("%t, myStr: %s\n", exist, myStr)

        myInt, exist := tarsconf.GetInt("/tars/application/server", "myInt")
        fmt.Printf("%t, myInt: %d\n", exist, myInt)
        
        myInt2, exist := tarsconf.GetInt("/tars/application/server", "myInt2", -2)
        fmt.Printf("%t, myInt2: %d\n", exist, myInt2)

        myLong, exist := tarsconf.GetLong("/tars/application/server", "myLong", -3)
        fmt.Printf("%t, myLong: %d\n", exist, myLong)
        
        myErrorInt, exist := tarsconf.GetInt("/tars/application/server", "myInt", -4)
        fmt.Printf("%t, myErrorInt: %d\n", exist, myErrorInt)
    }
    return
}

命令列輸出:

true, myStr: This is a string
true, myInt: 54321
false, myInt2: -2
true, myLong: 12345
false, myErrorInt: -4

這就成功讀到自定義的配置值啦。其中對於每一個 GetXxx() 函式,都可以傳入三個引數:

  1. 第一個引數為 domain,也就是前文提到的 “域” 名
  2. 第二個引數為 key,指的是指定域下鍵值對的鍵名
  3. 第三個引數可選,可以不傳;如果傳遞了第三個引數的話,那麼當 existfalse 的時候,介面會將該值作為預設值,賦給返回值,開發者可以用來節省一些程式碼操作。

需要注意的是,其中 myErrorInt 的值儘管是存在的,但是由於無法解析為數字,因此 GetInt() 函式返回的 exist 結果為 false


本文章採用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議 進行許可。

原作者: amc,歡迎轉載,但請按上述協議註明出處。

本文連結:https://segmentfault.com/a/1190000018271503

原文連結:https://cloud.tencent.com/developer/article/1394093,也是本人的部落格

原文標題:《騰訊 Tars-Go 服務獲取自定義模版(配置)值》

釋出日期:2019 年 2 月 25 日

釋出平臺:SegmentFault

相關文章