feat: 新增 C++ 和 Rust 客户端 SDK 及 Docker 构建支持
- 新增 kenaito-conf-cpp-client / kenaito-conf-rust-client 及对应 demo - 新增 Dockerfile.cpp / Dockerfile.rust - README 目录结构补充 C++/Rust 客户端 - README_DOCKERFILE 补充 Windows docker run 命令,新增 C++/Rust 段落
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
project(kenaito-conf-cpp-client-demo LANGUAGES CXX)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# 引入客户端库
|
||||
add_subdirectory(../kenaito-conf-cpp-client ${CMAKE_BINARY_DIR}/kenaito-conf-cpp-client)
|
||||
|
||||
add_executable(demo main.cpp)
|
||||
|
||||
target_link_libraries(demo PRIVATE kenaito_conf_client)
|
||||
@@ -0,0 +1,90 @@
|
||||
#include <kenaito_conf/client.h>
|
||||
#include <iostream>
|
||||
#include <cstdlib>
|
||||
#include <csignal>
|
||||
#include <thread>
|
||||
#include <chrono>
|
||||
#include <map>
|
||||
|
||||
static kenaito::Client* g_client = nullptr;
|
||||
|
||||
static void signal_handler(int) {
|
||||
std::cout << "\nShutting down..." << std::endl;
|
||||
if (g_client) g_client->stop();
|
||||
}
|
||||
|
||||
static std::string get_env(const char* key, const std::string& default_val) {
|
||||
const char* val = std::getenv(key);
|
||||
return (val && val[0] != '\0') ? val : default_val;
|
||||
}
|
||||
|
||||
static int get_env_int(const char* key, int default_val) {
|
||||
const char* val = std::getenv(key);
|
||||
if (val && val[0] != '\0') {
|
||||
try { return std::stoi(val); } catch (...) {}
|
||||
}
|
||||
return default_val;
|
||||
}
|
||||
|
||||
int main() {
|
||||
std::map<std::string, std::string> config_values = {
|
||||
{"database.host", "192.168.1.1"},
|
||||
{"database.port", "8888"},
|
||||
{"database.name", "xxxx"},
|
||||
{"database.user", "xxxx"},
|
||||
{"database.password", "xxxxxxxx"},
|
||||
};
|
||||
|
||||
kenaito::Config config;
|
||||
config.base_url = get_env("KENAITO_BASE_URL", "http://localhost:8080");
|
||||
config.app_name = get_env("KENAITO_APP_NAME", "kenaito-springboot-demo");
|
||||
config.env = get_env("KENAITO_ENV", "daily");
|
||||
config.version = get_env("KENAITO_VERSION", "latest");
|
||||
config.token = get_env("KENAITO_TOKEN", "");
|
||||
config.sync_interval = get_env_int("KENAITO_SYNC_INTERVAL", 10);
|
||||
config.cache_dir = get_env("KENAITO_CACHE_DIR", ".");
|
||||
|
||||
kenaito::Client client(config);
|
||||
g_client = &client;
|
||||
|
||||
client.on_change([&config_values](const std::map<std::string, std::string>& changed) {
|
||||
std::cout << "Config changed:" << std::endl;
|
||||
for (const auto& kv : changed) {
|
||||
std::cout << " " << kv.first << " = " << kv.second << std::endl;
|
||||
auto it = config_values.find(kv.first);
|
||||
if (it != config_values.end()) {
|
||||
it->second = kv.second;
|
||||
std::cout << " [updated] " << kv.first << " = " << kv.second << std::endl;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (!client.start()) {
|
||||
std::cerr << "Failed to init config client, using local defaults" << std::endl;
|
||||
}
|
||||
|
||||
auto remote = client.get_all();
|
||||
for (auto& kv : config_values) {
|
||||
auto it = remote.find(kv.first);
|
||||
if (it != remote.end()) {
|
||||
kv.second = it->second;
|
||||
}
|
||||
}
|
||||
std::cout << "loaded " << remote.size() << " configs from remote" << std::endl;
|
||||
|
||||
std::cout << "\nCurrent configs:" << std::endl;
|
||||
for (const auto& kv : config_values) {
|
||||
std::cout << " " << kv.first << " = " << kv.second << std::endl;
|
||||
}
|
||||
|
||||
std::cout << "\nListening for config changes... (press Ctrl+C to stop)" << std::endl;
|
||||
|
||||
std::signal(SIGINT, signal_handler);
|
||||
|
||||
while (true) {
|
||||
client.sync_once();
|
||||
std::this_thread::sleep_for(std::chrono::seconds(config.sync_interval));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user