内容简介:腾讯 Tars 框架中,有两种可以称之为 “配置” 的地方:其中一个是可以自定义的,在 Tars 管理页面中称为 “服务配置”。在这里,可以按照开发者喜欢的格式上传文件,并且支持配置的热更新。而另一个地方,则是本文要讲的。这个在 Tars 中称为 “模版”。模版可以在 Tars 管理平台顶部的 “运维管理” 进去后,再进入 “模版管理” 可以看到。
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
...
}
说明如下:
- 获取
<server>下的配置总项,也就是对应着配置的 “域” 为"tars/application/server" - 获取
<server>下的app和server值
但是上面代码的 app 和 server 都是预定义值,如果我们额外添加了一个键值对,那么用这个方法就没法读到了。
自定义模版配置
这里需要提一下如何自定义模版配置。我们点击 Tars 管理平台的 “服务管理”,再点击具体的服务,比如这里我拿 之前的例子 中用到的 GoWebServer 为例,点击具体服务,然后在 “服务管理” tab 中,在指定的服务点 “编辑”:
在谈出来的对话框中,拉到最下方,在 “私有模板” 中可以配置自己的值。如果配置了与默认模版相同的 key,则 tars 会将值替换为这里所配置的私有模板值。可以看到在图中我覆盖修改了远程日志的服务器。
获取自定义的模板配置值
TarsGo 获取模版的原理
这里其实我们只要看一下 TarsGo 的代码,从 GetServerConfig() 函数(文件是 config.go )往里看。函数调用了 Init() ,而这个函数又调用了 initConfig() 函数(文件是 application.go )。该函数的逻辑很清晰,就是利用 github.com/TarsCloud/TarsGo/tars/util/conf 包来解析模版文件的内容。
解析模版条件的基本逻辑是:
- 如果遇到一个 xml 属性,比如
<server>...</server>,那么这个属性下本身会被存储为一个 Gomap[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() 函数,都可以传入三个参数:
- 第一个参数为
domain,也就是前文提到的 “域” 名 - 第二个参数为
key,指的是指定域下键值对的键名 - 第三个参数可选,可以不传;如果传递了第三个参数的话,那么当
exist为false的时候,接口会将该值作为默认值,赋给返回值,开发者可以用来节省一些代码操作。
需要注意的是,其中 myErrorInt 的值尽管是存在的,但是由于无法解析为数字,因此 GetInt() 函数返回的 exist 结果为 false 。
本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
原作者: amc ,欢迎转载,但请按上述协议注明出处。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
文明之光(第二册)
吴军 / 人民邮电出版社 / 2014-6 / 59.00元
【《文明之光》系列荣获由中宣部、中国图书评论学会和中央电视台联合推选的2014“中国好书”奖】 吴军博士从对人类文明产生了重大影响却在过去被忽略的历史故事里,选择了有意思的几十个片段特写,以人文和科技、经济结合的视角,有机地展现了一幅人类文明发展的宏大画卷。 《文明之光 》系列大致按照从地球诞生到近现代的顺序讲述了人类文明进程的各个阶段,每个章节相对独立,全景式地展现了人类文明发展历程......一起来看看 《文明之光(第二册)》 这本书的介绍吧!