1 注册中心的原理

Zookeeper之ZKClient入门 - 图22 环境准备

需要一台linux
linux安装zookeeper,教程详情
https://blog.csdn.net/qq_41520636/article/details/114959972

3 下载ZooInspector可视化工具

下载地址: https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
Zookeeper之ZKClient入门 - 图3

双击zookeeper-dev-ZooInspector.jar打开
Zookeeper之ZKClient入门 - 图4

输入ip和过期时间
Zookeeper之ZKClient入门 - 图5

建立连接,里面的dubbo是我前面练习产生的数据,如果没有使用过zookeeper,那么服务地址 只有zookeeper这个文件目录。

Zookeeper之ZKClient入门 - 图6

4 ZKClient的使用

导入pom.xml

  1. <dependency>
  2. <groupId>com.101tec</groupId>
  3. <artifactId>zkclient</artifactId>
  4. <version>0.11</version>
  5. </dependency>

注意:在注册中心的服务地址是唯一的,不能重复创建。

4.1 创建持久化节点

  1. public class ZKUtils {
  2. public static void main(String[] args) {
  3. // uri
  4. String ZKServer = "192.168.135.20:2181";
  5. // 创建会话
  6. ZkClient zkClient = new ZkClient(ZKServer);
  7. // 1.创建持久化节点(创建后,即便客户端与服务端断开连接,该节点依然存在)
  8. zkClient.createPersistent("/http");
  9. }
  10. }

结果

23:44:47.104 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df001b, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,95,0 request:: ‘/http,,v{s{31,s{‘world,’anyone}}},0 response:: ‘/http

Zookeeper之ZKClient入门 - 图7

4.2 创建普通节点

  1. public class ZKUtils {
  2. public static void main(String[] args) {
  3. // uri
  4. String ZKServer = "192.168.135.20:2181";
  5. // 创建会话
  6. ZkClient zkClient = new ZkClient(ZKServer);
  7. String s = zkClient.create(uri, "/dubbo/123", CreateMode.EPHEMERAL);
  8. }
  9. }

结果

23:50:22.145 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df001c, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,98,0 request:: ‘/dubbo/com.hikktn.service.TestService,#ffffffacffffffed05740a2f647562626f2f313233,v{s{31,s{‘world,’anyone}}},1 response:: ‘/dubbo/com.hikktn.service.TestService

Zookeeper之ZKClient入门 - 图8
几秒钟后,数据已经失效

Zookeeper之ZKClient入门 - 图9

4.3 创建临时节点

  1. public class ZKUtils {
  2. public static void main(String[] args) {
  3. // uri
  4. String ZKServer = "192.168.135.20:2181";
  5. // 创建会话
  6. ZkClient zkClient = new ZkClient(ZKServer);
  7. zkClient.createEphemeral("/dubbo/localhost:8888");
  8. }
  9. }

结果

00:03:14.657 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df001e, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,104,0 request:: ‘/dubbo/localhost:8888,,v{s{31,s{‘world,’anyone}}},1 response:: ‘/dubbo/localhost:8888

也会在几秒钟后失效。

Zookeeper之ZKClient入门 - 图10

4.4 创建普通节点-写入序列化对象数据

  1. import java.io.Serializable;
  2. public class User implements Serializable {
  3. private Integer id;
  4. private String name;
  5. public Integer getId() {
  6. return id;
  7. }
  8. public void setId(Integer id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. }
  1. public class ZKUtils {
  2. public static void main(String[] args) {
  3. // uri
  4. String ZKServer = "192.168.135.20:2181";
  5. // 创建会话
  6. ZkClient zkClient = new ZkClient(ZKServer,10000,10000,new SerializableSerializer());
  7. User user =new User();
  8. user.setId(1);
  9. user.setName("张三");
  10. String path = zkClient.create("/dubbo/com.hikktn.service.TestService", user, CreateMode.PERSISTENT);
  11. System.out.println(path);
  12. }
  13. }

结果

00:07:43.369 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df001f, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,107,0 request:: ‘/dubbo/com.hikktn.service.TestService,#ffffffacffffffed057372015636f6d2e68696b6b746e2e7574696c732e55736572ffffffa62b36ffffff8652ffffffdeffffffb0582024c026964740134c6a6176612f6c616e672f496e74656765723b4c046e616d65740124c6a6176612f6c616e672f537472696e673b787073720116a6176612e6c616e672e496e746567657212ffffffe2ffffffa0ffffffa4fffffff7ffffff81ffffff8738201490576616c756578720106a6176612e6c616e672e4e756d626572ffffff86ffffffacffffff951dbffffff94ffffffe0ffffff8b200787000017406ffffffe5ffffffbcffffffa0ffffffe4ffffffb8ffffff89,v{s{31,s{‘world,’anyone}}},0 response:: ‘/dubbo/com.hikktn.service.TestService

Zookeeper之ZKClient入门 - 图11

4.5 获取子节点内容

Zookeeper之ZKClient入门 - 图12

  1. public class ZKUtils {
  2. public static void main(String[] args) {
  3. // uri
  4. String ZKServer = "192.168.135.20:2181";
  5. // 创建会话
  6. ZkClient zkClient = new ZkClient(ZKServer,5000,100000);
  7. List<String> children = zkClient.getChildren("/dubbo/localhost:8888");
  8. children.forEach((k) ->{
  9. System.out.println(k);
  10. });
  11. }
  12. }

结果

00:28:21.647 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df0024, packet:: clientPath:null serverPath:null finished:false header:: 1,8 replyHeader:: 1,121,0 request:: ‘/dubbo/com.hikktn.service.TestService,F response:: v{‘localhost:8889,’localhost:8888}
localhost:8889
localhost:8888

4.6 获取序列化的内容

注意:必须是序列化的数据才能读取出来

  1. public class ZKUtils {
  2. public static void main(String[] args) {
  3. // uri
  4. String ZKServer = "192.168.135.20:2181";
  5. ZkClient zkClient = new ZkClient(ZKServer,5000,100000,new SerializableSerializer());
  6. User user = zkClient.readData("/dubbo/com.hikktn.service.TestService");
  7. System.out.println(user.getId()+":"+user.getName());
  8. }
  9. }

结果

00:33:21.553 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df0025, packet:: clientPath:null serverPath:null finished:false header:: 1,4 replyHeader:: 1,123,0 request:: ‘/dubbo/com.hikktn.service.TestService,F response:: #ffffffacffffffed057372015636f6d2e68696b6b746e2e7574696c732e55736572ffffffa62b36ffffff8652ffffffdeffffffb0582024c026964740134c6a6176612f6c616e672f496e74656765723b4c046e616d65740124c6a6176612f6c616e672f537472696e673b787073720116a6176612e6c616e672e496e746567657212ffffffe2ffffffa0ffffffa4fffffff7ffffff81ffffff8738201490576616c756578720106a6176612e6c616e672e4e756d626572ffffff86ffffffacffffff951dbffffff94ffffffe0ffffff8b200787000017406ffffffe5ffffffbcffffffa0ffffffe4ffffffb8ffffff89,s{107,107,1616170063293,1616170063293,0,2,0,0,183,2,110}
1:张三

4.7 订阅节点

  1. public class ZKUtils {
  2. public static void main(String[] args) {
  3. // uri
  4. String ZKServer = "192.168.135.20:2181";
  5. ZkClient zkClient = new ZkClient(ZKServer,5000,100000,new SerializableSerializer());
  6. String uri ="/dubbo/com.hikktn.service.TestService";
  7. // 创建会话
  8. ZkClient zkClient = new ZkClient(zkServer,10000,10000,new SerializableSerializer());
  9. zkClient.subscribeChildChanges(uri, new IZkChildListener() {
  10. @Override
  11. public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
  12. System.out.println("该节点里面有变化"+parentPath);
  13. System.out.println("该节点当前的子节点发生变化"+currentChilds);
  14. }
  15. });
  16. try {
  17. System.in.read();
  18. } catch (IOException e) {
  19. e.printStackTrace();
  20. }
  21. }
  22. }

删除了节点:localhost:8888

Zookeeper之ZKClient入门 - 图13
结果

00:53:21.581 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df0028, packet:: clientPath:null serverPath:null finished:false header:: 3,3 replyHeader:: 3,132,0 request:: ‘/dubbo/com.hikktn.service.TestService,T response:: s{107,128,1616170063293,1616172655802,1,3,0,0,183,1,131}
00:53:21.584 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df0028, packet:: clientPath:null serverPath:null finished:false header:: 4,8 replyHeader:: 4,132,0 request:: ‘/dubbo/com.hikktn.service.TestService,T response:: v{‘localhost:8889}
该节点里面有变化/dubbo/com.hikktn.service.TestService
该节点当前的子节点发生变化[localhost:8889]

4.8 订阅节点内容出现变化

  1. public class ZKUtils {
  2. public static void main(String[] args) {
  3. // uri
  4. String ZKServer = "192.168.135.20:2181";
  5. ZkClient zkClient = new ZkClient(ZKServer,5000,100000,new SerializableSerializer());
  6. String uri ="/dubbo/com.hikktn.service.TestService";
  7. // 创建会话
  8. ZkClient zkClient = new ZkClient(zkServer,10000,10000,new SerializableSerializer());
  9. zkClient.subscribeDataChanges(uri, new IZkDataListener() {
  10. @Override
  11. public void handleDataChange(String path, Object data) throws Exception {
  12. System.out.println("节点里面的数据发生变化的地址"+path);
  13. System.out.println("节点里面的数据发生变化具体内容"+data.toString());
  14. }
  15. @Override
  16. public void handleDataDeleted(String path) throws Exception {
  17. System.out.println("节点里面的数据被删除了"+path);
  18. }
  19. });
  20. }
  21. }

4.9 更新和删除节点

  1. public class ZKUtils {
  2. public static void main(String[] args) {
  3. // uri
  4. String ZKServer = "192.168.135.20:2181";
  5. ZkClient zkClient = new ZkClient(ZKServer,5000,100000,new SerializableSerializer());
  6. String uri ="/dubbo/com.hikktn.service.TestService";
  7. // 创建会话
  8. ZkClient zkClient = new ZkClient(zkServer,10000,10000,new SerializableSerializer());
  9. // 判断节点是否存在
  10. boolean exists = zkClient.exists(uri);
  11. if (exists){
  12. User user =new User();
  13. user.setId(2);
  14. user.setName("李四");
  15. // 写入节点(会直接覆盖)
  16. zkClient.writeData(uri,user);
  17. }else {
  18. // 删除节点
  19. zkClient.delete(uri);
  20. zkClient.deleteRecursive(uri);
  21. }
  22. }
  23. }