Java操作Zookeeper节点
创始人
2025-05-29 06:35:09

1. Java操作ZooKeeper

引入jar包:

org.apache.zookeeperzookeeper3.4.10

private ZooKeeper zk;/*** 创建连接** @param address        地址 集群写多个,逗号分开docker.vm.com:2181,docker.vm.com:2182,docker.vm.com:2183* @param sessionTimeout 会话过期时间*/
public void createConnection(String address, int sessionTimeout) {try {zk = new ZooKeeper(address, sessionTimeout, new Watcher() {// 监控所有被触发的事件public void process(WatchedEvent event) {System.out.println("已经触发了" + event.getType() + "事件!");//1、获取事件状态Event.KeeperState state = event.getState();//2、获取事件类型Event.EventType type = event.getType();//获取节点地址String path = event.getPath();//3、判断是否连接if (Event.KeeperState.SyncConnected == state) {//4、判断类型if (Event.EventType.None == type) {System.out.println("###zookeeper建立连接成功###");} else if (Event.EventType.NodeCreated == type) {System.out.println("###Watcher监听的对应数据节点被创建###, 当前新增节点:" + path);} else if (Event.EventType.NodeDataChanged == type) {System.out.println("###Watcher监听的对应数据节点的数据内容发生变更###, 当前节点:" + path + ",被修改...");} else if (Event.EventType.NodeChildrenChanged == type) {System.out.println("###Wather监听的对应数据节点的子节点列表发生变更###, 当前子节点:" + path + ",被修改...");} else if (Event.EventType.NodeDeleted == type) {System.out.println("###Watcher监听的对应数据节点被删除###, 当前节点:" + path + ",被删除...");}}}});} catch (IOException e) {e.printStackTrace();}
}/*** 判断指定节点是否存在** @param path* @param needWatch* @return*/
public Stat exist(String path, boolean needWatch) {try {return this.zk.exists(path, needWatch);} catch (Exception e) {e.printStackTrace();return null;}
}/*** 创建持久化节点** @param path* @param data* @return*/
public boolean createNode(String path, String data) {try {this.exist(path, true);/*** acl:权限列表提供默认的权限OPEN_ACL_UNSAFE、CREATOR_ALL_ACL、READ_ACL_UNSAFEOPEN_ACL_UNSAFE:完全开放CREATOR_ALL_ACL:创建该znode的连接拥有所有权限READ_ACL_UNSAFE:所有的客户端都可读*//*** PERSISTENT 持久化节点* PERSISTENT_SEQUENTIAL 顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加 1* EPHEMERAL 临时节点, 客户端session超时这类节点就会被自动删除* EPHEMERAL_SEQUENTIAL 临时自动编号节点*/zk.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println("###新增节点信息path:" + path + " data:" + data);return true;} catch (Exception e) {e.printStackTrace();return false;}
}/*** 修改持久化节点** @param path* @param data* @return*/
public boolean updateNode(String path, String data) {try {this.exist(path, true);//zk的数据版本是从0开始计数的。如果客户端传入的是-1,则表示zk服务器需要基于最新的数据进行更新。如果对zk的数据节点的更新操作没有原子性要求则可以使用-1.//version参数指定要更新的数据的版本, 如果version和真实的版本不同, 更新操作将失败. 指定version为-1则忽略版本检查zk.setData(path, data.getBytes(), -1);System.out.println("###修改节点信息path:" + path + " data:" + data);return true;} catch (Exception e) {e.printStackTrace();return false;}
}public boolean deleteNode(String path) {try {this.exist(path, true);zk.delete(path, -1);System.out.println("###删除节点信息path:" + path);return true;} catch (Exception e) {e.printStackTrace();return false;}
}public byte[] getNodeData(String path,boolean needWatch,Stat stat) {try {byte[] data = zk.getData(path, needWatch, stat);return data;} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}return null;
}public void close() {try {if (zk != null) {zk.close();System.out.println("###zookeeper服务已关闭");}} catch (Exception e) {e.printStackTrace();}
}public static void main(String[] args) throws Exception {ZooTest test = new ZooTest();test.createConnection(ADDRESS, SESSION_TIMEOUT);test.createNode("/t1", "55555");test.updateNode("/test","3333");test.deleteNode("/test");test.close();
}

zookeeper的权限: ZooKeeper提供了如下几种验证模式(scheme):
• digest:Client端由用户名和密码验证,譬如user:password,digest的密码生成方式是Sha1摘要的base64形式
• auth:不使用任何id,代表任何已确认用户。 • ip:Client端由IP地址验证,譬如172.2.0.0/24
• world:固定用户为anyone,为所有Client端开放权限
• super:在这种scheme情况下,对应的id拥有超级权限,可以做任何事情(cdrwa)

注意的是,exists操作和getAcl操作并不受ACL许可控制,因此任何客户端可以查询节点的状态和节点的ACL。
节点的权限(perms)主要有以下几种: • Create 允许对子节点Create操作 • Read
允许对本节点GetChildren和GetData操作 • Write 允许对本节点SetData操作 • Delete
允许对子节点Delete操作 • Admin 允许对本节点setAcl操作

ZooKeeper zk = new ZooKeeper("10.9.126.153", 3000, null);
List acls = new ArrayList(1);
Id id = new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin123"));
ACL acl = new ACL(ZooDefs.Perms.ALL, id);
//ACL acl = new ACL(ZooDefs.Perms.CREATE|ZooDefs.Perms.READ, id);//给多权限
acls.add(acl);
zk.create("/test", new byte[0], acls, CreateMode.PERSISTENT);
zk.addAuthInfo("digest", "admin:admin123".getBytes());
zk.close();

2. ZooKeeper基础

ZooKeeper是一个分布式应用程序协调服务。它监视集群中各个节点的状态,根据节点提交的反馈进行下一步合理操作。保证系统性能高效,功能稳定。
ZooKeeper客户端和server采用长连接。建立连接之后server生成64位的session
id给客户端。客户端定期发送ping包检查和保存于server的连接。一旦session结束或者超时,所有的临时节点被删除。客户端可以设置session超时时间。

2.1 ZooKeeper节点

ZooKeeper提供一个多层级(基于树形结构)的节点命名空间。类似于linux的目录结构,不同的是ZooKeeper每个节点都能存放数据,而linux文件系统中,只有文件中才能写数据,文件夹中只能放文件(ZooKeeper更简单,不区分文件和文件夹)。ZooKeeper中的节点不允许递归创建,即父节点不存在,不能创建子节点。如:

/parent_node/child

如果/parent_node不存在,则不能直接创建/parent_node/child
Zookeeper节点不能存放大量数据,每个节点存放数据上限为1M。 ZooKeeper节点有四种类型:
持久节点(PERSISTENT):在节点创建后就一直存在,直到有显示的删除操作来清除这个节点。不会随客户端会话失效而消失。如果创建节点时选择PERSISTENT,则不能有同名的节点存在,否则会报错:
在这里插入图片描述

持久顺序节点(PERSISTENT_SEQUENTIAL):这类节点也是持久的。ZooKeeper中每个父节点会为它的一级子节点维护一份时序,记录每个子节点的先后顺序。ZooKeeper会为每个节点添加一个数字(10位长度左边以0填充的递增数字)后缀作为新的节点名,数字范围是整型最大值。如创建两个/nodetest/child节点,/nodetest下的节点是:

在这里插入图片描述

临时节点(EPHEMERAL):临时节点的生命周期与客户端会话绑定,如果创建节点的客户端会话失效(并不是断开连接),则节点就被清除掉。临时节点下不能创建子节点
临时顺序节点(EPHEMERAL_SEQUENTIAL):节点创建规则同持久顺序节点,只不过它是临时的。

2.2 Dubbo在ZooKeeper中的存储

Dubbo使用ZooKeeper作为注册中心,也是以节点的形式存储的: 根节点:在/dubbo下 一级节点时服务名(接口全路径)
二级节点下有四个子节点:consumers、configurators、routers、providers
Dubbo服务启动的时候会向/dubbo/${serviceName}/ providers下写入自己的URL地址,完成服务发布

2.3 ZooKeeper Watcher

客户端在向 ZooKeeper 服务器注册 Watcher 的同时,会将 Watcher 对象存储在客户端的 WatchManager中。当ZooKeeper 服务器触发 Watcher 事件后,会向客户端发送通知,客户端线程从 WatchManager的实现类中取出对应的 Watcher 对象来执行回调逻辑。
在这里插入图片描述

这个 Watcher 将作为整个 ZooKeeper会话期间的默认Watcher,会一直被保存在客户端 ZKWatchManager 的 defaultWatcher 中。另外,ZooKeeper
客户端也可以通过 getData、exists 和 getChildren 三个接口来向 ZooKeeper 服务器注册 Watcher。
无论是服务端还是客户端,一旦一个 Watcher 被触发,ZooKeeper 都会将其从相应的存储中移除。因此,在 Watcher的使用上是单次的,需要反复注册。这样的设计有效地减轻了服务端的压力。 触发Watcher回调的条件:
a) 客户端建立连接、断开连接
b) 节点数据发生变化
c) 节点本身发生变化

在这里插入图片描述

相关内容

热门资讯

Java二叉树的前中后序遍历 Java二叉树的前中后序遍历1.前序遍历1.1前序遍历概念1.2前序遍历习题2.中序遍历2.1中序遍...
电动汽车十大名牌排名及价格,纯... 今天给各位分享电动汽车十大名牌排名及价格,纯电动汽车排名及价格...的知识,其中也会对电动汽车十大名...
长安奔奔mini保养(长安奔奔... 本篇文章极速百科给大家谈谈长安奔奔mini保养,以及长安奔奔mini保养手册对应的知识点,希望对各位...
Python-06:异常、模块... 文章目录一、异常1.1 异常的概念1.2 捕获异常的语法1.3 代码演示1.4 异常的传递性二、模块...
满州是哪里(日本口中的满洲是哪... 今天给各位分享满州是哪里的知识,其中也会对日本口中的满洲是哪里进行解释,如果能碰巧解决你现在面临的问...
义乌交通违章查询,浙江义乌交通... 今天给各位分享义乌交通违章查询,浙江义乌交通违章查询的知识,其中也会对义乌违章查询入口进行解释,如果...
WEB安全 DIV CSS基础 1.DIV和CSS样式             层叠样式表(英文全称:Cascadin...
灵感来自游艇?聊天津一汽骏派C... 今天给各位分享灵感来自游艇?聊天津一汽骏派CX65设计的知识,其中也会对一汽骏派suv进行解释,如果...
汽车维修哪个学校比较好?(学汽... 今天给各位分享汽车维修哪个学校比较好?的知识,其中也会对学汽车维修哪个学校好,快来看看!进行解释,如...
科学技术的两面性是什么(科学技... 本篇文章极速百科给大家谈谈科学技术的两面性是什么,以及科学技术的两面性发言稿50字对应的知识点,希望...
京沪高速实时路况(京沪高速实时... 本篇文章极速百科给大家谈谈京沪高速实时路况,以及京沪高速实时路况今天封闭没有对应的知识点,希望对各位...
[刷题 java版] | 字节... 1.万万没想到之聪明的编辑我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件&...
#科研筑基# 吴恩达深度学习 ... 引例这门课的名字叫深度学习,为什么我们要先介绍神经网络呢?那是因为&#x...
vue3一天内快速学习 文章目录简介vue3 学习安装项目结构基础知识模版语法{{}}v-htmlv-bind渲染展示v-i...
特斯拉专题研究报告:特斯拉第三... 今天给各位分享特斯拉专题研究报告:特斯拉第三篇章展望的知识,其中也会对特斯拉研究成果进行解释,如果能...
高速免费提前几个小时(高速免费... 今天给各位分享高速免费提前几个小时的知识,其中也会对高速免费提前几个小时上高速进行解释,如果能碰巧解...
卡罗拉和朗逸怎么选哪个更值得入... 今天给各位分享卡罗拉和朗逸怎么选哪个更值得入手的知识,其中也会对卡罗拉和朗逸买哪个好更好进行解释,如...
MAC QT OpenGL 图... 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES...
海藻粉是什么东西(海藻粉是什么... 今天给各位分享海藻粉是什么东西的知识,其中也会对海藻粉是什么东西 宝宝能吃吗进行解释,如果能碰巧解决...
关于MGRE的OSPF建邻 我们以实验的方式直观的看一下OSPF在MGRE中的建邻。 首先介绍一下接口网络类型。 MGRE嘴上形...
MySQL和MariaDB,它... 目录 一、MySQL简介 二、MariaDB简介 三、什么是MariaDB? 四、为什么推出Mari...
羡慕的意思是什么(羡慕的意思是... 本篇文章极速百科给大家谈谈羡慕的意思是什么,以及羡慕的意思是什么最佳答案对应的知识点,希望对各位有所...
发蜡有什么作用(发蜡有什么作用... 今天给各位分享发蜡有什么作用的知识,其中也会对发蜡有什么作用和用途进行解释,如果能碰巧解决你现在面临...
欧洲杯几月开始几月结束(欧洲杯... 今天给各位分享欧洲杯几月开始几月结束的知识,其中也会对欧洲杯啥时候开始啥时候结束进行解释,如果能碰巧...
横滨轮胎型号及价格表(横滨轮胎... 今天给各位分享横滨轮胎型号及价格表的知识,其中也会对横滨轮胎型号性能介绍进行解释,如果能碰巧解决你现...
基于深度学习的跌倒检测系统(U... 摘要:跌倒监测系统用于智能化监测是否有行人跌倒,通过YOLOv5的深度学...
基于STM32 + FPGA ... 针对在软体机器人控制时,多电机协同控制过程中难度大、通用性差、协同性差等缺点ÿ...
【Docker】什么是Dock... 文章目录Docker出现的背景解决问题docker理念容器与虚拟机比较容器发展简史传统虚拟机技术容器...
五十万以内买SUV,这几款的第... 本篇文章极速百科给大家谈谈五十万以内买SUV,这几款的第三排都能坐成年人,以及五十万左右七座suv对...
一文说透!椭圆机适合什么人?对... 今天给各位分享一文说透!椭圆机适合什么人?对比动感单车、划船机与...的知识,其中也会对椭圆机是动感...