七:zooKeeper开源客户端ZkClient的api测试

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: ZkClient是Gitthub上一个开源的ZooKeeper客户端。ZKClient在ZooKeeper原生API接口之上进行了包装,是一个更加易用的ZooKeeper客户端。同时ZKClient在内部实现诸如Session超时重连,Watcher反复注册等功能。

ZkClient是Gitthub上一个开源的ZooKeeper客户端。ZKClient在ZooKeeper原生API接口之上进行了包装,是一个更加易用的ZooKeeper客户端。同时ZKClient在内部实现诸如Session超时重连,Watcher反复注册等功能。

一:maven依赖

 1  <dependency>
 2       <groupId>org.apache.zookeeper</groupId>
 3       <artifactId>zookeeper</artifactId>
 4       <version>3.4.6</version>
 5     </dependency>
 6     <dependency>
 7       <groupId>com.101tec</groupId>
 8       <artifactId>zkclient</artifactId>
 9       <version>0.5</version>
10     </dependency>
View Code

二:一个java存储实体

 1 package com.yeepay.sxf.testZkClient;
 2 
 3 import java.io.Serializable;
 4 
 5 
 6 /**
 7  * 用户对象
 8  * @author sxf
 9  *
10  */
11 public class User implements Serializable{
12     private int id;
13     private String name;
14     private String address;
15     
16     
17     public int getId() {
18         return id;
19     }
20     public void setId(int id) {
21         this.id = id;
22     }
23     public String getName() {
24         return name;
25     }
26     public void setName(String name) {
27         this.name = name;
28     }
29     public String getAddress() {
30         return address;
31     }
32     public void setAddress(String address) {
33         this.address = address;
34     }
35     
36 }
View Code

三:测试源代码

  1 package com.yeepay.sxf.testZkClient;
  2 
  3 import java.util.List;
  4 
  5 import org.I0Itec.zkclient.IZkChildListener;
  6 import org.I0Itec.zkclient.IZkDataListener;
  7 import org.I0Itec.zkclient.ZkClient;
  8 import org.I0Itec.zkclient.serialize.BytesPushThroughSerializer;
  9 import org.apache.zookeeper.CreateMode;
 10 import org.apache.zookeeper.data.Stat;
 11 /**
 12  * zkclient的api测试
 13  * acl权限相关操作和原生zookeeper客户端一样
 14  * @author sxf
 15  *
 16  */
 17 public class CreateSession {
 18 
 19     public static void main(String[] args) throws InterruptedException {
 20         //第一个参数:zk的ip:端口号
 21         //会话过期时间
 22         //链接超时时间
 23         //序列化器(将java对象转化成byte数组,得到时从byte数组反序列化成java对象)这个序列化器在事件订阅上,修改数据一定要保持一致,否则无效果
 24         //ZkClient zkClient=new ZkClient("10.151.30.75:2181", 10000, 10000, new SerializableSerializer());
 25         
 26         //这个客户端链接,传入的序列化器皿等于什么都没做
 27         ZkClient zkClient=new ZkClient("10.151.30.75:2181", 10000, 10000, new BytesPushThroughSerializer());
 28         
 29         //创建一个节点
 30         //createNode(zkClient);
 31         
 32         //获取一个节点中存取的值
 33         //getNodeValue(zkClient);
 34         
 35         //获取一个节点下的子节点列表
 36         //getNodeChildList(zkClient);
 37         
 38         //判断一个节点是否存在
 39         //isNodeExists(zkClient);
 40         
 41         //删除一个节点
 42         //deleteNode(zkClient);
 43         
 44         //修改一个节点的数据
 45         //updateNodeValue(zkClient);
 46         
 47         //为某个节点的子节点列表发生变化订阅一个事件
 48         //whenChildListChangeThenDoSomeThing(zkClient);
 49         
 50         //为某个节点存储的值发生变化或者节点被删除订阅一个事件
 51         whenNodeValueChangeThenDoThing(zkClient);
 52         
 53         Thread.sleep(Integer.MAX_VALUE);
 54     }
 55     
 56     
 57     /**
 58      * 创建一个node节点
 59      * @param zkClient
 60      */
 61     public static void createNode(ZkClient zkClient){
 62         //user 对象必须实现序列化接口Serializable
 63         User user=new User();
 64         user.setId(1);
 65         user.setName("shangxiaofei");
 66         user.setAddress("smx");
 67         //(节点路径,节点数据,持久节点)
 68         String path=zkClient.create("/node_131", user, CreateMode.PERSISTENT);
 69         System.out.println("CreateSession.createNode(创建节点路径为:)"+path);
 70     }
 71     
 72     /**
 73      * 获取一个节点中存取的值
 74      * @param zkClient
 75      */
 76     public static void getNodeValue(ZkClient zkClient){
 77         
 78         Stat stat=new Stat();
 79         //获取一个节点中存取的值
 80         User user=zkClient.readData("/node_131",stat);
 81         System.out.println("CreateSession.getNodeValue(id==>)"+user.getId());
 82         System.out.println("CreateSession.getNodeValue(name==>)"+user.getName());
 83         System.out.println("CreateSession.getNodeValue(address==>)"+user.getAddress());
 84         System.out.println("CreateSession.getNodeValue(节点状态==>)"+stat);
 85     }
 86     
 87     /**
 88      * 获取某个节点的子节点列表
 89      * @param zkClient
 90      */
 91     public static void getNodeChildList(ZkClient zkClient){
 92         
 93         List<String> nodesList=zkClient.getChildren("/");
 94         System.out.println("CreateSession.getNodeChildList(“/”下的子节点列表为=>)"+nodesList);
 95     }
 96     
 97     /**
 98      * 检测某一个节点是否存在
 99      * @param zkClient
100      */
101     public static void isNodeExists(ZkClient zkClient){
102         boolean flag=zkClient.exists("/node_132");
103         System.out.println("CreateSession.isNodeExists(节点是否存在的结果)"+flag);
104     }
105     
106     
107     /**
108      * 删除一个节点或删除存在子节点的节点
109      * @param zkClient
110      */
111     public static void deleteNode(ZkClient zkClient){
112         //删除无子节点的节点。如果存在子节点,抛出异常
113         boolean flag=zkClient.delete("/node_131");
114         System.out.println("CreateSession.deleteNode(删除无子节点的节点结果==>)"+flag);
115             
116         //删除存在子节点的节点。先深入子节点,删除掉所有子节点的节点,再删除当前节点
117         boolean flag2=zkClient.deleteRecursive("/node_131");
118         System.out.println("CreateSession.deleteNode(删除存在子节点的节点结果==>)"+flag2);
119     }
120     
121     /**
122      * 修改一个数据节点中存储的值
123      * @param zkClient
124      */
125     public static void updateNodeValue(ZkClient zkClient){
126         User user=new User();
127         user.setId(100);
128         user.setName("shangxiaoshuai");
129         user.setAddress("smxcyxzyc");
130         //修改一个节点中存储的数据
131         zkClient.writeData("/node_131", user);
132         
133         //修改一个节点中存储的数据,实现类似乐观锁的功能
134         zkClient.writeData("/node_131", user, 1);
135     }
136     
137     
138     /**
139      * 当子节点列表发生变化,则触发一个事件
140      */
141     public static void whenChildListChangeThenDoSomeThing(ZkClient zkClient){
142         /**
143          * 可以监听(1)子节点列表发生变化,增加新子节点,删除子节点
144          * (2)节点本身被删除
145          *    (3)节点本身被创建,意味着可以订阅一个并不存在的节点的监听事件
146          */
147                         
148         zkClient.subscribeChildChanges("/node_132", new WhenChildChangeThing());
149     }
150     /**
151      * 当子节点列表发生变化的事件实现类
152      * @author sxf
153      *
154      */
155     private static class WhenChildChangeThing implements IZkChildListener{
156 
157         @Override
158         public void handleChildChange(String parentPath,List<String> currentChilds) throws Exception {
159                 System.out.println("节点列表变化的父节点路径==>"+parentPath);
160                 System.out.println("当前的节点列表==>"+currentChilds);
161         }
162         
163     }
164     
165     /**
166      * 为节点数据内容发生变化订阅一个事件
167      * @param zkClient
168      */
169     public static void whenNodeValueChangeThenDoThing(ZkClient zkClient){
170         zkClient.subscribeDataChanges("/node_132", new WhenNodeValueChange());
171     }
172     /**
173      * 当数据节点存储的值发生变化的事件监听类
174      * @author sxf
175      *
176      */
177     private static class WhenNodeValueChange implements IZkDataListener{
178 
179         //当节点数据内容发生变化这个函数被调用
180         @Override
181         public void handleDataChange(String dataPath, Object data)
182                 throws Exception {
183             System.out.println("节点数据内容发生变化,变化后的值为==>"+data);
184             System.out.println("节点数据内容发生变化,变化节点的路径==>"+dataPath);
185         }
186 
187         //当节点被删除时这个函数被调用
188         @Override
189         public void handleDataDeleted(String dataPath) throws Exception {
190             System.out.println("节点被删除的路径为==>"+dataPath);
191         }
192         
193     }
194 }
View Code

 

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
2月前
|
前端开发 JavaScript API
基于React的简易REST API客户端设计与实现
基于React的简易REST API客户端设计与实现
25 3
|
3天前
|
网络协议 Dubbo Java
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器
9 0
|
19天前
|
JSON 测试技术 API
Python的Api自动化测试使用HTTP客户端库发送请求
【4月更文挑战第18天】在Python中进行HTTP请求和API自动化测试有多个库可选:1) `requests`是最流行的选择,支持多种请求方法和内置JSON解析;2) `http.client`是标准库的一部分,适合需要低级别控制的用户;3) `urllib`提供URL操作,适用于复杂请求;4) `httpx`拥有类似`requests`的API,提供现代特性和异步支持。根据具体需求选择,如多数情况`requests`已足够。
15 3
|
23天前
|
Java API Apache
ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
【4月更文挑战第11天】ZooKeeper【基础 03】Java 客户端 Apache Curator 基础 API 使用举例(含源代码)
33 11
|
1月前
|
存储
ZooKeeper客户端常用命令
ZooKeeper客户端常用命令
28 1
|
1月前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
124 2
|
4月前
|
消息中间件 Java 网络安全
JAVAEE分布式技术之Zookeeper的第一次课
JAVAEE分布式技术之Zookeeper的第一次课
71 0
|
2月前
|
监控 NoSQL Java
Zookeeper分布式锁
Zookeeper分布式锁
90 1
|
4月前
|
监控 Dubbo Java
深入理解Zookeeper系列-2.Zookeeper基本使用和分布式锁原理
深入理解Zookeeper系列-2.Zookeeper基本使用和分布式锁原理
63 0
|
4月前
|
NoSQL 中间件 API
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)(下)
分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)
86 2

热门文章

最新文章