TarsGo 服務獲取自定義模版(配置)值

banner

做者:amcgit

導語:以前的文章中咱們介紹瞭如何使用TarsGo建立HTTP服務TARS RPC服務,本篇文章中,咱們將介紹如何在TarsGo服務中得到自定義模板的配置值。github

TARS 模版是什麼?

TARS 框架中,有兩種能夠稱之爲 「配置」 的地方:其中一個是能夠自定義的,在 TARS 管理頁面中稱爲 服務配置。在這裏,能夠按照開發者喜歡的格式上傳文件,而且支持配置的熱更新。segmentfault

而另外一個地方,則是本文要講的。這個在 TARS 中稱爲 「模版」。模版能夠在 TARS 管理平臺頂部的 「運維管理」 進去後,再進入 模版管理 能夠看到。服務器

查看下面那些已有的模版能夠看到,通常而言,模版是用於對整個服務的參數進行配置,其配置項更加偏向運維,而不是偏業務。網絡

TARS 模版的內容

TarsGo 服務通常使用 tars.go.default 模板。目前tars.go.default模板各節點的屬性爲空,從上節圖中的模板列表中能夠看到,這個模板的父模板爲tars.default,各節點的屬性值會從父模板中繼承。經過模板繼承,後續若是須要爲TarsGo單獨添加特定配置,可以更加方便。app

咱們來查看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(毫秒)
            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            #日誌數量
            logLevel=DEBUG          #滾動日誌等級默認值
            config  = tars.tarsconfig.ConfigObj #配置中心的地址[可選]
            notify  = tars.tarsnotify.NotifyObj #信息中心的地址[可選]
            log = tars.tarslog.LogObj           #遠程LogServer[可選]
            deactivating-timeout = 3000         #關閉服務時等待時間
        </server>          
    </application>
</tars>

上面這些就是 TARS 平臺中固定配置的一些參數。在 TarsGo 中,咱們能夠以以下語句來讀取:運維

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

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

說明以下:dom

獲取 <server> 下的配置總項,也就是對應着配置的 「域」 爲 tars/application/server
獲取 <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

總結

TARS能夠在考慮到易用性和高性能的同時快速構建系統並自動生成代碼,幫助開發人員和企業以微服務的方式快速構建本身穩定可靠的分佈式應用,從而令開發人員只關注業務邏輯,提升運營效率。多語言、敏捷研發、高可用和高效運營的特性使 TARS 成爲企業級產品。

TARS微服務助您數字化轉型,歡迎訪問:

TARS官網:https://TarsCloud.org

TARS源碼:https://github.com/TarsCloud

獲取《TARS官方培訓電子書》:https://wj.qq.com/s2/6570357/...

或掃碼獲取:

QR

原文連接:https://cloud.tencent.com/developer/article/1394093

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

發佈日期:2019 年 2 月 21 日

發佈平臺:雲+社區

相關文章
相關標籤/搜索