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

news2024/11/25 3:24:42

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++要哮着学】类和对象

文章目录 前言面向过程和面相对象初步认识类的定义类的访问限定符及封装访问限定符封装 类的作用域类的实例化类对象模型如何计算类的大小结构体内存对齐规则类对象的存储方式1.对象中包含类的各个成员2.代码只保存一份&#xff0c;在对象中保存存放代码的地址3.只保存成员变量…

权限维持--linux

隐藏文件/夹&-开头文件 如何创建: 在文件名之前加.即可 touch .1.s 如何清除、查找&#xff1a; ls -al rm -fr -文件 已-开头的文件直接读取是不行的需要带目录 隐藏时间戳 ①用其他文件的时间 touch -r zww.php testq.txt 如何清除、查看&#xff1a; stat test…

KDE-Ambari-Metrics-Collector问题排查解决手册

文档说明 本文档是为了解决KDE平台的Ambari-Metrics-Collector服务在运行时遇到的问题而提供的问题排查和解决方法的参考文档 说明: 当前的Ambari-Metrics-Collector服务包括了ams-collector和ams-hbase两个程序,在Ambari-Metrics-Collector安装的节点执行ps -elf|grep am…

【算法】前缀和——二维前缀和模板题

本节博客是通过——二位前缀和模板题来介绍前缀和二维算法&#xff0c;有需要借鉴即可。 目录 1.题目2.暴力求解3.二维前缀和算法3.代码示例4.总结 1.题目 题目链接&#xff1a;LINK 2.暴力求解 这里我们首先想到的就是一个暴力求解的方式&#xff0c;挨个需要的进行遍历就…

基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法,对比两个算法的仿真时间&#xff0c;收敛曲线&#xff0c;以及路径规划的结果&#xff0…

独享IP是原生IP吗?

原生IP&#xff1a; 原生IP是指由Internet服务提供商&#xff08;ISP&#xff09;直接分配给用户的IP地址&#xff0c;这些IP地址通常反映了用户的实际地理位置和网络连接。原生IP是用户在其所在地区或国家使用的真实IP地址&#xff0c;与用户的物理位置直接相关。在跨境电商中…

从零训练yolov8

1.收集数据 2.数据标注 pip install labelimg3.划分数据集 0.2的验证机0.8的训练集 import os from shutil import copyfile from sys import exit import randomsource r"D:\Data\imgs\screenc" \\ target_train r"D:\Data\imgs\datasets\mydata\images\t…

访存优化实践之一 : CPU、GPU、DDR与访存路径介绍

一、CPU的访存路径 上图是目前主流的CPU架构介绍。可以看到,CPU的访存路径:先经过MMU,然后经过Cache,最后到达DRAM。这其中涉及到的关键内容为基于MMU的内存管理以及缓存机制。 1.1、基于MMU的内存管理 众所周知,在计算机设计之处是没有虚拟地址的概念的,CPU发出的地址即…

win中的vscode利用ssh插件,在同一台电脑的virtualbox虚拟出来的ubuntu中编译,调试设置方法

vscode中安装ssh插件virtualbox7.0中的设置&#xff1a; 在网络管理器中添加host-only网卡&#xff0c;用来主机和虚拟机双向通信。这个网卡能在win的设备管理器里面看到手动配置网卡&#xff0c;其中ip地址是另一个网段的&#xff0c;主机ip地址是192.168.1.1。这个网卡对于虚…

ELK 日志监控平台(二)- 优化日志格式

文章目录 ELK 日志监控平台&#xff08;二&#xff09;- 优化日志格式1.日志输出要点2.优化应用的日志格式2.1.确定日志输出要点来源2.1.1.服务名称2.1.2.服务环境2.1.3.日志级别2.1.4.日志输出时间2.1.5.日志内容2.1.6.日志输出对象2.1.7.线程名称 2.2.logback.xml修改日志输出…

Java网络编程之TCP协议核心机制(二)

目录 题外话 正题 滑动窗口机制 如果出现丢包问题怎么办?? 滑动窗口触发条件 流量控制 拥塞控制 小结 题外话 宿舍没有空调的感觉谁懂?!!! 人要蒸发了,八点自动热醒,直接强行学习 正题 我们继续讲解TCP协议核心机制 上篇博客讲完了,建立连接机制,确认应答机制,超时…

Boxy SVG for Mac:打造精致矢量图形的得力助手

在矢量图形设计领域&#xff0c;Boxy SVG for Mac以其出色的性能和丰富的功能&#xff0c;成为了设计师们的得力助手。 Boxy SVG for Mac(矢量图编辑器) v4.32.0免激活版下载 Boxy SVG具备强大的编辑能力&#xff0c;支持节点编辑、路径绘制、颜色填充等多种操作&#xff0c;让…

struct.unpack_from()学习笔记

struct.unpack_from(fmt,b_data,offset) 按照指定的格式fmt&#xff0c;从偏移位置offset&#xff0c;对b_data开始解包&#xff0c;返回数据格式是一个元组(v1,v2…) fmt可以有&#xff1a; _struct.py: The remaining chars indicate types of args and must match exactly;…

实现 YOLO 目标计数 | 含代码示例

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 在YOLO算法的无数应用中&#xff0c;我们想聚焦于一个真实的场景&#xff1a;道路车辆计数。这个用例对于智能城市的交通规划和决策具有重要意义。在这篇文章中&#xff0c;我们将带您一步步实现YOLO目标检测和计数&…

工业路由器在新能源数字化中的应用:重塑能源行业的未来

随着全球对可再生能源和能源效率的追求日益加强&#xff0c;新能源数字化已成为推动行业发展的关键因素。在这一变革的浪潮中&#xff0c;工业路由器以其卓越的性能和独特的功能&#xff0c;成为新能源数字化不可或缺的核心组件。本文将深入探讨工业路由器在新能源数字化中的应…

对话:用言语构建深刻的思想碰撞

对话&#xff1a;用言语构建深刻的思想碰撞 在写书中&#xff0c;对话是一种有力的工具&#xff0c;能与读者进行有效的沟通和交流&#xff0c;引发深思和反思。它不仅是信息传递的方式&#xff0c;更是加深情感、探讨主题和吸引读者参与的桥梁。你应从读者的角度思考&#xf…

【学习AI-相关路程-工具使用-自我学习-jetsoncudapytorch-开发工具尝试-基础样例 (3)】

【学习AI-相关路程-工具使用-自我学习-jetson&cuda&pytorch-开发工具-安装尝试-基础样例 &#xff08;3&#xff09;】 1、前言2、环境说明3、自我总结&#xff08;1&#xff09;了解整体过程阶段 1: 硬件设置阶段 2: 软件准备阶段 3: 数据准备阶段 4: 模型设计和训练阶…

在Spring 当中存在的八大模式

在Spring 当中存在的八大模式 文章目录 在Spring 当中存在的八大模式每博一文案1. 简单工厂模式2. 工厂方法模式3. 单例模式4. 代理模式5. 装饰器模式6. 观察者模式7. 策略模式8. 模板方法模式最后&#xff1a; 每博一文案 我认为 “知世故而不世故” 才是真正意义上的成熟。回…

Python功能强大的构建系统库之buildout使用详解

概要 在软件开发过程中,管理项目依赖和构建环境是一项复杂而重要的任务。Python buildout库是一种强大的构建系统,能够帮助开发者自动化地管理项目的依赖、生成可重复的开发环境,并简化部署过程。本文将详细介绍buildout库,包括其安装方法、主要特性、基本和高级功能,以及…

csdn的insCode怎么用IDE和linux终端

1.进入insCode&#xff0c;选择工作台 找到我的项目&#xff0c;没有项目的话可以新建一个。 选择在IDE中编辑&#xff0c;界面如下&#xff1a; 右边有个终端&#xff0c;点击即可出现linux的xterm终端。