TarsGo 服务获取自定义模版(配置)值

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 日

发布平台:云+社区

2020年3月10日,Linux基金会正式宣布旗下的TARS开源项目将成立TARS基金会。TARS基金会是一个专注于微服...

16 声望
7 粉丝
0 条评论
推荐阅读
DCache 分布式存储系统|Set, ZSet 缓存模块的创建与使用
导语 | 在之前的系列文章中,我们介绍了 DCache 及其 KV, K-K-Row 和 List 缓存模块的使用,本文将继续介绍如何使用 DCache 中的集合类型缓存模块 —— Set 和 ZSet 缓存模块。

TARS基金会1阅读 1.8k

花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。

民工哥14阅读 1.9k

封面图
golang学习之旅——解开心中的go mod疑惑
在go1.16版本发布后,go module由原来的默认值 auto 变为 on 了,这意味着后续开发中,go更推荐用go module 模式开发,而不是gopath模式开发了。

Keson11阅读 14.8k

终于卷完了!Redis 打怪升级进阶成神之路(2023 最新版)!
是一种非关系型数据库服务,它能解决常规数据库的并发能力,比如传统的数据库的IO与性能的瓶颈,同样它是关系型数据库的一个补充,有着比较好的高效率与高性能。专注于key-value查询的redis、memcached、ttserver。

民工哥9阅读 810

封面图
算法可视化:一文弄懂 10 大排序算法
在本文中,我们将通过动图可视化加文字的形式,循序渐进全面介绍不同类型的算法及其用途(包括原理、优缺点及使用场景)并提供 Python 和 JavaScript 两种语言的示例代码。除此之外,每个算法都会附有一些技术说...

破晓L7阅读 906

封面图
硬卷完了!MongoDB 打怪升级进阶成神之路( 2023 最新版 )!
前面我们学习:MySQL 打怪升级进阶成神之路、Redis 打怪升级进阶成神之路,然后我们还在继续 NoSQL 的卷王之路。从第一篇文章开始,我们逐步详细介绍了 MogoDB 基础概念、安装和最基本的CURD操作、索引和聚合、工...

民工哥6阅读 450

封面图
「刷起来」Go必看的进阶面试题详解
逃逸分析是Go语言中的一项重要优化技术,可以帮助程序减少内存分配和垃圾回收的开销,从而提高程序的性能。下面是一道涉及逃逸分析的面试题及其详解。

王中阳Go4阅读 1.9k评论 1

封面图

2020年3月10日,Linux基金会正式宣布旗下的TARS开源项目将成立TARS基金会。TARS基金会是一个专注于微服...

16 声望
7 粉丝
宣传栏