Nacos and its C++ SDK

Posted on Sat 29 March 2025 in Journal

Abstract Nacos and its C++ SDK
Authors Walter Fan
 Category    learning note  
Status v1.0
Updated 2025-03-29
License CC-BY-NC-ND 4.0

2025-03-29

Nacos 简介与使用指南

什么是 Nacos

Nacos(全称:Dynamic Naming and Configuration Service)是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 的主要功能包括:

  1. 服务发现与服务健康监测:动态注册和发现服务实例,以及对服务实例健康状态的检测
  2. 动态配置管理:集中管理配置,实时推送配置变更
  3. 动态 DNS 服务:提供权重路由等功能
  4. 服务及其元数据管理:管理服务的静态元数据

如何使用 Nacos

1. 安装与启动 Nacos 服务器

下载与安装

# 下载最新稳定版
wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz
# 解压
tar -xvf nacos-server-2.2.0.tar.gz
cd nacos

启动服务

# 单机模式启动
sh startup.sh -m standalone

或者

git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker
 docker-compose -f example/standalone-derby.yaml up -d

2. 访问管理控制台

启动成功后,可以通过浏览器访问 Nacos 控制台:

http://localhost:8848/nacos

默认用户名和密码均为:nacos

3. 基本操作

配置管理: - 在控制台可以创建配置命名空间 - 添加、修改和删除配置项 - 导入导出配置

服务管理: - 注册服务实例 - 查询服务实例 - 设置服务健康状态

使用 Nacos C++ SDK

Nacos 提供了 C++ SDK 用于与 Nacos 服务器进行通信。下面是如何使用 Nacos C++ SDK 与 Nacos 服务器通信并管理配置的基本步骤。

1. 安装 Nacos C++ SDK

首先,需要安装 Nacos C++ SDK:

git clone https://github.com/nacos-group/nacos-sdk-cpp.git
cd nacos-sdk-cpp

# 创建构建目录
mkdir build
cd build

# 配置并构建SDK
cmake ..
make
make install

2. 初始化 Nacos 客户端

下面是使用 C++ SDK 初始化 Nacos 客户端的示例:

//nacos_test_1.cpp
#include <iostream>
#include "Nacos.h"

using namespace std;
using namespace nacos;

int main() {
    Properties props;
    props[PropertyKeyConst::SERVER_ADDR] = "10.100.212.8:8848";//Server address
    INacosServiceFactory *factory = NacosFactoryFactory::getNacosFactory(props);
    ResourceGuard <INacosServiceFactory> _guardFactory(factory);
    ConfigService *n = factory->CreateConfigService();
    ResourceGuard <ConfigService> _serviceFactory(n);
    NacosString ss = "";
    try {
        ss = n->getConfig("k", NULLSTR, 1000);
    }
    catch (NacosException &e) {
        cout <<
             "Request failed with curl code:" << e.errorcode() << endl <<
             "Reason:" << e.what() << endl;
        return -1;
    }
    cout << ss << endl;

    return 0;
}

编译步骤:

g++ -I/usr/local/include/nacos/ test/nacos_test_1.cpp -lcurl -lz -L. -lnacos-cli-static -o nacos_test_1

3. 获取配置

// 获取配置
try {
    // 参数:dataId, group
    std::string content = configService->getConfig("example", "DEFAULT_GROUP", 5000);
    std::cout << "获取配置成功,内容:" << content << std::endl;
} catch (NacosException &e) {
    std::cout << "获取配置失败,异常:" << e.what() << std::endl;
}

4. 发布配置

// 发布配置
try {
    // 参数:dataId, group, content
    bool isPublishOk = configService->publishConfig("example", "DEFAULT_GROUP", "config content");
    if (isPublishOk) {
        std::cout << "发布配置成功" << std::endl;
    } else {
        std::cout << "发布配置失败" << std::endl;
    }
} catch (NacosException &e) {
    std::cout << "发布配置异常:" << e.what() << std::endl;
}

5. 删除配置

// 删除配置
try {
    // 参数:dataId, group
    bool isRemoveOk = configService->removeConfig("example", "DEFAULT_GROUP");
    if (isRemoveOk) {
        std::cout << "删除配置成功" << std::endl;
    } else {
        std::cout << "删除配置失败" << std::endl;
    }
} catch (NacosException &e) {
    std::cout << "删除配置异常:" << e.what() << std::endl;
}

6. 监听配置变化

// 定义监听器类
class MyConfigListener : public Listener {
public:
    void receiveConfigInfo(const NacosString &configInfo) {
        std::cout << "收到配置变更通知:" << configInfo << std::endl;
    }
};

// 添加监听器
MyConfigListener *listener = new MyConfigListener();
try {
    configService->addListener("example", "DEFAULT_GROUP", listener);
    std::cout << "添加配置监听器成功" << std::endl;
} catch (NacosException &e) {
    std::cout << "添加配置监听器失败,异常:" << e.what() << std::endl;
}

// ... 程序运行一段时间后 ...

// 移除监听器
configService->removeListener("example", "DEFAULT_GROUP", listener);
delete listener;

7. 完整示例

下面是一个完整的使用 Nacos C++ SDK 进行配置管理的示例:

#include <iostream>
#include <string>
#include <unistd.h> // for sleep()
#include "Nacos.h"


using namespace std;
using namespace nacos;

// 定义配置变更监听器
class MyConfigListener : public Listener {
public:
    void receiveConfigInfo(const NacosString &configInfo) {
        cout << "收到配置变更通知:" << configInfo << endl;
    }
};

int main() {
    // 初始化属性
    Properties props;
    props[PropertyKeyConst::SERVER_ADDR] = "10.100.212.8:8848";
    props[PropertyKeyConst::NAMESPACE] = "public";

    INacosServiceFactory *factory = NacosFactoryFactory::getNacosFactory(props);
    ResourceGuard <INacosServiceFactory> _guardFactory(factory);

    // 创建配置服务
    ConfigService *configService = NULL;
    try {
        configService = factory->CreateConfigService();
        cout << "初始化 Nacos 配置服务成功" << endl;
    } catch (NacosException &e) {
        cout << "初始化 Nacos 配置服务失败,异常:" << e.what() << endl;
        return -1;
    }

    // 定义配置ID和组
    string dataId = "example";
    string group = "DEFAULT_GROUP";

    // 发布配置
    try {
        string content = "initial config content";
        bool isPublishOk = configService->publishConfig(dataId, group, content);
        cout << "发布配置" << (isPublishOk ? "成功" : "失败") << endl;
    } catch (NacosException &e) {
        cout << "发布配置异常:" << e.what() << endl;
    }

    // 获取配置
    try {
        string content = configService->getConfig(dataId, group, 5000);
        cout << "获取配置成功,内容:" << content << endl;
    } catch (NacosException &e) {
        cout << "获取配置失败,异常:" << e.what() << endl;
    }

    // 添加配置监听
    MyConfigListener *listener = new MyConfigListener();
    try {
        configService->addListener(dataId, group, listener);
        cout << "添加配置监听器成功" << endl;

        // 修改配置触发监听
        sleep(1); // 等待一秒
        configService->publishConfig(dataId, group, "updated config content");

        // 等待接收配置变更
        sleep(5);
    } catch (NacosException &e) {
        cout << "配置监听异常:" << e.what() << endl;
    }

    // 移除监听器并删除配置
    configService->removeListener(dataId, group, listener);
    delete listener;

    try {
        bool isRemoved = configService->removeConfig(dataId, group);
        cout << "删除配置" << (isRemoved ? "成功" : "失败") << endl;
    } catch (NacosException &e) {
        cout << "删除配置异常:" << e.what() << endl;
    }

    // 释放资源
    delete configService;
    return 0;
}

编译步骤

g++ -I/usr/local/include/nacos/ test/nacos_test_2.cpp -lcurl -lz -L. -lnacos-cli-static -o nacos_test_2

总结

Nacos 是一个强大的服务发现和配置管理平台,通过 C++ SDK,您可以轻松地将 Nacos 集成到 C++ 应用程序中。使用 Nacos C++ SDK,您可以执行以下操作:

  1. 获取、发布和删除配置
  2. 监听配置变更
  3. 服务注册与发现

在实际应用中,Nacos 可以帮助您实现配置的集中管理和动态更新,简化分布式系统的配置管理复杂度。


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。