分布式配置示例(c++)

概述

    客户端应用的配置通通来自服务端统一管理,此示例是为演示使用c++ sdk如何查询到服务端(即cppcloud_serv)的配置,这也是我们分布式应用启动初始化时一般需要得到的参数,避免每个应用各自维护自己配置文件带来的不同步和批量修改难的问题。

示例源文件cpp_sdk/sample_conf.cpp
编译命令g++ -Wall -g -std=c++11 sample_conf.cpp -o sample_conf ../common/libhocomm.so libsdk_cppcloud.so 或者 make sample_conf
示例准备:先运行服务端cppcloud_serv,且有配置文件在conf目录,作者上传代码时自带了几个json配置文件在里面(_meta.json test1.json等)。

配置文件说明

test1.json

{
    "key2": "value2 @ key2",
    "hello": "world",
    "project": "cppcloud",
    "author": "hejl",
    "keymap": {
        "subkey": 123,
        "subkey2": [
            456, "val22", "val33"
        ],
        "subkey3": {
            "subsubkey1": "subsubval1",
            "subsubkey2": "subsubval2",
            "subsubkey3": 3
        }
    }
}

test2.json

{
    "keyTest2": "valTest2",
    "author": "valueho in test2.json",
    "date": [
        "20190114","20190115","20190116"
    ],
    "desc": "cppcloud-configure test file"
}

示例代码

    如下给出的是关键语句伪代码。

#include "client_c.hpp" // (1)cpp-sdk的主头文件

static const string appName = "TestConf";
static const string testConfKey = "/author";
static const string testConfKey2 = "test2.json/keyTest2";

int main( int argc, char* argv[] )
{
    string serv = argv[1]; // 命令行参数传入 "192.168.1.10:4800"这样
    string oval;
    int ret = client_c::Init(appName, serv); // (2) sdk初始化

    client_c::LoadConfFile("test1.json test2.json"); // (3) 加载需要用到的配置文件名

    ret = client_c::Query(oval, testConfKey, true);
    printf("Queue: %s => %s\n", testConfKey.c_str(), oval.c_str());

    ret = client_c::Run(true); // 进入sdk运行体
    string line;
    printf("input query-key to get value (or 'q' to exit demo):\n");
    while (getline(std::cin, line)) // (5)测试运行时改变配置,app能实时得知变化
    {
        if (line == "q") break; // exit handle

        ret = client_c::Query(oval, line, true);
        printf("Query [%s] => %s (%d)\n", line.c_str(), oval.c_str(), ret);
        printf("input query-key to get value (or 'q' to exit demo):\n");
    }

    client_c::Destroy();
    return 0;
}

代码解释

  1. include "client_c.hpp" //cpp-sdk主头文件,所有的方法说明可以参考里面的注释。
  2. client_c::Init() sdk库的初始化,传入appname和serv地址,成功返回0; 和client_c::Destroy()销毁方法相对应。
  3. client_c::LoadConfFile() 加载需要用到的配置文件名,空格分隔;返回0代表成功,此处用test1.json、test2.json两个测试配置。
  4. client_c::Query()是主要的查询方法,此方法第1个参数有多个重载版本,本例使用字符串输出,即查询结果输出到oval变量;第2个参数传入查询样式键
  5. 用终端输入要查询的样式键字符串,标准输出打印结果;中途可通过web界面修改配置文件,验证本示例可以同步获取到最新修改值。

说明:

查询样式键: 以文件名开头(主配置可省略文件名),各级json键用斜线分隔。
例如,上面test1.json里,
查询样式键="test1.json/keymap/subkey"的查询结果值是123
查询样式键="test1.json/keymap/subkey2/1"的查询结果值是"val22"

启动运行

docker方式:

docker exec -it <container> sample_conf [servip:port]
必须已启动了CppCloudo容器,是容器id或name,最后的[servip:port]不写默认连接localhost:4800;

手动方式:

前提是c++ sdk库(libsdk_cppcloud.so libhocomm.so)已正常编译过了
cd cpp_sdk;
make sample_conf;
./sample_conf localhost:4800

演示结果

结果图