ZooKeeper C 基础实例

一:简介

本实例是最简单的ZooKeeper实例,使用基本的API函数实现简单的增删改查ZooKeeper节点。所使用函数的详细介绍在上篇,链接如下:https://blog.csdn.net/xiaoliantongtong/article/details/99954363

二:实例

实例先创建了一个ZKClient类,用于对ZooKeeper的基本操作;

1:ZKClient.h

#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

2:ZKClient.cpp

各个函数的具体实现方式在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;
}

3:demo.cpp

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;
}

4:结果

具体的linux平台运行结果如下

ZooKeeper C 基础实例_第1张图片

ZooKeeper C 基础实例_第2张图片

三:下载地址

下载地址如下:
https://download.csdn.net/download/xiaoliantongtong/11589724

你可能感兴趣的:(ZooKeeper)