文章目录
使用etcd v3接口
本文主要提供一种C++访问etcd v3的方式,主要思路如下:
包中带上etcdctl命令,然后在代码中使用popen执行命令行,如:etcdctl get foo 来获取foo的值
// 使用方式举例:ExecuteShellCmd(“./etcdctl get foo”“, true, reply);
bool ExecuteShellCmd(const std::string cmd, bool needResult, std::string &result)
{
FILE *fp = NULL;
fp = popen(cmd.c_str(),"re");
if(fp == NULL)
{
printf("[ExecuteShellCmd]Execute failed,cmd:%s,needResult:%d",cmd.c_str(),needResult);
return false;
}
if (needResult)
{
int bufLen = 5*1024*1024;
char *buf = new char[bufLen];
fread(buf, bufLen, 1, fp);
result = buf;
delete[] buf;
}
printf("[ExecuteShellCmd]cmd:%s,needResult:%d,result:%s",cmd.c_str(),needResult,result.c_str());
pclose(fp);
}
watch的实现方式类似,具体代码如下:
FILE *fp = NULL;
char command[128];
char watchKey[512];
char *buf = new char[5*1024*1024];
std::stringstream ss;
ss<<"./etcdctl watch "<<key<<" --endpoints="<<m_host;
fp = popen(ss.str().c_str(),"re");
if(fp == NULL)
{
printf("Watch failed,cmd:%s",ss.str().c_str());
delete[] buf;
abort();
}
while (1)
{
command[0] = '\0';
watchKey[0] = '\0';
buf[0] = '\0';
fgets(command, 128, fp);
fgets(watchKey, 512, fp);
fgets(buf, bufLen, fp);
if (strlen(command) == 0)
break;
printf("%%%%%%%%%Watch key,command:%s.key:%s,buf:%s",command,watchKey,buf);
callback(command, watchKey, buf); // 通过回调方式通知自己的程序
}
delete[] buf;
pclose(fp);
使用例如:./etcdctl get --prefix xxx 只不过是while循环中多几次fgets而已
抛砖引玉,有更好更简单的方式可以在下面留言沟通