腾讯 Tars-Go 服务获取自定义模版(配置)值
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} #本地iplocal = ${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() // 1server := 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 stringmyInt=54321myLong=12345myErrorInt=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,欢迎转载,但请按上述协议注明出处。
本文链接:https://segmentfault.com/a/1190000018271503
原文链接:https://cloud.tencent.com/developer/article/1394093,也是本人的博客
原文标题:《腾讯 Tars-Go 服务获取自定义模版(配置)值》
发布日期:2019 年 2 月 25 日
发布平台:SegmentFault
腾讯 Tars-Go 服务获取自定义模版(配置)值相关推荐
- @Value注解获取不到配置值
1. 写在前面 碰到过三种情况导致@Value获取不到配置值 变量被关键字static修饰 类没有使用@Component及其衍生标签修饰 在Bean初始化时构造方法中引用被@Value修饰的变量 如 ...
- Spring中@Value注解获取不到配置值
@Value注解必须要在spring的bean中才能使用,不能自己new一个对象调用 产生原因: 在SpringBoot中使用@Value只能给普通变量赋值,不能给静态变量赋值 解决方法: 给静态变量 ...
- 微信公众账号服务号自定义菜单配置与实现
微信自定义菜单 实现其实非常简单.只不过很多人不知道怎么写代码 怎么去做. 下面po上我的实现方法,以备后用. 1.拿到access_token <?php /*** get access to ...
- idea注释模版配置(吐血推荐!!!)
idea注释模版配置 idea作为越来越多程序员使用的开发工具,平时的代码注释也非常的关键,下面介绍一下类上注释和方法上注释,方便大家的开发配置,同时也为自己以后配置留一份记录(毕竟每次换环境都需要重 ...
- uni-app开发微信小程使用腾讯位置服务获取用户的位置信息
uni-app开发微信小程使用腾讯位置服务获取用户的位置信息 一.开通腾讯位置服务 二.编码实现 (一)获取定位坐标 (二).在项目中使用 一.开通腾讯位置服务 在这里我们先要登录腾讯我i之服务的官网 ...
- 微信小程序调用腾讯位置服务获取城市列表
微信小程序调用腾讯位置服务获取城市列表 注意前期的准备: 1.需要用到微信小程序JavaScript SDK https://lbs.qq.com/miniProgram/jsSdk/jsSdkGui ...
- 腾讯Tars框架剖析(一)---Tars框架原理及架构
文章目录 Tars是什么? Tars能干什么? Tars包含了什么? Tars的设计思想是什么? Tars的架构是怎样的? 底层的协议层 上层的服务层 介绍 组成 服务节点: 公共框架结点 Mysql ...
- 腾讯 tars java_腾讯 Tars 基础框架手动搭建——填掉官方 Guide 的坑
背景 Tars 简介 腾讯 Tars 是腾讯内部使用的 TAF(Tencent Application Framework)的对外开源版,去掉了许多冗杂多余的部分.该框架集开发.运维.微服务.RPC ...
- 腾讯 Tars 基础框架手动搭建——填掉官方 Guide 的坑
背景 Tars 简介 腾讯 Tars 是腾讯内部使用的 TAF(Tencent Application Framework)的对外开源版,去掉了许多冗杂多余的部分.该框架集开发.运维.微服务.RPC ...
最新文章
- 2022-2028年中国电梯行业市场调查及前瞻分析报告
- 【matlab】第二次上机课
- 民生银行IT运维架构管理可视化实践
- php单表显示动态下拉框,PHP:使用optgroup动态下拉列表
- 内存泄漏了,咋回事?
- cocos2d-x初探学习笔记(21)--精灵类
- dbinfo.properties mysql_java 8.0Mysql 助手类
- 单片机外围模块漫谈之二,如何提高ADC转换精度
- 【matlab】找出数组中符合条件的数并赋值
- 麦克纳姆轮全向移动机器人运动学模型应用
- access集团和abm_abm展示硬核实力,ACCESS集团携8大国际品牌在进博会首秀!
- USB SERVER网络远程管理U盾
- smobiler中实现页面切换_使用Smobiler实现类似美团的界面
- 肖申克的救赎【观影记录及经典台词摘录】
- 第一次马拉松(2013上海国际马拉松赛)
- SolidWorks-旋转凸台的使用
- auto.js 基于控件的操作
- 第一个用计算机编舞的人,多媒体平台·虚拟人·数字舞蹈
- k8s.gcr.io的镜像无法下载的问题
- 上板子在线抓波发现app_rdy一直为低
热门文章
- linux sshd自动登录,SSH自动登录的几种方法
- 嘉兴市计算机技工学校,嘉兴市高级技工学校2021年招生简章
- 理解JavaScript的宏微任务
- mysql报表慢_mysql慢查询日志报表工具mysqlsla
- postman请求参数区别
- Oracle分析函数-nulls first/nulls last
- mysql字符型数字 按大小排序,类似if判断函数
- pom报错如何解决(org.apache.maven.archiver.mavenarchiver.getmanifest)
- DIY一套10倍\20倍\30倍光学变焦高清航拍方案(变焦云台相机方案)
- 装饰博客全攻略(如何在博客首页或博客中插入图片、音乐、视频等)