etcd-cpp-apiv3使用示例介绍

Posted 絮雨清风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了etcd-cpp-apiv3使用示例介绍相关的知识,希望对你有一定的参考价值。

  最近分布式项目开发中用到订阅/通知机制,经过选型决定采用etcd,在调研etcd使用方式、订阅/通知方案过程中遇到很多问题,这里做下简单记录。

本系列总共3篇:

  1. 《搭建etcd集群》:介绍搭建etcd集群方式、遇到的问题及处理方式;
  2. 《编译安装etcd-cpp-apiv3》:介绍etcd-cpp-apiv3编译安装方式、常见问题及处理方式;
  3. 《etcd-cpp-apiv3使用实例介绍》:介绍如何通过etcd-cpp-apiv3建立与etcd集群的连接,订阅etcd消息。

 本文是第3篇 《etcd-cpp-apiv3使用示例介绍》

参考1:https://github.com/etcd-cpp-apiv3/etcd-cpp-apiv3
参考2:https://www.cnblogs.com/king-howe/p/14133876.html


1. 环境信息

节点信息etcd-cpp-apiv3节点etcd集群节点1etcd集群节点2etcd集群节点3
IP地址192.168.61.134192.168.61.135192.168.61.136192.168.61.137
hostnameCBFS1CBFS2CBFS3CBFS4

  经过前两篇介绍,搭建完成了etcd集群,安装了etcd-cpp-apiv3库,环境信息如上表所示。本文主要介绍应用程序如何通过调用etcd-cpp-apiv3库所提供的方法,建立与etcd集群的通信,动态获取etcd集群的变化。

2. 示例1:周期读取Key:Value

#include <etcd/Client.hpp>
#include <etcd/Response.hpp>
#include <string>
#include <iostream>

std::string str_url = "http://192.168.61.135:2379, http://192.168.61.136:2379, http://192.168.61.137:2379";
std::string str_key = "/key1";

int main() 
    etcd::Client etcd(str_url);
    while (1) 
        etcd::Response response = etcd.get(str_key).get();
        std::cout << str_key << " :" << response.value().as_string()<<"\\n";
        sleep(3);
    
    return 0;

  编译命令:

[root@cbfs1 test]# g++ t.cpp -g -o t -std=c++11 -lpthread -letcd-cpp-api -lprotobuf -lgrpc++ -lgrpc -lz -lcpprest -lssl -lcrypto -lboost_system -I/usr/local/include/etcd/proto/

  执行结果:


3. 示例2:Watch Key_Value

#include <etcd/Watcher.hpp>
#include <string>
#include <iostream>

std::string str_url = "http://192.168.61.135:2379, http://192.168.61.136:2379, http://192.168.61.137:2379";
std::string str_key = "/key1";

void watcher_cb(etcd::Response const & resp) 
    if (resp.error_code()) 
        //error
        std::cout<<"watcher_cb error_code:"<<resp.error_code()<<" and error";
        std::cout <<" msg:"<<resp.error_message()<<std::endl;
     else 
        //success
        if(resp.action() == "set") 
            std::cout<<"set value:"<<resp.value().as_string() <<"\\n";
         else if(resp.action() == "delete") 
            std::cout<<"set value:"<<resp.value().as_string() <<"\\n";
        
    


int main() 
    etcd::Watcher watcher(str_url,str_key,watcher_cb,true);
    getchar();
    watcher.Cancel();
    return 0;

  编译命令:

[root@cbfs1 test]# g++ main.cpp -g -o main &#8195;&#8195;rypto -lboost_system -I/usr/local/include/etcd/proto/

效果:


4. 常见问题处理

4.1 error while loading shared libraries: libetcd-cpp-api.so:

  参考:https://blog.csdn.net/caobo_0512/article/details/87702950

  问题原因:ld找不到libetcd-cpp-api.so库文件。而该库文件位于/usr/local/lib/libetcd-cpp-api.so

  链接器ld默认的目录是/lib和/usr/lib,如果放在其他路径也可以,需要让ld知道库文件在哪里。
  解决方式:在/etc/ld.so.conf.d/目录下新建文件usr-libs.conf,将/usr/local/lib添加其中,运行ldconfig


以上是关于etcd-cpp-apiv3使用示例介绍的主要内容,如果未能解决你的问题,请参考以下文章

编译etcd-cpp-apiv3

编译etcd-cpp-apiv3

搭建etcd集群

搭建etcd集群

《C#零基础入门之百识百例》(七十一)委托介绍 -- 战士升级示例

Spring Boot文件上传示例(Ajax和REST)