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

ZooKeeper 支持 JavaC 的API接口。本文将介绍使用 C/C++ 语言客户端库的编译安装和使用入门。

一、编译安装

PS:就在上一篇文章还觉得安装和配置 jdkmaven 麻烦,所以当时选择 apache-zookeeper-[version]-bin.tar.gz 的版本。然而,本文编译 ZookeeperC/C++ API 动态库,还是避免不了安装 jdkmaven
出来混,总是要还的 (๑•̌.•๑)

1.安装依赖

安装jdk(建议11及以上,实测使用 jdk1.8 编译Zookeeper时会报错!!)

# 依赖Java11
[root@Ali ~]# yum install -y java-11-openjdk.x86_64 
[root@Ali ~]# yum install -y java-11-openjdk-devel.x86_64 
[root@Ali ~]# yum install -y java-11-openjdk-headless.x86_64
# 查看java安装
[root@Ali ~]# rpm -qa | grep jdk 
	java-11-openjdk-devel-11.0.23.0.9-2.el7_9.x86_64
	copy-jdk-configs-3.3-11.el7_9.noarch
	java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64
	java-11-openjdk-headless-11.0.23.0.9-2.el7_9.x86_64

安装maven

从 maven 官方下载地址 下载需要的 maven 版本(本文以 apache-maven-3.9.6 版本安装为例)

# 下载 apache-maven-3.9.6-bin.tar.gz
[root@Ali ~]# wget https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz
[root@Ali ~]# tar xzvf apache-maven-3.9.6-bin.tar.gz
[root@Ali ~]# mv apache-maven-3.9.6 /usr/local/maven

# 设置 PATH 环境变量: 将 /usr/local/maven/bin/ 添加到PATH
[root@Ali ~]# vim /etc/bash
PATH=/usr/local/maven/bin/:$PATH
export PATH

# 查看版本
[root@Ali ~]# mvn -v
Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)
Maven home: /usr/local/maven
Java version: 11.0.23, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.105.1.el7.x86_64", arch: "amd64", family: "unix"

安装其他依赖

# 安装 cppunit
[root@Ali ~]# yum install cppunit -y
[root@Ali ~]# yum install cppunit-devel -y

2.编译API动态库

# 下载源码
[root@Ali ~]# wget https://dlcdn.apache.org/zookeeper/zookeeper-3.9.2/apache-zookeeper-3.9.2.tar.gz
[root@Ali ~]# tar xzvf apache-zookeeper-3.9.2.tar.gz

# 在zookeeper-jute 执行 mvn compile
[root@Ali ~]# cd apache-zookeeper-3.9.2/zookeeper-jute
[root@Ali zookeeper-jute]# mvn compile
# ... ...
[INFO] Compiling 108 source files to /root/apache-zookeeper-3.9.2/zookeeper-jute/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  09:36 min
[INFO] Finished at: 2024-05-22T16:45:37+08:00
[INFO] ------------------------------------------------------------------------

# 切换到 zookeeper-client/zookeeper-client-c, 执行 autoreconf -if
[root@Ali zookeeper-jute]# cd ../zookeeper-client/zookeeper-client-c
[root@Ali zookeeper-client-c]# autoreconf -if

# 编译安装
[root@Ali zookeeper-client-c]# ./configure

其中 ./configure <your-options>  可选项:
    --enable-debug Enables optimization and enables debug info compiler options. (Disabled by default.)
    --without-syncapi Disables Sync API support; zookeeper_mt library won't be built. (Enabled by default.)
    --disable-static Do not build static libraries. (Enabled by default.)
    --disable-shared Do not build shared libraries. (Enabled by default.)

[root@Ali zookeeper-client-c]# make
[root@Ali zookeeper-client-c]# make check
[root@Ali zookeeper-client-c]# make install

二、使用C++接口操作数据

#include <string.h>
#include <zookeeper/zookeeper.h>

void watcher(zhandle_t *zh, int type, int state, const char *path, void *context) {
    // watcher function body
}

int main() {
    // create zookeeper handle
    zhandle_t *zkhandle = zookeeper_init("localhost:12181", watcher, 20000, 0, 0, 0);
    if (zkhandle == nullptr) {
        return -1;
    }

    // create node
    int retval = 0;
    char buffer[128];
    int buffer_length = sizeof(buffer);
    (void)memset(buffer, 0, sizeof(buffer));
    struct ACL ACL_ANYONE[] = {{ZOO_PERM_ALL, ZOO_ANYONE_ID_UNSAFE}};
    struct ACL_vector ACL_ANYONE_VEC = {1, ACL_ANYONE};
    retval = zoo_create(zkhandle, "/my_node","value", 5, &ACL_ANYONE_VEC,
                            ZOO_EPHEMERAL, buffer, sizeof(buffer)-1);
    if(retval == ZOK){
        printf("zoo_create data for /my_node is %s\n", buffer);
    }
    else{
        printf("zoo_create failed: code=%d\n", retval);
    }

    // get node data
    (void)memset(buffer, 0, sizeof(buffer));
    retval = zoo_get(zkhandle, "/my_node", 0, buffer, &buffer_length, nullptr);
    if (retval == ZOK) {
        printf("zoo_get data for /my_node is %s\n", buffer);
    }
    else{
        printf("zoo_get failed: code=%d\n", retval);
    }

    // close Zookeeper handle
    zookeeper_close(zkhandle);

    return 0;
}

运行示例

[wengjianhong@Ali testzone]$ g++ test_zookeeper.cpp --std=c++11 -lzookeeper_mt -DTHREADED -o test_zookeeper

[wengjianhong@Ali testzone]$ ./test_zookeeper
2024-05-22 19:25:35,325:12819(0x7fc5fdca3880):ZOO_INFO@log_env@1250: Client environment:zookeeper.version=zookeeper C client 3.9.2
2024-05-22 19:25:35,325:12819(0x7fc5fdca3880):ZOO_INFO@log_env@1254: Client environment:host.name=Ali
2024-05-22 19:25:35,325:12819(0x7fc5fdca3880):ZOO_INFO@log_env@1261: Client environment:os.name=Linux
2024-05-22 19:25:35,325:12819(0x7fc5fdca3880):ZOO_INFO@log_env@1262: Client environment:os.arch=3.10.0-1160.105.1.el7.x86_64
2024-05-22 19:25:35,325:12819(0x7fc5fdca3880):ZOO_INFO@log_env@1263: Client environment:os.version=#1 SMP Thu Dec 7 15:39:45 UTC 2023
2024-05-22 19:25:35,325:12819(0x7fc5fdca3880):ZOO_INFO@log_env@1271: Client environment:user.name=wengjianhong
2024-05-22 19:25:35,325:12819(0x7fc5fdca3880):ZOO_INFO@log_env@1279: Client environment:user.home=/home/wengjianhong
2024-05-22 19:25:35,325:12819(0x7fc5fdca3880):ZOO_INFO@log_env@1291: Client environment:user.dir=/home/wengjianhong/testzone
2024-05-22 19:25:35,325:12819(0x7fc5fdca3880):ZOO_INFO@zookeeper_init_internal@1344: Initiating client connection, host=localhost:12181 sessionTimeout=20000 watcher=0x40087d sessionId=0 sessionPasswd=<null> context=(nil) flags=0
2024-05-22 19:25:35,326:12819(0x7fc5fa73a700):ZOO_INFO@check_events@2987: initiated connection to server 127.0.0.1:12181
2024-05-22 19:25:35,329:12819(0x7fc5fa73a700):ZOO_INFO@finalize_session_establishment@2865: session establishment complete on server 127.0.0.1:12181, sessionId=0x100024f5eba000c, negotiated timeout=20000
zoo_create data for /my_node is /my_node
zoo_get data for /my_node is value
2024-05-22 19:25:35,333:12819(0x7fc5fdca3880):ZOO_INFO@zookeeper_close@3850: Closing zookeeper sessionId=0x100024f5eba000c to 127.0.0.1:12181
2024-05-22 19:25:35,335:12819(0x7fc5fdca3880):ZOO_INFO@zookeeper_close@3872: Freeing zookeeper resources for sessionId=0x100024f5eba000c

重要说明

编译 C++ 代码的时候这里必须指定链接 lzookeeper_mt 的动态库 和 添加 -DTHREADED 编译选项。否则会导致 zoo_createzoo_get 等接口找不到。

原因:zoo_createzoo_get 等同步接口。在 zookeeper.h 的头文件中,使用 #ifdef THREADED 控制屏蔽了zoo_createzoo_get 等接口,必须使用-DTHREADED 编译选项才能使用。原文如下:

If you are building a multithreaded client, compile with -DTHREADED compiler flag to enable the multi-threaded version of the library, and then link against the zookeeper_mt library.
If you are building a single-threaded client, do not compile with -DTHREADED, and be sure to link against the_zookeeper_st_library.

更多接口使用,请参考 apache-zookeeper-3.9.2/zookeeper-client/zookeeper-client-c/include/ 目录下的 zookeeper.h 等头文件

本文参考自 Zookeeper程序开发指南 的 C Binding

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/643204.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8S认证|CKA题库+答案| 12. 查看Pod日志

12、查看Pod日志 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node k8s master …

企业ov代码签名证书1300

我们在下载一些软件代码时&#xff0c;有时候操作系统会出现未知软件拦截&#xff0c;各个杀毒软件也会因为软件身份不明拦截软件下载。而代码签名证书可以对软件进行数字签名&#xff0c;以验证软件的身份和完整性。这种数字签名机制确保了软件在传输和安装过程中没有被篡改或…

1小时从0开始搭建自己的直播平台(详细步骤)

本文讲述了如何从0开始&#xff0c;利用腾讯云的平台&#xff0c;快速搭建一个直播平台的过程。 文章目录 效果图详细步骤准备工作第一步&#xff1a;添加域名并检验cname配置1.先填加一个推流域名2. 点击完下一步&#xff0c;得到一个cname地址3. 将cname地址&#xff0c;配置…

哥白尼哨兵系列卫星数据不能下载的解决方法

自2023年1月24日起&#xff0c;一个新的哥白尼数据空间生态系统已经启动&#xff0c;为所有哨兵数据&#xff08;Sentinel-1, Sentinel-2, Sentinel-3 and Sentinel-5P&#xff09;提供可视化和数据处理&#xff0c;地址为&#xff1a;https://dataspace.copernicus.eu/。详细介…

重构2:重构的原则之笔记

最近在看重构2&#xff1a;改善既有代码的设计这本书&#xff0c;对于代码重构指导非常有帮助&#xff0c;然后也是做个笔记记录下&#xff0c;以下是我阅读本书的前两章的时候整理的思维导图&#xff1a;

若依框架对于后端返回异常后怎么处理?

1、后端返回自定义异常serviceException 2、触发该异常后返回json数据 因为若依对请求和响应都封装了&#xff0c;所以根据返回值response获取不到Code值但若依提供了一个catch方法用来捕获返回异常的数据 3、处理的方法

Golang的基本使用

目录 变量的声明 Golang常用容器 defer 有趣的多态 结构体标签和reflect 反射 Golang最强的协程 channel go可能造成的内存泄露 变量的声明 方法 1:有类型,有var,不赋值 在Golang中默认值为0 方法 2:无类型,有var,赋值 方法 3:无类型,无var,赋值 多变量声明 多变…

Volatile的内存语义

1、volatile的特性 可见性&#xff1a;对一个volatile变量的读&#xff0c;总能够看到任意一个线程对这个volatile变量的写入。 原子性&#xff1a;对任意单个volatile变量的读/写具有原子性&#xff0c;但类似于volatile这种复合操作不具有原子性。 接下来我们用程序验证。…

Springboot开发 -- Postman 调试类型详解

引言 在 Spring Boot 应用开发过程中&#xff0c;接口测试是必不可少的一环。Postman 作为一款强大的 API 开发和测试工具&#xff0c;可以帮助开发者轻松构建、测试和管理 HTTP 请求。本文将为大家介绍如何在 Spring Boot 开发中使用 Postman 进行接口测试。 一、准备工作 安…

3D透视图转的时候模型闪动怎么解决?---模大狮模型网

在3D建模与渲染的世界中&#xff0c;透视图是我们观察和操作模型的重要窗口。然而&#xff0c;有时候在旋转透视图时&#xff0c;模型会出现闪动的现象&#xff0c;这不仅影响了我们的工作效率&#xff0c;还可能对最终的渲染效果产生负面影响。本文将探讨这一问题的成因&#…

魔众文库系统v6.6.0分销功能,后台日志重构,文档转换优化

分销功能&#xff0c;后台日志重构&#xff0c;文档转换优化 [新功能] 升级支持支付宝授权登录最新方式 [新功能] 后台左上角标题支持自定义&#xff0c;修改 modstart.php 中 admin.title 配置 [新功能] 日志界面重构&#xff0c;全新日志查看体验 [新功能] 链接选择弹窗增…

C++:vector的介绍及使用

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 文章目录 前言 一、vector的介绍 二、vector的使用 2.1.构造和赋值重载&#xff08;Member functions&#xff09; 2.2 vector iterator 的使用 2.3 vector 空间增长问题 2.4 vector 增删查改 三 sort 四 v…

电脑文件qt5core.dll如何修复?如何快速的解决qt5core.dll丢失问题

软件应用程序依赖于各种复杂的文件系统以保证其顺畅运行。这些文件中&#xff0c;动态链接库&#xff08;Dynamic Link Library&#xff0c;简称DLL&#xff09;是Windows操作系统中实现多种功能的关键组件之一。然而&#xff0c;DLL文件出现问题是Windows用户可能面临的常见挑…

内容营销SEO包括哪些内容?

在seo领域&#xff0c;内容营销其实主要就包含两方面&#xff0c;内容的创造以及优化&#xff0c;文章是内容&#xff0c;视频是内容&#xff0c;而对于seo&#xff0c;文章的内容比重自然就很大了&#xff0c;毕竟光是文章&#xff0c;就能分为好几类&#xff0c;比如长篇指南…

几张自己绘制的UML图

全部来源于公司项目&#xff0c;使用建模工具 Enterprise Architect。自己做的其余文档&#xff08;含绘图&#xff09;&#xff0c;因保密协议不便于公开。

深入了解Socket套接字

目录 一、引入&#x1f64c; 1、概念 &#x1f389; 2、分类&#x1f389; Socket 套接字主要针对传输层协议分为流套接字、数据报套接字、原始套接字&#xff08;了解即可&#xff09;三类。 1&#xff09;流套接字&#xff1a;使用传输层TCP协议 2&#xff09;数据报套…

《我的阿勒泰》读后感

暂没时间写&#xff0c;记录在此&#xff0c;防止忘记&#xff0c;后面补上!!! 【经典语录】 01、如果天气好的话&#xff0c;阳光广阔地照耀着世界&#xff0c;暖洋洋又懒洋洋。这样的阳光下&#xff0c;似乎脚下的每一株草都和我一样&#xff0c;也把身子完全舒展开了。 02、…

148.【Windows DOS命令脚本文件】

Window待处理脚本 (一)、批处理编程初步体验1.什么是批处理程序&#xff1f;(1).批处理程序的定义(2).如何编辑批处理程序 2.批处理程序可以做什么&#xff1f;(1).匹配规则删除文件(2).新建文件&#xff0c;日志等(3).创建计算机病毒等 3.一个基本的批处理文件(1).带盘符的输出…

Scala 入门介绍和环境搭建

一、简介 Scala 是一门以 Java 虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言 (静态语言需要提前编译&#xff0c;如&#xff1a;Java、c、c 等&#xff0c;动态语言如&#xff1a;js)Scala 是一门多范式的编程…

海康威视硬盘录像机NVR连接公网视频监控平台,注册失败,抓包发现有403 forbidden的问题解决

目录 一、问题描述 二、问题定位 1、查看DVR的配置 2、查看需要使用的端口是否开放 3、查看日志 4、抓包 &#xff08;1&#xff09;找出错误 &#xff08;2&#xff09;查看数据包内容 三、问题分析 1、国标28181中的域的概念 2、域应该如何定义 &#xff08;1&am…