etcd-cpp-apiv3使用示例介绍
Posted 絮雨清风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了etcd-cpp-apiv3使用示例介绍相关的知识,希望对你有一定的参考价值。
最近分布式项目开发中用到订阅/通知机制,经过选型决定采用etcd,在调研etcd使用方式、订阅/通知方案过程中遇到很多问题,这里做下简单记录。
本系列总共3篇:
- 《搭建etcd集群》:介绍搭建etcd集群方式、遇到的问题及处理方式;
- 《编译安装etcd-cpp-apiv3》:介绍etcd-cpp-apiv3编译安装方式、常见问题及处理方式;
- 《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集群节点1 | etcd集群节点2 | etcd集群节点3 |
---|---|---|---|---|
IP地址 | 192.168.61.134 | 192.168.61.135 | 192.168.61.136 | 192.168.61.137 |
hostname | CBFS1 | CBFS2 | CBFS3 | CBFS4 |
经过前两篇介绍,搭建完成了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   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使用示例介绍的主要内容,如果未能解决你的问题,请参考以下文章