本实例是最简单的ZooKeeper实例,使用基本的API函数实现简单的增删改查ZooKeeper节点。所使用函数的详细介绍在上篇,链接如下:https://blog.csdn.net/xiaoliantongtong/article/details/99954363
实例先创建了一个ZKClient类,用于对ZooKeeper的基本操作;
#ifndef _ZKCLIENT_INCLUDE_
#define _ZKCLIENT_INCLUDE_
#include
#include "/plat/zookeeper/include/zookeeper/zookeeper.h"
#include
#include
using namespace std;
class ZKClient
{
private:
zhandle_t *m_zkHandle; //zookeeper操作句柄
int time_out; //会话过期时间
int version; //版本号
int max_file_path; //path_buffer的长度
int max_length; //读取数据长度
public:
ZKClient();
~ZKClient();
void ZK_init(); //初始化函数
int ZK_connect(const char *port); //连结zookeeper函数
int ZK_close(); //关闭zookeeper函数
int ZK_get(const char *path,char *buffer); //获取node信息
int ZK_set(const char *path,const char *buffer); //设置节点信息
int ZK_exists(const char *path); //判断节点是否存在
int ZK_create(const char *path,const char* value);//创建一个新节点
int ZK_delete(const char *path); //删除一个节点
};
#endif
各个函数的具体实现方式在ZKClient.cpp中:
#include "ZKClient.h"
/***********************************
*函数: ZKClient
*功能: 构造函数
*参数: 无
*返回值: 无
*备注: 无
***********************************/
ZKClient::ZKClient()
{
ZK_init();
}
/***********************************
*函数: ~ZKClient
*功能: 析构函数
*参数: 无
*返回值: 无
*备注: 无
***********************************/
ZKClient::~ZKClient()
{
}
/***********************************
*函数: ZK_init
*功能: 初始化函数
*参数: 无
*返回值: 无
*备注: 无
***********************************/
void ZKClient::ZK_init()
{
m_zkHandle = NULL;
time_out = 100;
version = -1;
max_file_path = 1000;
max_length = 512;
}
/***********************************
*函数: ZK_connect
*功能: 连接zookeeper功能
*参数: port zookeeper的IP:PORT
*返回值: 0 成功
-1 失败
*备注:无
***********************************/
int ZKClient::ZK_connect(const char* port)
{
m_zkHandle = zookeeper_init(port,NULL,time_out,0,(void*)this,0);
if(m_zkHandle == NULL)
{
return -1;
}
//设置打印等级
zoo_set_debug_level(ZOO_LOG_LEVEL_DEBUG);
return 0;
}
/***********************************
*函数: ZK_close
*功能: 关闭zookeeper功能
*参数: 无
*返回值: 0 成功
-1 失败
*备注: 无
***********************************/
int ZKClient::ZK_close()
{
int retval;
retval = zookeeper_close(m_zkHandle);
if(ZOK != retval)
{
return -1;
}
return 0;
}
/***********************************
*函数: ZK_set
*功能: 设置节点属性
*参数: path 节点位置
buffer 节点属性
*返回值: 0 成功
-1 失败
1 节点不存在
*备注: 无
***********************************/
int ZKClient::ZK_set(const char *path,const char *buffer)
{
int len = strlen(buffer);
int retval;
if(ZK_exists(path))
return 1;
retval = zoo_set(m_zkHandle,path,buffer,len,version);
if(ZOK != retval)
return -1;
return 0;
}
/***********************************
*函数: ZK_get
*功能: 获取节点属性
*参数: path 节点位置
buffer 存放节点属性
*返回值: 0 成功
-1 失败
1 节点不存在
*备注: 无
***********************************/
int ZKClient::ZK_get(const char *path,char *buffer)
{
char getbuf[max_length];
memset(getbuf,0,sizeof(getbuf));
int retval;
if(ZK_exists(path))
return 1;
retval = zoo_get(m_zkHandle,path,0,getbuf,&max_length,NULL);
if(ZOK != retval)
return -1;
printf("buffer=[%s]\n",getbuf);
strcpy(buffer,getbuf);
return 0;
}
/***********************************
*函数: ZK_exists
*功能: 判断节点是否存在
*参数: path 节点位置
*返回值: 0 节点存在
-1 节点不存在
*备注: 无
***********************************/
int ZKClient::ZK_exists(const char *path)
{
int retval;
retval = zoo_exists(m_zkHandle,path,0,NULL);
if(ZOK != retval)
{
return -1;
}
return 0;
}
/***********************************
*函数: ZK_create
*功能: 新建节点
*参数: path 节点位置
value 节点属性
*返回值: 0 成功
-1 失败
1 节点已经存在
*备注: 无
***********************************/
int ZKClient::ZK_create(const char *path ,const char *value)
{
int retval;
if(0 == ZK_exists(path))
return 1;
retval = zoo_create(m_zkHandle,path,value,strlen(value),&ZOO_OPEN_ACL_UNSAFE,0,(char*)path,max_file_path);
if(ZOK != retval)
{
return -1;
}
return 0;
}
/***********************************
*函数: ZK_delete
*功能: 删除节点
*参数: path 节点位置
*返回值: 0 成功
-1 失败
1 节点未存在
*备注: 无
***********************************/
int ZKClient::ZK_delete(const char * path)
{
int retval;
if(ZK_exists(path))
return 1;
retval = zoo_delete(m_zkHandle,path,version);
if(ZOK != retval)
{
return -1;
}
return 0;
}
demo例子如文件demo.cpp
#include "ZKClient.h"
int main()
{
int ret = -1;
ZKClient *zk_client = new ZKClient() ;
//ZooKeeper的IP:PORT
char port[] = "172.21.4.113:22240,172.21.4.114:22240,172.21.4.112:22240";
ret = zk_client->ZK_connect(port);
if(ret)
{
printf("连接zookeeper失败\n");
return -1;
}
printf("连接zookeeper成功\n");
char path[] = "/BOSS_S/OCS/CLUSTER_L00/APP/001";
char value[] = "the node is create by lsf";
ret = zk_client->ZK_create(path,value);
if(0 > ret)
printf("创建node失败\n");
else if(0 == ret)
printf("创建node成功\n");
else
printf("此node已经存在\n");
char buffer[512];
memset(buffer,0,sizeof(buffer));
ret = zk_client->ZK_get(path,buffer);
if(0 > ret)
printf("获取node信息失败\n");
else if(0 == ret)
printf("获取node信息成功buffer:[%s]\n",buffer);
else
printf("此node不存在\n");
char setbuf[] = "change by lsf";
ret = zk_client->ZK_set(path,setbuf);
if(0 > ret)
printf("修改node信息失败\n");
else if(0 == ret)
printf("修改node信息成功\n");
else
printf("此node不存在\n");
memset(buffer,0,sizeof(buffer));
ret = zk_client->ZK_get(path,buffer);
if(0 > ret)
printf("获取node信息失败\n");
else if(0 == ret)
printf("获取node信息成功buffer:[%s]\n",buffer);
else
printf("此node不存在\n");
ret = zk_client->ZK_delete(path);
if(0 > ret)
printf("删除node失败\n");
else if(0 == ret)
printf("删除node成功\n");
else
printf("此node不存在\n");
ret = zk_client->ZK_close();
if(ret)
{
printf("关闭zookeeper失败\n");
return -1;
}
printf("关闭zookeeper成功\n");
delete zk_client;
return 0;
}
具体的linux平台运行结果如下
下载地址如下:
https://download.csdn.net/download/xiaoliantongtong/11589724