banner

作者:amc

导语:之前的文章中我们介绍了如何使用TarsGo创建HTTP服务TARS RPC服务,本篇文章中,我们将介绍如何在TarsGo服务中获得自定义模板的配置值。

TARS 模版是什么?

TARS 框架中,有两种可以称之为 “配置” 的地方:其中一个是可以自定义的,在 TARS 管理页面中称为 服务配置。在这里,可以按照开发者喜欢的格式上传文件,并且支持配置的热更新。

而另一个地方,则是本文要讲的。这个在 TARS 中称为 “模版”。模版可以在 TARS 管理平台顶部的 “运维管理” 进去后,再进入 模版管理 可以看到。

查看下面那些已有的模版可以看到,一般而言,模版是用于对整个服务的参数进行配置,其配置项更加偏向运维,而不是偏业务。

TARS 模版的内容

TarsGo 服务一般使用 tars.go.default 模板。目前tars.go.default模板各节点的属性为空,从上节图中的模板列表中可以看到,这个模板的父模板为tars.default,各节点的属性值会从父模板中继承。通过模板继承,后续如果需要为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(毫秒)
            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
    
    ...
}

说明如下:

获取 <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 日

发布平台:云+社区


TARS基金会
16 声望7 粉丝

2020年3月10日,Linux基金会正式宣布旗下的TARS开源项目将成立TARS基金会。TARS基金会是一个专注于微服务领域的开源基金会,致力于帮助企业在拓展新领域时拥抱微服务体系架构,解决在使用微服务方面可能出现的问...