• Zookeeper-开源客户端 之 ZkClient


            ZkClient是Github上⼀个开源的zookeeper客户端,在Zookeeper原生API接口之上进行了包装,是⼀个更易用的Zookeeper客户端,同时,zkClient在内部还实现了诸如Session超时重连、Watcher反复注册等功能

            接下来,还是从创建会话、创建节点、读取数据、更新数据、删除节点等方面来介绍如何使用zkClient 这个zookeeper客户端

    添加依赖:

            在pom.xml⽂件中添加如下内容

    1. <dependency>
    2. <groupId>com.101tecgroupId>
    3. <artifactId>zkclientartifactId>
    4. <version>0.2version>
    5. dependency>

    1、创建会话

    使⽤ZkClient可以轻松的创建会话,连接到服务端

    1. package com.lagou.zkClient;
    2. import org.I0Itec.zkclient.ZkClient;
    3. public class CreateSession {
    4. /*
    5. 借助zkClient完成会话创建
    6. */
    7. public static void main(String[] args) {
    8. /**
    9. * 创建一个zkClient实例就可以完成连接,完成会话的创建
    10. * serverString : 服务器连接地址
    11. * 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了
    12. */
    13. ZkClient zkClient = new ZkClient("127.0.0.1:2181");
    14. System.out.println("会话被创建了...");
    15. }
    16. }

    2、创建节点

    ZkClient提供了递归创建节点的接口,即其帮助开发者先完成父节点的创建,再创建子节点

    1. package com.lagou.zkClient;
    2. import org.I0Itec.zkclient.ZkClient;
    3. public class CreateNote {
    4. /*
    5. 借助zkClient完成会话创建
    6. */
    7. public static void main(String[] args) {
    8. /**
    9. * 创建一个zkClient实例就可以完成连接,完成会话的创建
    10. * serverString : 服务器连接地址
    11. * 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了
    12. */
    13. ZkClient zkClient = new ZkClient("127.0.0.1:2181");
    14. System.out.println("会话被创建了...");
    15. // 创建节点
    16. /**
    17. * createParents:是否要创建父节点,如果值为true,则就会递归创建节点
    18. */
    19. zkClient.createPersistent("/lg-zkClient/lg-c1", true);
    20. System.out.println("节点递归创建完成");
    21. }
    22. }

    值得注意的是,在原生态接口中是无法创建成功的(⽗节点不存在),但是通过ZkClient通过设置createParents参数为true可以递归的先创建父节点,再创建子节点

    3、删除节点

    ZkClient提供了递归删除节点的接口,即其帮助开发者先删除所有子节点(存在),再删除父节点

    1. package com.lagou.zkClient;
    2. import org.I0Itec.zkclient.ZkClient;
    3. public class DeleteNote {
    4. /*
    5. 借助zkClient完成会话创建
    6. */
    7. public static void main(String[] args) {
    8. /**
    9. * 创建一个zkClient实例就可以完成连接,完成会话的创建
    10. * serverString : 服务器连接地址
    11. * 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了
    12. */
    13. ZkClient zkClient = new ZkClient("127.0.0.1:2181");
    14. System.out.println("会话被创建了...");
    15. // 递归删除子节点
    16. String path = "/lg-zkClient/lg-c1";
    17. zkClient.createPersistent(path+"/c11");
    18. zkClient.deleteRecursive(path);
    19. System.out.println("递归删除成功");
    20. }
    21. }

    结果表明ZkClient可直接删除带子节点的⽗节点,因为其底层先删除其所有子节点,然后再删除父节点

    4、获取子节点

    1. package com.lagou.zkClient;
    2. import org.I0Itec.zkclient.IZkChildListener;
    3. import org.I0Itec.zkclient.ZkClient;
    4. import java.util.List;
    5. public class Get_NoteChildren {
    6. /*
    7. 借助zkClient完成会话创建
    8. */
    9. public static void main(String[] args) throws InterruptedException {
    10. /**
    11. * 创建一个zkClient实例就可以完成连接,完成会话的创建
    12. * serverString : 服务器连接地址
    13. * 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了
    14. */
    15. ZkClient zkClient = new ZkClient("127.0.0.1:2181");
    16. System.out.println("会话被创建了...");
    17. // 获取子节点列表
    18. List children = zkClient.getChildren("/lg-zkClient");
    19. System.out.println(children);
    20. // 注册监听对象
    21. /*
    22. 客户端可以对一个不存在的节点进行子节点变更的监听
    23. 只要该节点的子节点的列表发生变化,或者该节点本身被创建或则删除,都会触发监听
    24. */
    25. zkClient.subscribeChildChanges("/lg-zkClient-get", new IZkChildListener() {
    26. /**
    27. * @param list : 变化后的子节点列表
    28. */
    29. @Override
    30. public void handleChildChange(String parentPath, List list) throws Exception {
    31. System.out.println(parentPath + "的子节点列表发生了变化,变化后的子节点列表为" + list);
    32. }
    33. });
    34. // 测试
    35. zkClient.createPersistent("/lg-zkClient-get");
    36. Thread.sleep(1000);
    37. zkClient.createPersistent("/lg-zkClient-get/c1");
    38. Thread.sleep(1000);
    39. }
    40. }

    结果表明:客户端可以对⼀个不存在的节点进行子节点变更的监听。⼀旦客户端对⼀个节点注册了子节点列表变更监听之后,那么当该节点的子节点列表发生变更时,服务端都会通知客户端,并将最新的子节点列表发送给客户端,该节点本身的创建或删除也会通知到客户端。

    5、获取数据(节点是否存在、更新、删除)

    1. package com.lagou.zkClient;
    2. import org.I0Itec.zkclient.IZkDataListener;
    3. import org.I0Itec.zkclient.ZkClient;
    4. public class Note_API {
    5. /*
    6. 借助zkClient完成会话创建
    7. */
    8. public static void main(String[] args) throws InterruptedException {
    9. /**
    10. * 创建一个zkClient实例就可以完成连接,完成会话的创建
    11. * serverString : 服务器连接地址
    12. * 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了
    13. */
    14. ZkClient zkClient = new ZkClient("127.0.0.1:2181");
    15. System.out.println("会话被创建了...");
    16. // 创建节点
    17. /**
    18. * createParents:是否要创建父节点,如果值为true,则就会递归创建节点
    19. */
    20. zkClient.createPersistent("/lg-zkClient/lg-c1", true);
    21. System.out.println("节点递归创建完成");
    22. // 判断节点是否存在
    23. String path = "/lg-zkClient-Ep";
    24. boolean exists = zkClient.exists(path);
    25. if (!exists) {
    26. // 创建临时节点
    27. zkClient.createEphemeral(path, "123");
    28. }
    29. // 读取节点内容
    30. Object o = zkClient.readData(path);
    31. System.out.println(o);
    32. // 注册监听
    33. zkClient.subscribeDataChanges(path, new IZkDataListener() {
    34. /*
    35. 当节点数据内容发生变化时,执行的回调方法
    36. s : path
    37. o : 变化后的节点内容
    38. */
    39. @Override
    40. public void handleDataChange(String s, Object o) throws Exception {
    41. System.out.println(s + ":该节点内容被更新,更新后的内容:" + o);
    42. }
    43. /*
    44. 当节点被删除时,会执行的回调方法
    45. s : path
    46. */
    47. @Override
    48. public void handleDataDeleted(String s) throws Exception {
    49. System.out.println(s + ":该节点被删除");
    50. }
    51. });
    52. // 更新节点内容
    53. zkClient.writeData(path, "456");
    54. Thread.sleep(2000);
    55. // 删除节点
    56. zkClient.delete(path);
    57. Thread.sleep(2000);
    58. }
    59. }

  • 相关阅读:
    网页拒绝连接,怎么办怎么办
    秘密交易室
    Vue学习第17天——netTick()的原理及使用
    双目立体匹配算法:Patch Match Stereo详解
    创建符合 Web 可访问性标准的 HTML 布局
    JS——函数相关知识汇总
    [附源码]java毕业设计医药管理系统
    Desthiobiotin衍生物Desthiobiotin-PEG4-Amine/Alkyne/Azide/DBCO
    2023高教社杯全国大学生数学建模竞赛E题代码解析
    Axios使用固定session发送http请求
  • 原文地址:https://blog.csdn.net/weixin_52851967/article/details/126263824