前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >TARS配置解析源码分析

TARS配置解析源码分析

原创
作者头像
用户1141344
修改2019-02-21 17:24:56
1.7K0
修改2019-02-21 17:24:56
举报
文章被收录于专栏:linux QOS

一、基础介绍

基于Tars框架运行的程序,必须通过--config在命令行指定一个配置文件,Tars配置文件解析分为两步:

1、通过TC_Option解析命令行--config参数,并把配置文件路径保存到ServerConfig::ConfigFile静态变量中。

2、通过TC_Config和TC_ConfigDomain解析配置文件的详细配置信息。

二、相关类

字段解释:

ServerConfig::ConfigFile:static类变量,保存配置文件的路径

TC_Option::_mParam:保存程序执行时命令行--name=value形式的参数,存放对应的name和value

TC_Option::_vSingle:保存命令行普通参数

例如./server -o -t --config=xxx.config  --name=value,则对命令行解析后的TC_Option中,_vSingle的值为["-o", "-t"],_mParam中包含两个key-value键值对分别为{"config":"xxx.config", "name":"value"}

Application::_conf:保存Application类的配置信息,基于Tars框架的server继承Application后可以通过_conf来获取自己的配置

TC_Config::_root:用于保存配置信息的root domain(domain解释参考下文)

TC_ConfigDomain::_name:域名字,即写在<>中的名字。

TC_ConfigDomain::_param:配置项的名字和值,类似TC_Option中的_mParam成员变量,对于配置文件中重复的键值对配置项,写在前面的不生效。

TC_ConfigDomain::_key:配置项插入的顺序,对于重复的配置项,解析时会把先前的重复项删除,并发当前项push到_key的末尾。

TC_ConfigDomain::_subdomain:子域,同一个域下相同名字的重复子域,配置项会进行合并。

TC_ConfigDomain::_domain:域的插入顺序,同一个域下相同名字的子域,插入顺序并不会更新

TC_ConfigDomain::_line:整行的配置列表

三、一个简单的配置文件解析示例

一个简单的配置文件示例如下:

代码语言:javascript
复制
<tars>
  ptest0
  ptest01=pvalue01
  ptest02=pvalue02
  ptest01=pvalue03
  ptest0
  
  <test>
    name01=value01
  </test>
  <application>
    #proxy需要的配置
    <client>
    locator=tars.tarsregistry.QueryObj@tcp -h registry.tars.com -p 17890
    </client>
            
    #定义所有绑定的IP
    <server>
      app=apptest
      server=httpserver
      <ServerAdapter>
        endpoint=tcp -h 127.0.0.1 -p 19586 -t 60000
        allow
        threads=5
        servant=apptest.httpserver.HttpObj
      </ServerAdapter>
    </server>          
  </application>
  
  <test>
    name02=value02
  </test>
  <allow>
    A = B
    127.0.0.1
    192.168.1.1
    4.5.6.6
  </allow>  
</tars>

domain(域):以<xxx>***</xxx>组成的配置项称为一个domain。例如上面配置文件示例中tars为一个domain,tars下有三个个子域,分别为application和allow和test子域,其中两个同名的test子域下面的配置项会合并成一个test子域,application下面又包含了两个子域分别为client和server,server下包含了一个子域,名字为ServerAdapter。

对上述示例文件加载并解析后,查看Application::_conf以及tars和test域情况如下:

代码语言:javascript
复制
(gdb) p _conf
$9 = {
  _root = {
    _name = "", 
    _param = std::map with 0 elements, 
    _key = std::vector of length 0, capacity 0, 
    _subdomain = std::map with 1 elements = {
      ["tars"] = 0x7431d0
    }, 
    _domain = std::vector of length 1, capacity 1 = {"tars"}, 
    _line = std::vector of length 0, capacity 0
  }
}
(gdb) p {TC_ConfigDomain}0x7431d0
$10 = {
  _name = "tars", 
  _param = std::map with 3 elements = {
    ["ptest0"] = "",
    ["ptest01"] = "pvalue03",
    ["ptest02"] = "pvalue02"
  }, 
  _key = std::vector of length 3, capacity 4 = {"ptest02", "ptest01", "ptest0"}, 
  _subdomain = std::map with 3 elements = {
    ["allow"] = 0x744ac0,
    ["application"] = 0x743b60,
    ["test"] = 0x743a60
  }, 
  _domain = std::vector of length 3, capacity 4 = {"test", "application", "allow"}, 
  _line = std::vector of length 5, capacity 8 = {"ptest0", "ptest01=pvalue01", "ptest02=pvalue02", "ptest01=pvalue03", "ptest0"}
}
(gdb) p {TC_ConfigDomain}0x743a60
$11 = {
  _name = "test", 
  _param = std::map with 2 elements = {
    ["name01"] = "value01",
    ["name02"] = "value02"
  }, 
  _key = std::vector of length 2, capacity 2 = {"name01", "name02"}, 
  _subdomain = std::map with 0 elements, 
  _domain = std::vector of length 0, capacity 0, 
  _line = std::vector of length 2, capacity 2 = {"name01=value01", "name02=value02"}
}

四、配置寻址方式

通过 string TC_Config::get(const string &sName, const string &sDefault) 函数可以获取到具体的配置项信息,对于型如/Main/Domain<Param>的sName入参,可以获取域/Main/Domain下的配置项名字为Param的值

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、基础介绍
  • 二、相关类
  • 三、一个简单的配置文件解析示例
  • 四、配置寻址方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档