文档章节

zookeeper 简单的代码demo

大大美女女
 大大美女女
发布于 2014/12/19 16:03
字数 415
阅读 7251
收藏 78

写了一个关于zookeepeer应用的简单demo

服务端定时的向zookeeper集群注册,客户端监听zookeeper服务节点变化,一旦变化,立刻响应,更新服务端列表

服务端代码:

#include <zookeeper/zookeeper.h>
#include <zookeeper/zookeeper_log.h>
#include <iostream>

using namespace std;

 zhandle_t* zkhandle = NULL;
 const char* host = "10.7.18.31:2181,10.7.18.199:2181";
 int timeout = 20000;
 
void InitWatch(zhandle_t* zh, int type, int state, const char* path, void* watcher) {
  if (type == ZOO_SESSION_EVENT) {
    if (state == ZOO_CONNECTED_STATE) {
      cout << "build connection ok" << endl;
    } else if (state == ZOO_EXPIRED_SESSION_STATE) {
      cout << "connection disconnect" << endl;
      zkhandle = zookeeper_init(host, InitWatch, timeout, 0, const_cast<char*>("TODO"), 0);
    }
  }
}

void CreateWatch(int rc, const char *name, const void *data) {
  if (rc == ZNODEEXISTS || rc == ZOK) {
    if (rc == ZOK) {
      cout << "registry ok" << endl;
    } else {
      cout << "node exist" << endl;
    }
  } else {
    cout << "registry error" << endl;
  }
}

int main(int argc, char* argv[]) {
  zoo_set_debug_level(ZOO_LOG_LEVEL_WARN);
  zhandle_t* zkhandle = NULL;
  zkhandle = zookeeper_init(host, InitWatch, timeout, 0, const_cast<char*>("TODO"), 0);
  if (NULL == zkhandle) {
    cout << "zookeeper init error" << endl;
    return 0;
  }
 while (1) {
  int ret = zoo_acreate(zkhandle, "/cluster/index+endpoint", "", 8, &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, CreateWatch, "create");
  if (ret) {
    cout << "zoo_acreate error :" << ret << endl;
  }
  sleep(5);
 }

 zookeeper_close(zkhandle);
 
 return 0;
}

客户端代码:

#include <zookeeper/zookeeper.h>
#include <zookeeper/zookeeper_log.h>
#include <iostream>

using namespace std;

const char* host = "10.7.18.31:2181,10.7.18.199:2181";
const int timeout = 2000;
zhandle_t* zkhandle = NULL;

void InitWatch(zhandle_t* zh, int type, int state, const char* path, void* watcher) {
  if (type == ZOO_SESSION_EVENT) {
    if (state == ZOO_CONNECTED_STATE) {
      cout << "build connection ok" << endl;
    } else if (state == ZOO_EXPIRED_SESSION_STATE) {
      cout << "connection disconnect" << endl;
      zkhandle = zookeeper_init(host, InitWatch, timeout, 0, const_cast<char*>("TODO"), 0);
    }
  }
}


void ChildWatch(zhandle_t* zh, int type, int state, const char* path, void* watcher) {
  if (type == ZOO_CHILD_EVENT) {
    struct String_vector str_vec;
    int ret = zoo_wget_children(zh, "/cluster", ChildWatch, 0, &str_vec);
    if (ret) {
      cout << "zoo_wget_children error :" << ret << endl;
    }
    cout << "endpoint change: " << endl;
    for (int i = 0; i < str_vec.count; ++i) {
      string endpoint = str_vec.data[i]; 
      cout << endpoint << endl;
    }
  }
}

int main(int argc, char* argv[]) {
  zoo_set_debug_level(ZOO_LOG_LEVEL_WARN);
  if (zkhandle) {
    zookeeper_close(zkhandle);
  }
  zkhandle = zookeeper_init(host, InitWatch, timeout, 0, const_cast<char*>("TODO"), 0);
  if (NULL == zkhandle) {
    cout << "zookeeper init error" << endl;
    return 0;
  }
  while (1) {
    struct String_vector str_vec;
    int ret = zoo_wget_children(zkhandle, "/cluster", ChildWatch, const_cast<char*>(""), &str_vec);
    if (ret) {
      cout << "zoo_wget_children error :" << ret << endl;
    }
    for (int i = 0; i < str_vec.count; ++i) {
      string endpoint = str_vec.data[i]; 
      cout << "init endpoint :" << endpoint << endl;
    }
    sleep(120);
  }

  zookeeper_close(zkhandle);
}

© 著作权归作者所有

下一篇: 代理模式
大大美女女
粉丝 18
博文 60
码字总数 24479
作品 0
昌平
程序员
私信 提问
加载中

评论(2)

jzh8000
jzh8000
这个zookeeper集群最多承受多少台服务器?
zookeeper集群有几台机器?
西夏一品堂
西夏一品堂
撸主,你一般用zookeeper 干什么
彻底摆脱配置文件 一(开源项目zkconfigutil详解)

zkconfigutil介绍 它只是个工具,用于实现分布式集群间配置项的管理,虽小,但很、灰常好用,easy play 项目个性化地址http://jerrysearch.github.io/zkconfigutil/ 代码实例 /** * just tes...

book
2014/02/18
1K
3
Zookeeper:zookeeper源码笔记

前言: https://gitee.com/suyujie/zookeeper-test.git 最近在找工作,之前在使用zookeeper,上手太容易了,所以觉得没啥特别东西,但后来面试的时候,面试官问了zookeeper的很多东西,才发现...

琴兽
04/03
82
0
探秘Dubbo原理与源码 —— 调试环境搭建

1、 依赖⼯具 Maven Git JDK IntelliJ IDEA 2、源码拉取 从官⽅仓库 https://github.com/alibaba/dubbo Fork 出属于⾃⼰的仓库。为什么要 Fork ?既然开始阅读、调试源码,我们可能会写⼀些注...

小红牛
2018/12/19
0
0
Windows安装和使用zookeeper

之前整理过一篇文章《zookeeper 分布式锁服务》,本文介绍的 Zookeeper 是以 3.4.5 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookeeper 的安...

哈哈呵呵R
2014/04/02
126
0
windows中kafka使用方法

1.启动zookeeper binwindowszookeeper-server-start.bat configzookeeper.properties 2.启动kafka binwindowskafka-server-start.bat configserver.properties 3.创建topic binwindowskafka......

_编程菜鸟_
04/14
31
0

没有更多内容

加载失败,请刷新页面

加载更多

Netty整合Protobuffer

现在我们都知道,rpc的三要素:IO模型,线程模型,然后就是数据交互模型,即我们说的序列化和反序列化,现在我们来看一下压缩比率最大的二进制序列化方式——Protobuffer,而且该方式是可以跨...

算法之名
26分钟前
16
0
如何用C++实现栈

栈的定义 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压...

BWH_Steven
44分钟前
5
0
编程作业20190210900169

1编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。 #include <stdio.h>#include <stdlib.h> int main(){ char firstName[20]; char lastName[20]; print......

1李嘉焘1
56分钟前
12
0
补码的优点及原理分析

只讨论整数 1.计算机内部为什么没有减法器? 减法运算本身其实就是加法,如x - y即x +(-y),所以只需要将负数成功表示出来并可以参加加法运算,那加法器就可同时实现“+”和“-”的运算。这...

清自以敬
今天
76
0
Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部