zk系列-c++下zookeeper使用实例

从Muduo到Zookeeper:手把手教你用C++搭建高并发RPC框架(附完整项目代码) 本文详细介绍了如何从零开始,使用C++、Muduo网络库、Zookeeper和Protobuf构建一个名为Mprpc的高并发RPC框架。文章手把手拆解了网络通信、序列化协议、服务注册与发现等核心模块的实现,并提供了完整的项目代码,旨在帮助开发者深入理解分布式系统原理并掌握生产级RPC框架的搭建实践。 阅读详情

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。分布式应用可以使用它来实现诸如:统一命名服务、配置管理、分布式锁服务、集群管理等功能。公司常用到的是Java服务集群的管理。

1.函数介绍

//create a handle to used communicate with zookeeper
zhandle_t *zookeeper_init(const char *host, watcher_fn fn, int recv_timeout, const clientid_t *clientid, void *context, int flags)
//create a node synchronously
int zoo_create(zhandle_t *zh, const char *path, const char *value,int valuelen,
   const struct ACL_vector *acl, int flags,char *path_buffer, int path_buffer_len);
//lists the children of a node synchronously.
int zoo_wget_children(zhandle_t *zh, const char *path, watcher_fn watcher, void* watcherCtx, struct String_vector *strings)
//close the zookeeper handle and free up any resources.
int zookeeper_close(zhandle_t *zh)

2.实例

用上面3个函数,就能创建一个简单的集群管理。

数据存储结构为


服务端向Zk注册服务

//连接zk
void ZkRegistry::ConnectZK() {
  if (zhandle_) {
    zookeeper_close(zhandle_);
  }
  int count = 0;
  do {
    ++count;
    zhandle_ = zookeeper_init(zk_hosts_.c_str(),InitWatcher, timeout_, NULL, NULL, 0);
  } while (!connected_ && count < ZK_MAX_CONNECT_TIMES);

  if (count >= ZK_MAX_CONNECT_TIMES) {
    SLOG_WARN("ZkRegistry::Init --> connect host " << zk_hosts_ << " over max times:" << count);
    return;
  }
}

//发布服务,建立临时节点
void ZkRegistry::PublishService() {
  if (zhandle_ == NULL) {
    ConnectZK();
  }
  string server_path = PING_SERVER + "/" + PingConfig::instance().get_index() + "/"
    + GetIp() + ":" + PingConfig::instance().get_port();
  char res_path[128];
  int rc = zoo_create(zhandle_, server_path.c_str(), GetIp().c_str(), GetIp().size(),
      &ZOO_OPEN_ACL_UNSAFE, ZOO_EPHEMERAL, res_path, 128);
  if (rc) {
    SLOG_INFO("ZkRegistry::PublishService --> zoo_create() path=" << server_path << "," << zerror(rc));
  }
}

//每隔10s注册一次服务
void ZkRegistry::run() {
  while(true) {
    SLOG_INFO("publish service");
    ConnectZK();
    PublishService();
    sleep(10);
  }
}

void ZkRegistry::InitWatcher(zhandle_t *zh, int type, int state, const char *path, void *watcher_ctx) {
  if (state == ZOO_CONNECTED_STATE) {
    connected_ = true;
    SLOG_INFO("InitWatcher() ZOO_CONNECTED_STATE");
  } else if (state == ZOO_AUTH_FAILED_STATE) {
    SLOG_INFO("InitWatcher() ZOO_AUTH_FAILED_STATE");
  } else if (state == ZOO_EXPIRED_SESSION_STATE) {
    SLOG_INFO("InitWatcher() ZOO_EXPIRED_SESSION_STATE");
  } else if (state == ZOO_CONNECTING_STATE) {
    SLOG_INFO("InitWatcher() ZOO_CONNECTING_STATE");
  } else if (state == ZOO_ASSOCIATING_STATE) {
    SLOG_INFO("InitWatcher() ZOO_ASSOCIATING_STATE");
  }
}
客户端获取服务列表

//连接zk server
void ZkClient::ConnectZK() {
  cout << "ZkClient::ConnectZK" << endl;
  if (zhandle_) {
    zookeeper_close(zhandle_);
  }
  zhandle_ = NULL;
  connected_ = false;

  int count = 0;
  do {
    ++count;
    zhandle_ = zookeeper_init(zk_hosts_.c_str(), InitWatcher, timeout_, NULL, NULL, 0);
    sleep(5 * ONE_SECONDS);
  } while (!connected_ && count < ZK_MAX_CONNECT_TIMES);

  if (count >= ZK_MAX_CONNECT_TIMES){
    cout << "ZkClient::Init --> connecting zookeeper host: " << zk_hosts_ << " over times: " << count << endl;
  }
}
//更新服务列表,冷备和热备
void ZkClient::Update() {
  cout << "ZkClient::Update" << endl;
  if (zhandle_ == NULL || connected_ == false) {
    Init();
  }
  //获得服务份数
  struct String_vector str_vec;
  int ret = zoo_wget_children(zhandle_, PING_SERVER.c_str(), ServiceWatcher, NULL, &str_vec);
  if (ret) {
    cout << "Update --> read path:" << PING_SERVER << " wrong, " << zerror(ret) << endl;
    return;
  }

  //获得各份服务ip:port
  for (int i = 0; i < str_vec.count; ++i) {
    struct String_vector node_vec;
    string path = PING_SERVER + "/" + str_vec.data[i];
    int ret = zoo_wget_children(zhandle_, path.c_str(), ServiceWatcher, NULL, &node_vec);
    cout << "Update --> path:" << path << ", ret:" << ret << ", node's size:" << node_vec.count << endl;
    if (ret || node_vec.count != 1) {
      continue;
    }
    ....
  }
}
//监控服务变化
void ZkClient::ServiceWatcher(zhandle_t *zh, int type, int state, const char *path, void *watcherCtx) {
  cout << "type:" << type << endl;
  cout << "state:" << state << endl;
  cout << "path:" << path << endl;
//  cout << "watcherCtx:" << (char*)watcherCtx << endl;
  cout << "ZOO_CHILD_EVENT:" << ZOO_CHILD_EVENT << endl;
  if (ZOO_CHILD_EVENT == type) {
    cout << "ServiceWatcher ZOO_CHILD_EVENT" << endl;
    ZkClient::Instance().Update();//更新服务列表    
  }
}

服务端会每隔一段时间重新注册自己;

客户端在第一次与zk建立连接获取服务列表时,注册监听函数。zk当节点发生变化时,通知客户端,客户端重新获取服务列表,并注册事件。

版权声明:本文为博主原创文章,未经博主允许不得转载。




ZooKeeper使用入门教程-C语言版 ZooKeeper使用入门教程-C语言版 假设你已经完成了复杂的Zookeeper Server和C client安装。 参考资料: http://zookeeper.apache.org/doc/r3.5.9/zookeeperProgrammers.html https://www.cnblogs.com/haippy/archive/2013/02/23/2921100.html 背景 因为要做分布式框架,看大家说ZooKeeper适合做服务注册与发现模块,所以考察了一下这个Zoo Keeper,发现 阅读详情

相关推荐

基于ZooKeeper的分布式锁实现(C++版本)

一、简介分布式同步是Zookeeper的功能之一,但Zookeeper的分布式同步(分布式锁)功能并非以直接的接口呈现的。开发者需要额外地基于Zookeeper的节点(node)的分布式同步特性来实现分布式锁的接口。本文将提供基于基于ZooKeeper的分布式锁的C++接口及实现,实现中用到了部分C++11特性。另外,本实现使用的是经过封装的ZooKeeper接口,本文只列出这些ZooKeeper...

warden007的博客 3772

分布式网络通信框架(十三)——zookeeper C++客户端编程

zookeeperC++客户端编程很类似于MySQL客户端编程,就是以C++代码实现zk客户端的常见功能,比如getdeletecreate等.

qq_42120843的博客 3837

ZooKeeper C++客户端编译指南:从源码到集成实战

分布式协调服务是构建可靠分布式系统的核心组件,其核心原理在于通过共识算法和节点状态同步来维护集群数据的一致性。ZooKeeper作为该领域的经典实现,通过其树形数据模型和Watcher机制,为服务发现、配置管理等场景提供了高可用的基础支持。在C++工程实践中,由于官方未提供预编译库,开发者常需从源码编译客户端,这涉及对构建工具链、依赖管理和跨语言绑定的深入理解。本文聚焦于ZooKeeper 3.8.4版本,详细解析在Linux环境下编译C++客户端库的完整流程,涵盖autotools与CMake构建系统、O

weixin_34405354的博客 355

使用C/C++ API接口操作 Zookeeper 数据

ZooKeeper客户端库有两种语言:Java和C。本文将介绍使用C/C++语言客户端库的编译安装和使用入门。

一念之间 一心向阳 2271

zookeeper C API实例

之前一直用zookeeper的java API,最近要用C开发,所以看了C的API及实现 使用zookeeper C API 的步骤: (1)安装zookeeper,直接下载,解压,配置文件即可 (2)安装C API 进入./zookeeper/src/c目录 ./configure make make install (3)编写调用函数,可以参考下面的例子 (4)编译的时候注意

lpshoucsd1的专栏 1万+

388-Zookeeper的watcher机制(监听)& zk的原生开发API(c/c++接口)& 原生zk client API存在的问题

当我们客户端想要调用去rpc服务的时候,会拿RPC服务的名字和方法名字组成一个znode的节点路径,在服务配置中心上去查找一下,这个节点是否存在,如果存在,ip地址和端口号获取了,发起RPC方法的请求,如果找不到,就不用发起RPC请求了。而watcher机制相当于通知,回调机制, 客户端通过zk的API可以添加一个watcher,观察器,监听事件类型,针对UsersService这个节点的变化,维护一个map表,键就是节点的名字,值就是节点的内容。我们的客户端可以向zk的一个父节点添加一个watcher,如

Edward_LF的博客 575

zk系列-zookeeper的使用

zk支持java/c访问,java常用的有apache-zkclient,以及社区版的i0tec-zkclient,i0

文武天下 4939

从Power到HO:一文搞懂主流脑图谱在DPABI里怎么选,让你的rs-fMRI分析更精准

本文深入解析了rs-fMRI分析中主流脑图谱(如Power、HO、AAL等)在DPABI中的科学选择策略,帮助研究者根据不同的神经科学研究目标优化分析流程。从解剖学图谱到功能连接图谱的特性对比,到DPABI实操中的多图谱分析工作流,提供了全面的方法论指导,助力提升静息态功能磁共振成像(rs-fMRI)研究的精准度和可重复性。

weixin_30654583的博客 403

C++ zookeeper库使用示例

从网上找了一个示例程序,但是用的不是很好,其中还有点问题,最后根据我自己的使用贴一个示例,希望能给大家学习时提供点参考: zkClient.h #pragma once #include "../zookeeper/zookeeper.h" #include <iostream> #include <sstream> #include <string> #include <unistd.h> #include <fcntl.h> #include

qq_40565735的博客 2264

WhatsApp注册流程逆向分析:从协议解析到风控对抗实战

移动应用安全分析的核心在于理解客户端与服务端的交互协议与验证机制。通过逆向工程,可以深入剖析应用的数据加密、传输与身份验证原理,这对于构建安全模型、进行自动化测试和风控策略研究具有重要技术价值。在即时通讯、金融支付等高安全要求场景中,掌握应用注册流程的底层实现是评估其安全性的关键。本文聚焦于使用动态分析工具如Frida进行Hook和流量抓包,结合设备指纹识别与模拟器检测技术,详细解析了大型应用的注册风控体系,为安全研究人员和开发者提供了从环境搭建到实战对抗的完整方法。

weixin_33935636的博客 316

Python语言在工业控制中的简单应用

在工业控制中,经常需要对采集到的数据进行分析和处理,Python的这些库可以简化这一过程。传统的工业控制系统多依赖于专用的控制硬件和软件,但随着技术的发展,开放性和灵活性成为了新的需求焦点。还有,Python社区活跃,提供了大量的开源代码和模块,这对于工业控制领域来说是一个巨大的资产。Python作为一种高级编程语言,因其简洁的语法、强大的库支持和广泛的社区资源而在工业界获得了快速的发展和广泛的应用。在工业控制领域,Python的应用日益增多,这得益于其跨平台性、脚本语言的灵活性以及与硬件设备交互的能力。

2303_78014702的博客 1722

C++ zookeeper

zk系列-c++下zookeeper使用实例 2013年04月27日 17:53:34 春文秋武 阅读数:14611 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/whuqin/article/details/8859987 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务。分布式应用可以使用它来实现诸如:统一命名服...

lusic01的专栏 1193

告别天价授权!手把手教你用TwinCAT 3.1搭建EtherCAT主站(Windows 10/11保姆级教程)

本文详细介绍了如何在Windows 10/11系统上使用TwinCAT 3.1免费搭建EtherCAT主站,帮助中小企业和个人开发者低成本实现工业自动化。从环境准备、许可证策略到安装配置和实战开发,提供保姆级教程,涵盖PLC编程、运动控制及硬件选型建议,助您轻松入门工业控制领域。

weixin_30664615的博客 362

C++实现zookeeper主从切换

1.下载zk 2.配置zk 查看有无java环境。 java -version 安装java环境。 yum list java* 查看yum源的java包。 yum -y install java-1.8.0-openjdk 安装java包。 在/usr/local/zookeeper下解压压缩包,解...

P_hyugo的博客 1449

三边定位的最小二乘法运用

已知:条件基站到移动台的距离D,基站的坐标(xi,yi,zi) 求:移动台的坐标(x,y,z) 运用最小二乘法的核心是找到最小二乘法的矩阵形式即 Ax=B 在本次实验中通过三边定位计算得到 A=[A;2*(xi-x1),2*(yi-y1),2*(zi-z1]; %系数矩阵A b=[b;D1^2-Di^2+xi^2+yi^2+zi^2-x1^2-y1^2-z1^2]; %增广矩阵b

qq_26250141的博客 1万+

[27] cuda 应用之 核函数实现图像通道变换

[27] cuda 应用之 核函数实现图像通道变换

yohnyang的博客 202

ZooKeeper的简单使用

1解压 tar -zxvf zookeeper-3.4.10.tar.gz 2 修改配置文件 进入解压后的目录中,进入conf目录,打开zoo_sample.cfg。需要修改的是里面的datadir,zk节点上的数据最终就是存到这个目录中的。我们可以自定义这个目录。 如:将其修改成:(在解压后的目录中新建一个data目录) dataDir=/home/ubuntu/tool/zookeeper-3.4.10/data 3 zk也是cs模型 在zoo_sample.cfg中可以看到,他默认工作在2181端

luseysd的博客 3912

以 Joule 驱动的生成式开发:把需求文档直接变成可运行的 SAP 应用

摘要:SAP BTP的AI助手Joule正在改变开发方式,支持从自然语言描述自动生成数据模型、服务、UI及测试代码。在SAP Business Application Studio中,Joule能根据业务需求生成结构化代码,并提供代码补全、重构、解释等功能。开发者需注意避免上传敏感数据,并对AI生成的代码进行人工审核。Joule特别针对ABAP开发进行了优化,提供符合SAP规范的代码建议,帮助迁移遗留系统。此外,它还能快速生成CAP项目原型,但所有AI生成内容都需经过严格测试验证。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 342

ZooKeeper C 基础实例

一:简介 本实例是最简单的ZooKeeper实例,使用基本的API函数实现简单的增删改查ZooKeeper节点。所使用函数的详细介绍在上篇,链接如下:https://blog.youkuaiyun.com/xiaoliantongtong/article/details/99954363 二:实例 实例先创建了一个ZKClient类,用于对ZooKeeper的基本操作; 1:ZKClient.h ...

你安好便晴天的博客 1473

FPGA发展趋势:异构计算、AI加速、可重构计算

FPGA技术正朝着异构计算、AI加速和可重构计算三大方向发展。作为高效能计算平台,FPGA在异构架构中与CPU/GPU协同工作,发挥低延迟、高能效优势;在AI领域通过定制化架构实现边缘推理加速;其硬件可重构特性支持动态适应多样化计算需求。最新进展包括部分可重构技术、智能网卡和边缘AI应用。未来,FPGA将在自适应计算、量子接口和软件定义硬件等领域持续突破,成为异构计算架构的核心组件,推动硬件与软件的深度融合。性能对比显示FPGA在能效比(5-20TOPS/W)和灵活性方面具有显著优势。

2301_79143213的博客 969

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Linux下的C/C++开发之操作Zookeeper

本文介绍了如何在linux下使用C/C++操作zookeeper

jjkkzzzz的博客 1419

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: Makefile汇总
下一篇: Zookeeper常用命令
sofia1217
博客等级 码龄17年 36粉丝 24原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值