feat(c-client): 实现完整的 C 客户端 SDK

核心功能:
- JSON 解析:使用 cJSON 解析服务端返回的配置
- 配置缓存:自动保存到本地 .kenaito-config-cache.json 文件
- 定时同步:后台线程定时拉取配置变更(默认 10 秒)
- 配置变更回调:配置变更时自动触发回调函数
- 全量/增量拉取:首次全量拉取,后续通过 lastTime 增量拉取
- 优雅退出:支持信号处理,Ctrl+C 优雅关闭

API:
- config_client_init() - 初始化客户端
- config_client_start() - 启动客户端(全量拉取 + 后台同步)
- config_client_get() - 获取配置值
- config_client_stop() - 停止客户端并保存缓存

依赖:
- libcurl(HTTP 请求)
- cJSON(JSON 解析)
- pthread(后台同步线程)

编译:
- SDK: gcc -c main.c -o kenaito_conf.o -lcurl -lcjson
- Demo: gcc -o demo main.c ../kenaito-conf-c-client/main.c -lcurl -lcjson -lpthread
This commit is contained in:
2026-04-15 21:02:16 +08:00
parent 102c62b64b
commit 7bf1dff3ce
3 changed files with 531 additions and 78 deletions
+54 -12
View File
@@ -22,22 +22,66 @@ yum install libcurl-devel
## 快速开始
### 1. 编译示例
### 1. 安装依赖
#### Ubuntu/Debian
```bash
apt-get install libcurl4-openssl-dev libcjson-dev
```
#### CentOS/RHEL
```bash
yum install libcurl-devel libcjson-devel
```
#### macOS
```bash
brew install cJSON
```
> **macOS**:系统自带 libcurl,无需额外安装。
### 2. 编译 SDK
```bash
cd kenaito-conf-c-client
gcc -c main.c -o kenaito_conf.o -lcurl -lcjson
ar rcs libkenaito_conf.a kenaito_conf.o
```
### 3. 编译 Demo
```bash
cd kenaito-conf-c-client-demo
gcc -o demo ../kenaito-conf-c-client/main.c -lcurl
gcc -o demo main.c ../kenaito-conf-c-client/main.c -lcurl -lcjson -lpthread
./demo
```
### 2. 使用示例
### 4. 使用 SDK
在你的项目中:
```c
#include "kenaito-conf-c-client/main.c"
// 或者链接静态库
// gcc -o myapp myapp.c -lkenaito_conf -lcurl -lcjson -lpthread
```
### 5. 完整示例
```c
#include <stdio.h>
#include "main.c"
#include "../kenaito-conf-c-client/main.c"
void on_change(const char *key, const char *value) {
printf("config changed: %s = %s\n", key, value);
}
int main() {
// 配置客户端参数
Config config = {
.baseUrl = "http://localhost:8080",
.appName = "my-app",
@@ -51,15 +95,10 @@ int main() {
ConfigClient client;
config_client_init(&client, &config);
// 注册配置变更回调
client.onChange = [](const char *key, const char *value) {
printf("config changed: %s = %s\n", key, value);
};
client.onChange = on_change;
// 启动客户端(拉取全量配置 + 开启定时同步)
// 注:当前版本为简化实现,仅演示单次拉取
// 完整版本需实现定时轮询和长轮询机制
config_client_start(&client);
// 获取配置
const char *dbHost = config_client_get(&client, "database.host");
@@ -68,6 +107,9 @@ int main() {
printf("database.host = %s\n", dbHost ? dbHost : "not found");
printf("database.port = %s\n", dbPort ? dbPort : "not found");
// 等待配置变更
sleep(30);
// 停止客户端
config_client_stop(&client);
return 0;