zookeeper 常见客户端介绍和使用 zkCli、自带API、 zkClient、Curator

文章目录

  • 一、Zookeeper的命令行使用
  • 二、Zookeeper自带API的使用
    • 2.1 引入API
    • 2.1 API简单使用
  • 三、Zookeeper三方客户端zkClient的使用
    • 3.1 引入依赖
    • 3.2 简单的使用案例
    • 四、Curator 客户端框架
    • 4.1 引入依赖
    • 4.2 简单使用案例

一、Zookeeper的命令行使用

ZooKeeper解压后,在其bin目录下包含着常用的程序,例如 zkServer.sh zkCli.sh
我们使用zkCli.sh 就可以通过命令行使用Zookeeper客户端
连接zookeeper服务器
连接后输入help就可以查看所有命令和使用方式的说明了

#对于本地默认端口 则可以直接 ./zkCli.sh 
# -server 指定服务地址和端口
[root@localhost bin]# ./zkCli.sh -server localhost:15881

创建节点命令
create [-s][-e] path data acl
-s或-e分别指定节点特性,顺序或临时节点,若不指定,则创建持久节点;acl⽤来进⾏权限控制。

# 创建顺序节点
[zk: localhost:15881(CONNECTED) 0] create -s /zk-test dataContent1111
Created /zk-test0000000007 # 创建临时节点,临时节点在会话结束后由就会被自动删除
[zk: localhost:15881(CONNECTED) 0] create -e /zk-temp data222
Created /zk-temp# 创建永久节点
[zk: localhost:15881(CONNECTED) 2] create /zk-test-permanent data333
Created /zk-test-permanent

读取节点
可以使用ls查看子节点列表,使用 get 命令查看节点的内容

# 使用 ls 命令查看子节点
[zk: localhost:15881(CONNECTED) 4] ls /
[lg-PERSISTENT, zk-premament, zk-temp, zk-test-permanent, zk-test0000000000, zk-test0000000007, zookeeper]# 使用 get 命令查看节点内容 get -s 则可以附加打印节点状态信息
[zk: localhost:15881(CONNECTED) 6] get /zk-temp
data222# stat 命令查看节点状态
[zk: localhost:15881(CONNECTED) 0] stat /zk-temp
cZxid = 0x30000000a
ctime = Wed Jul 05 10:48:44 CST 2023
mZxid = 0x30000000a
mtime = Wed Jul 05 10:48:44 CST 2023
pZxid = 0x30000000a
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x100008d52290003
dataLength = 7
numChildren = 0

更新节点内容
命令:set path data [version] version表示数据版本,在zookeeper中,节点的数据是有版本概念的,这个参数⽤于指定本次更新操作是基于Znode的哪⼀个数据版本进⾏的,如果版本和最新版本对不上则会更新失败,这样可以防止覆盖最新写入的数据。

set /zk-premament 666

删除节点
删除命令 **delete path [version]**** **如果删除的节点包含子节点,那么必须先删除子节点才能删除对应节点。

二、Zookeeper自带API的使用

2.1 引入API

通过Maven引入Zookeeper提供了java客户端API依赖,截至当前时间最新稳定版是 3.7.1

<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.7.1</version>
</dependency>

2.1 API简单使用

/*** zookeeper API 简单使用** @author liuyp*/
public class ZookeeperApiSimpleTest {//是否完成连接的建立static boolean connected = false;static Object lock = new Object();//zookeeper实例对象static ZooKeeper zooKeeper;//定义Watcher的回调 它会收到客户端状态变化的通知,也可以收到节点事件的通知static Watcher watcherProcess = (watchedEvent) -> {//客户端连接成功状态通知if (watchedEvent.getState() == Watcher.Event.KeeperState.SyncConnected && !connected) {System.out.println("watcher回调:客户端连接上线");synchronized (lock) {//连接成功就通知方法返回connected = true;lock.notifyAll();}}//子节点列表变化通知if (watchedEvent.getType() == Watcher.Event.EventType.NodeChildrenChanged) {try {//获取最新的子节点,并重新开启watchList<String> children = zooKeeper.getChildren(watchedEvent.getPath(), true);System.out.println("watcher回调:子节点变化通知 节点:" + watchedEvent.getPath() + " 的最新子节点:" + children);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}//节点内容变更事件if (watchedEvent.getType() == Watcher.Event.EventType.NodeDataChanged) {try {byte[] data = zooKeeper.getData(watchedEvent.getPath(), false, null);System.out.println("watcher回调:节点数据变化通知 节点:" + watchedEvent.getPath() + " 内容为:" + new String(data));} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}//节点删除通知if (watchedEvent.getType() == Watcher.Event.EventType.NodeDeleted) {System.out.println("watcher回调:节点被删除通知:" + watchedEvent.getPath());}};/*** demo测试入口** @param args* @throws IOException* @throws InterruptedException* @throws KeeperException*/public static void main(String[] args) throws IOException, InterruptedException, KeeperException {//同步的方式建立会话createSession();//测试创建节点,先删除上一次创建的createZNode();//获取节点数据getZNodeData();//更新节点数据updateZNodeData();//删除节点deleteZNode();}/*** 一、创建会话* 创建Zookeeper会话初始化Zookeeper对象* 这里改成同步执行,连接上了方法才返回*/public synchronized static void createSession() throws IOException, InterruptedException {//可以配置多个地址客户端会随机连接例如 192.168.188.130:15881,192.168.188.130:15882String connectString = "192.168.188.130:15881";//会话超时时间 单位是毫秒int sessionTimeout = 5000;//执行结果立即返回,后台异步建立连接。watcherProcesszooKeeper = new ZooKeeper(connectString, sessionTimeout, watcherProcess);if (connected) {return;}//如果没执行完,就让出锁进入等待状态,等待出结果后被唤醒synchronized (lock) {lock.wait();}}/*** 二、创建znode*/public static void createZNode() throws KeeperException, InterruptedException {//创建一个测试的公共节点,后续都在这个节点下面测试,并且给他加一个watchString testParentNodePath = "/zookeeperApi";if (zooKeeper.exists(testParentNodePath,false)==null){zooKeeper.create(testParentNodePath, "父节点".getBytes(StandardCharsets.UTF_8), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}//添加监听 exist&getDatazooKeeper.addWatch(testParentNodePath, AddWatchMode.PERSISTENT_RECURSIVE);zooKeeper.getChildren(testParentNodePath, true);/*** path:节点创建路径* data[] :字节数组格式保存到节点的数据* acl:节点ACL权限设置* createMode:创建的节点类型。PERSISTENT:持久节点 EPHEMERAL临时节点 ,还有临时顺序节点,持久顺序节点*/String zNodePersistent = zooKeeper.create(testParentNodePath + "/persistent","持久节点内容".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);String zNodeEphemeralSequential = zooKeeper.create(testParentNodePath + "/ephemeralSequential","临时顺序节点内容".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);String zNodeEphemeral = zooKeeper.create(testParentNodePath + "/persistentEphemeral","临时节点内容".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);}/*** 三、获取节点数据*/public static void getZNodeData() throws KeeperException, InterruptedException {String testParentNodePath = "/zookeeperApi";byte[] data = zooKeeper.getData(testParentNodePath, false, null);System.out.println("节点:" + testParentNodePath + " 内容为:" + new String(data));}/*** 三、更新节点数据*/public static void updateZNodeData() throws KeeperException, InterruptedException {String testParentNodePath = "/zookeeperApi";zooKeeper.setData(testParentNodePath, ("新数据" + Math.random()).getBytes(), -1);}/*** 四、删除znode*/public static void deleteZNode() throws KeeperException, InterruptedException {String testParentNodePath = "/zookeeperApi";zooKeeper.delete(testParentNodePath + "/persistent", -1);}}

三、Zookeeper三方客户端zkClient的使用

项目地址:https://github.com/sgroschupf/zkclient/issues
zkClient是git上的一个开源的zookeeper的java客户端项目,是对zookeeper原生API的封装,使得其更易用了。
优势:1. session重连 2.watch重主策 3.递归删除/添加节点
注意:项目最新更新日期是2018年,上生产使用前需要考虑漏洞问题。

3.1 引入依赖

<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.11</version>
</dependency>

3.2 简单的使用案例

public class ZkClientTest {static CountDownLatch countDownLatch = new CountDownLatch(1);public static void main(String[] args) throws InterruptedException {String testzkClientPath = "/zkClientAPI";//建立连接,这里是同步的方式String connectString = "192.168.188.130:15881";ZkClient zkClient = new ZkClient(connectString);//创建节点,zkClient支持递归创建,没有父节点会自动创建对应的父节点zkClient.createPersistent(testzkClientPath + "/persistent", true);zkClient.createPersistent(testzkClientPath + "/persistent_readyDelete", true);//删除节点 zkClient支持自动删除节点下的子节点zkClient.delete(testzkClientPath + "/persistent_readyDelete", -1);//获取子节点List<String> children = zkClient.getChildren(testzkClientPath);System.out.println("读取节点:" + testzkClientPath + " 子节点:" + children);//监听事件注册//注册子节点变更事件zkClient.subscribeChildChanges(testzkClientPath, (path, childNodeList) -> {System.out.println("节点子节点监听事件通知:节点:" + path + " 最新子节点:" + childNodeList);});//注册节点数据变更事件zkClient.subscribeDataChanges(testzkClientPath, new IZkDataListener() {@Overridepublic void handleDataChange(String s, Object o) throws Exception {System.out.println("节点数据监听事件通知:节点:" + s + " 最新数据:" + o);}@Overridepublic void handleDataDeleted(String s) throws Exception {System.out.println("节点数据监听事件通知:节点:" + s + " 已删除");}});//写入节点数据zkClient.writeData(testzkClientPath, System.currentTimeMillis() + "写入数据");//获取节点数据Object readDataResult = zkClient.readData(testzkClientPath);System.out.println("读取节点数据:" + testzkClientPath + " : " + readDataResult);//删除节点zkClient.deleteRecursive(testzkClientPath);//阻塞最后的结束程序countDownLatch.await();}
}

四、Curator 客户端框架

项目地址:https://github.com/apache/curator
最开始由 netflix 在github上开源,2013年成为apache顶级项目,至今仍在更新
和ZkClient一样,Curator解决了很多细节的底层工作,包括连接重连、watch自动重新注册
节点不存在异常等,并且提供了基于fluent编程风格的支持

4.1 引入依赖

<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.5.0</version>
</dependency>

4.2 简单使用案例

/*** Curator 是Netflix公司开源的一套ZooKeeper客户端框架* 和ZkClient一样,Curator解决了很多细节的底层工作,包括连接重连、watch自动重新注册* 节点不存在异常等,并且提供了基于fluent编程风格的支持* @author liuyp*/
public class CuratorTest {public static void main(String[] args) throws Exception {//连接信息,多个连接使用逗号分隔String connectString = "192.168.188.130:15881";/*** 一、发起连接** RetryPolicy重连策略 默认提供三种重连策略* 1、ExponentialBackoffRetry(基于backoff的重连策略)重新尝试一定次数,并增加重试之间的睡眠时间* 2、RetryNTimes(重连N次策略)* 3、RetryForever(永远重试策略)** 创建连接 CuratorFramework* 1、通过CuratorFrameworkFactory.newClient 底层是CuratorFrameworkFactory.build* 2、直接通过 CuratorFrameworkFactory.build** 启动连接 CuratorFramework.start()*/int baseSleepTimeMs=1000; //重试之间等待的初始时间int maxRetries=5;//最大重试次数int maxSleepMs=5000;//每次重试的最大睡眠时间 如果算出来的sleepMs超过这个时间,则采用maxSleepMs//重试间隔时间: baseSleepTimeMs * Math.max(1, random.nextInt(1 << (retryCount + 1)));RetryPolicy retryPolicy=new ExponentialBackoffRetry(baseSleepTimeMs,maxRetries,maxSleepMs);CuratorFramework client = CuratorFrameworkFactory.builder().connectString(connectString).sessionTimeoutMs(10000).connectionTimeoutMs(5000).retryPolicy(retryPolicy).namespace("curatorAPI") //加上这个以后,所有路径都是以这个路径为根路径.build();client.start();System.out.println("**********客户端已启动**********");/*** 二、创建节点* 1、默认创建内容为空的永久节点* 2、设置节点内容和原生一样,使用字节数组* 3、可以使用 creatingParentsIfNeeded 方法自动创建父节点,避免需要递归判断父节点是否存在*/client.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/tempNode/create","临时节点".getBytes(StandardCharsets.UTF_8));/*** 三、测试增加监听* 1、监听类型 PERSISTENT_RECURSIVE 会循环监听注册节点和其子节点的数据变化和是否存在*/CuratorWatcher curatorWatcher=(watchevent)->{System.out.println("[监听通知:]"+"节点:"+watchevent.getPath()+" "+watchevent.getType());};client.watchers().add().withMode(AddWatchMode.PERSISTENT_RECURSIVE).usingWatcher(curatorWatcher).forPath("/tempNode");client.create().forPath("/tempNode/watcher");/*** 三、读取&修改节点数据 并获取状态数据*/Stat stat=new Stat();byte[] bytes = client.getData().storingStatIn(stat).forPath("/tempNode/create");System.out.println("读取节点数据:"+new String(bytes,StandardCharsets.UTF_8));System.out.println("读取节点状态:"+stat.toString());client.setData().forPath("/tempNode/create","节点/tempNode/create的新数据".getBytes(StandardCharsets.UTF_8));/*** 四、删除节点*/client.delete().forPath("/tempNode/watcher");client.delete().forPath("/tempNode/create");client.delete().forPath("/tempNode");}}

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

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

相关文章

使用Helmfile 管理helm charts

官网 ## https://github.com/helmfile/helmfile## 参考 https://cloud.tencent.com/developer/article/1766822 介绍 使用helmfile时&#xff0c;我们首先得了解helm的使用&#xff0c;以及如何开发一个helm chart。 helm是kubernetes的包管理工具。在实际的使用场景中我们涉…

分布式(4)

目录 16.分布式缓存可能会存在哪些问题&#xff1f; 17.分布式限流了解过吗&#xff1f; 18.分布式定时任务怎么实现&#xff1f; 19.什么是分布式系统的副本一致性&#xff1f;有哪些&#xff1f; 20.在分布式系统中有哪些常见的一致性算法&#xff1f; 21.谈谈你对一致性…

【排序算法】归并排序与快速排序:深入解析与比较

文章目录 1. 引言2. 归并排序&#xff08;Merge Sort&#xff09;3. 快速排序&#xff08;Quick Sort&#xff09;4. 归并排序与快速排序的比较5. 结论 1. 引言 排序算法是计算机科学中最基本且至关重要的概念之一。它们不仅是理解更复杂算法和数据结构的基石&#xff0c;而且…

面试复盘5——后端开发——一面面经——大厂的面试果然干货满满

前言 本文主要用于个人复盘学习&#xff0c;因此为保障公平&#xff0c;所以本文不指出公司名&#xff0c;题目编号只是为了自己区别而已。对待面经&#xff0c;望读者还是更多从其中学习总结&#xff0c;而不是去碰原题。 面试岗位信息 后端开发秋招&#xff0c;上海某大中…

【Linux Shell】2. Shell 变量

文章目录 【 1. 变量命名规则 】【 2. 变量的使用 】【 3. 只读变量 】【 4. 删除变量 】【 5. 变量类型 】【 6. Shell 字符串 】6.1 字符串的分类6.2 字符串操作 【 7. Shell 数组 】7.1 定义数组7.2 读取数组7.3 获取数组的长度 【 8. Shell 注释 】8.1 单行注释8.2 多行注释…

机器学习的算法简单介绍-朴素贝叶斯算法

朴素贝叶斯网络&#xff08;Naive Bayes Network&#xff09;与贝叶斯网络&#xff08;Bayesian Network&#xff09;有一些不同之处&#xff0c;让我们来澄清一下这两个概念。 贝叶斯网络&#xff08;Bayesian Network&#xff09;&#xff1a;贝叶斯网络是一种用于建模概率关…

Hi5 2.0 虚拟手与追踪器(Tracker)的位置修正

问题描述 使用环境与工具&#xff1a;Unity 2022.3.4fc1&#xff0c;steam VR(2.7.3)&#xff0c;steamvrSDK&#xff08;1.14.15&#xff09;&#xff0c;HTC vive pro专业版&#xff0c;Hi5 2.0数据手套 首先按照Hi5 2.0的使用说明&#xff08;可参考&#xff1a;HI5 2.0 交…

windows 和linux 的区别

目前国内 Linux 更多的是应用于服务器上&#xff0c;而桌面操作系统更多使用的是 Windows。主要区别如下 比较层面WindowsLinux界面界面统一&#xff0c;外壳程序固定所有 Windows 程序菜单几乎一致&#xff0c;快捷键也几乎相同图形界面风格依发布版不同而不同&#xff0c;可…

Netty使用SSL实现双向通信加密

最近项目有个需求,TCP服务器实现基于证书通信加密,之前没做过,花了一些时间调研,今天整理下。 SSL(Secure Sockets Layer 安全套接字协议) 1、原理 算法原理 简而言之就是非对称加密算法 私钥自己持有,公钥发给对方,对方在发送信息的时候使用公钥进行加密数据,当接收到…

C# 数组相关操作

一。int[] 类型数组 1.求int[]数组中的最大值和最小值 int[] intArrnew int[]{ 1,2,3,4,5,-24,66};int a intArr.Max();int b intArr.Min();Console.WriteLine(a); //最大值为66Console.WriteLine(b); //最小值为-24 2.判断int[]数组中是否包含某个值 int[] intArrnew int[]…

IPA打包过程中的Invalid Bundle Structure错误如果解决

在iOS应用程序开发中&#xff0c;打包和发布应用程序是一个必要的步骤。有的时候在打包的过程中可能会遇到一些错误&#xff0c;其中一个比较常见的错误是"Invalid Bundle Structure"。这个错误通常意味着应用程序的文件结构不正确&#xff0c;而导致的无法成功打包应…

ShardingJDBC简单使用

Sharding-JDBC是当当网开源的适用于微服务的分布式数据访问基础类库&#xff0c;完整的实现了分库分表&#xff0c;读写分离和分布式主键功能&#xff0c;并初步实现了柔性事务。Sharding-JDBC定位为轻量级Java框架&#xff0c;在Java的JDBC层提供的额外服务。其适用于任何基于…

【NLP】2024年改变人工智能的前六大NLP语言模型

在快速发展的人工智能领域&#xff0c;自然语言处理已成为研究人员和开发人员关注的焦点。作为这一领域显著进步的证明&#xff0c;近年来出现了几种开创性的语言模型&#xff0c;突破了机器能够理解和生成的界限。在本文中&#xff0c;我们将深入研究大规模语言模型的最新进展…

精准快速定位的locate

精准快速定位的locate Linux locate命令用于查找符合条件的文档、程序、目录等等。这个命令会在数据库中查找符合条件的各种信息。 一般情况我们只需要输入 locate name 即可查找。 官方定义为: locate - list files in databases that match a pattern 使用方法为: $ lo…

ubuntu2204,mysql8.x安装

ubuntu 2204, MySQL8.x安装 sudo apt-get update sudo apt-get upgrade# 习惯性的先设置一下时区,这里我使用东八区 date -R # 若发现时间正常则无需设置tzselect# 依次选择 4 -> 10 -> 1 -> 1cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimedate -R# 同步时间…

ElementuiPlus文件上传失败原因,一个小坑记录!

记录一个自己犯得错误&#xff0c;一定记住要前后端file名字对应上&#xff01; 原后端代码 RestController RequestMapping("/upload") public class UploadFileController {PostMappingpublic Result upload(MultipartFile multipartFile) throws IOException {S…

简单Diff算法

简单Diff算法 渲染器的核心 Diff算法 解决的问题 比较新旧虚拟节点的子节点&#xff0c;实现最小化更新。 虚拟节点key属性的作用 就像虚拟节点的“身份证号”&#xff0c;在更新时&#xff0c;渲染器会通过key属性找到可复用的节点&#xff0c;然后尽可能地通过DOM移动操…

GraalVM Native学习及使用

概述 在开发Spring Boot 应用或者其他JAVA程序的过程中&#xff0c;启动慢、内存占用大是比较头疼的问题&#xff0c;往往需要更多的资源去部署&#xff0c;成本大幅提高。为了优化上述问题&#xff0c;常常使用优化程序、使用更小消耗的JVM、使用容器等措施。 现在有一个叫做…

一起读《奔跑吧Linux内核(第2版)卷1:基础架构》- 大小端字节序

关注 点赞 不错过精彩内容 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作! Hello&#xff0c;大家好我是硬核王同学&#xff0c;是一名刚刚工作一年多的Linux工程师&#xff0…

计算机网络(9):无线网络

无线局域网 WLAN 无线局域网常简写为 WLAN (Wireless Local Area Network)。 无线局域网的组成 无线局域网可分为两大类。第一类是有固定基础设施的&#xff0c;第二类是无固定基础设施的。所谓“固定基础设施”是指预先建立起来的、能够覆盖一定地理范围的一批固定基站。 …