基于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:整行的配置列表
一个简单的配置文件示例如下:
<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域情况如下:
(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 删除。