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...
}

说明如下:

  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 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() 函数,都可以传入三个参数:

  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

腾讯 Tars-Go 服务获取自定义模版(配置)值相关推荐

  1. @Value注解获取不到配置值

    1. 写在前面 碰到过三种情况导致@Value获取不到配置值 变量被关键字static修饰 类没有使用@Component及其衍生标签修饰 在Bean初始化时构造方法中引用被@Value修饰的变量 如 ...

  2. Spring中@Value注解获取不到配置值

    @Value注解必须要在spring的bean中才能使用,不能自己new一个对象调用 产生原因: 在SpringBoot中使用@Value只能给普通变量赋值,不能给静态变量赋值 解决方法: 给静态变量 ...

  3. 微信公众账号服务号自定义菜单配置与实现

    微信自定义菜单 实现其实非常简单.只不过很多人不知道怎么写代码 怎么去做. 下面po上我的实现方法,以备后用. 1.拿到access_token <?php /*** get access to ...

  4. idea注释模版配置(吐血推荐!!!)

    idea注释模版配置 idea作为越来越多程序员使用的开发工具,平时的代码注释也非常的关键,下面介绍一下类上注释和方法上注释,方便大家的开发配置,同时也为自己以后配置留一份记录(毕竟每次换环境都需要重 ...

  5. uni-app开发微信小程使用腾讯位置服务获取用户的位置信息

    uni-app开发微信小程使用腾讯位置服务获取用户的位置信息 一.开通腾讯位置服务 二.编码实现 (一)获取定位坐标 (二).在项目中使用 一.开通腾讯位置服务 在这里我们先要登录腾讯我i之服务的官网 ...

  6. 微信小程序调用腾讯位置服务获取城市列表

    微信小程序调用腾讯位置服务获取城市列表 注意前期的准备: 1.需要用到微信小程序JavaScript SDK https://lbs.qq.com/miniProgram/jsSdk/jsSdkGui ...

  7. 腾讯Tars框架剖析(一)---Tars框架原理及架构

    文章目录 Tars是什么? Tars能干什么? Tars包含了什么? Tars的设计思想是什么? Tars的架构是怎样的? 底层的协议层 上层的服务层 介绍 组成 服务节点: 公共框架结点 Mysql ...

  8. 腾讯 tars java_腾讯 Tars 基础框架手动搭建——填掉官方 Guide 的坑

    背景 Tars 简介 腾讯 Tars 是腾讯内部使用的 TAF(Tencent Application Framework)的对外开源版,去掉了许多冗杂多余的部分.该框架集开发.运维.微服务.RPC ...

  9. 腾讯 Tars 基础框架手动搭建——填掉官方 Guide 的坑

    背景 Tars 简介 腾讯 Tars 是腾讯内部使用的 TAF(Tencent Application Framework)的对外开源版,去掉了许多冗杂多余的部分.该框架集开发.运维.微服务.RPC ...

最新文章

  1. 2022-2028年中国电梯行业市场调查及前瞻分析报告
  2. 【matlab】第二次上机课
  3. 民生银行IT运维架构管理可视化实践
  4. php单表显示动态下拉框,PHP:使用optgroup动态下拉列表
  5. 内存泄漏了,咋回事?
  6. cocos2d-x初探学习笔记(21)--精灵类
  7. dbinfo.properties mysql_java 8.0Mysql 助手类
  8. 单片机外围模块漫谈之二,如何提高ADC转换精度
  9. 【matlab】找出数组中符合条件的数并赋值
  10. 麦克纳姆轮全向移动机器人运动学模型应用
  11. access集团和abm_abm展示硬核实力,ACCESS集团携8大国际品牌在进博会首秀!
  12. USB SERVER网络远程管理U盾
  13. smobiler中实现页面切换_使用Smobiler实现类似美团的界面
  14. 肖申克的救赎【观影记录及经典台词摘录】
  15. 第一次马拉松(2013上海国际马拉松赛)
  16. SolidWorks-旋转凸台的使用
  17. auto.js 基于控件的操作
  18. 第一个用计算机编舞的人,多媒体平台·虚拟人·数字舞蹈
  19. k8s.gcr.io的镜像无法下载的问题
  20. 上板子在线抓波发现app_rdy一直为低

热门文章

  1. linux sshd自动登录,SSH自动登录的几种方法
  2. 嘉兴市计算机技工学校,嘉兴市高级技工学校2021年招生简章
  3. 理解JavaScript的宏微任务
  4. mysql报表慢_mysql慢查询日志报表工具mysqlsla
  5. postman请求参数区别
  6. Oracle分析函数-nulls first/nulls last
  7. mysql字符型数字 按大小排序,类似if判断函数
  8. pom报错如何解决(org.apache.maven.archiver.mavenarchiver.getmanifest)
  9. DIY一套10倍\20倍\30倍光学变焦高清航拍方案(变焦云台相机方案)
  10. 装饰博客全攻略(如何在博客首页或博客中插入图片、音乐、视频等)