zkClient

直接使用zk的api实现业务功能比较繁琐。因为要处理session loss,session expire等异常,在发生这些异常后进行重连。又因为ZK的watcher是一次性的,如果要基于wather实现发布/订阅模式,还要自己包装一下,将一次性订阅包装成持久订阅。另外如果要使用抽象级别更高的功能,比如分布式锁,leader选举等,还要自己额外做很多事情。这里介绍下ZK的第三方客户端包装小工具,可以分别解决上述小问题。

zkClient

zkClient主要做了两件事情。一件是在session loss和session expire时自动创建新的ZooKeeper实例进行重连。另一件是将一次性watcher包装为持久watcher。后者的具体做法是简单的在watcher回调中,重新读取数据的同时再注册相同的watcher实例。

zkClient简单的使用样例如下:

public static void testzkClient(final String serverList) {
        ZkClient zkClient4subChild = new ZkClient(serverList);
        zkClient4subChild.subscribeChildChanges(PATH, new IZkChildListener() {
            @Override
            public void handleChildChange(String parentPath, List currentChilds) throws Exception {
                System.out.println(prefix() + "clildren of path " + parentPath + ":" + currentChilds);
            }
        });

上面是订阅children变化,下面是订阅数据变化

ZkClient zkClient4subData = new ZkClient(serverList);
        zkClient4subData.subscribeDataChanges(PATH, new IZkDataListener() {
            @Override
            public void handleDataChange(String dataPath, Object data) throws Exception {
                System.out.println(prefix() + "Data of " + dataPath + " has changed");
            }

            @Override
            public void handleDataDeleted(String dataPath) throws Exception {
                System.out.println(prefix() + dataPath + " has deleted");
            }
        });

订阅连接状态的变化:

ZkClient zkClient4subStat = new ZkClient(serverList);
        zkClient4subStat.subscribeStateChanges(new IZkStateListener() {
            @Override
            public void handleNewSession() throws Exception {
                System.out.println(prefix() + "handleNewSession()");
            }

            @Override
            public void handleStateChanged(KeeperState stat) throws Exception {
                System.out.println(prefix() + "handleStateChanged,stat:" + stat);
            }
        });

zkClient除了做了一些便捷包装之外,对watcher使用做了一点增强。比如subscribeChildChanges实际上是通过exists和getChildren关注了两个事件。这样当create(“/path”)时,对应path上通过getChildren注册的listener也会被调用。另外subscribeDataChanges实际上只是通过exists注册了事件。因为从上表可以看到,对于一个更新,通过exists和getData注册的watcher要么都会触发,要么都不会触发

<think>好的,用户想了解关于ZKClient在Apache ZooKeeper客户端库中的使用和示例。首先,我需要明确ZKClient是什么,它和Curator这样的其他ZooKeeper客户端框架有什么不同。根据引用[2],Curator是Netflix开源的,解决了很多底层问题,而用户提到的ZKClient可能是一个更基础的客户端工具。 接下来,我需要确认用户的需求。他们可能是在寻找如何使用ZKClient的具体例子,比如连接ZooKeeper、创建节点、监听事件等。同时,用户可能想知道ZKClient的优缺点,或者与Curator的对比,但根据引用[2],Curator被高度评价,可能ZKClient在某些方面较为基础,需要更多手动处理。 然后,我需要检查是否有相关的引用内容可以支持回答。引用[3]提到了ZooKeeper的测试故障转移,这可能和客户端的使用有关,但具体到ZKClient的信息可能需要依赖外部知识。不过根据现有引用,引用[2]直接提到了Curator,而用户可能混淆了ZKClient和Curator,或者想了解两者的区别。 因此,在回答中需要区分ZKClient和Curator,指出ZKClient是原生的客户端,而Curator是更高级的封装。同时,给出ZKClient的基本使用示例,比如创建客户端实例、节点操作、监听器等。可能还需要提到ZKClient的局限性,比如需要手动处理重连和异常,而Curator则解决了这些问题,如引用[2]所述。 另外,需要确保回答符合格式要求,比如行内公式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学公式,所以可能不需要。同时生成相关问题,比如ZKClient和Curator的区别,使用场景,常见问题等。 最后,确保引用正确,引用[2]提到Curator,可能在相关问题中引用到,而引用[3]的故障转移可能和ZooKeeper客户端的使用相关,但需要看是否直接关联。</think>### ZKClient在Apache ZooKeeper中的使用与示例 ZKClient是Apache ZooKeeper的原生客户端库之一,用于与ZooKeeper集群进行交互。它提供了基础的API,但相比Curator等高级框架(如引用[2]所述),需要开发者自行处理更多底层细节。 #### 1. ZKClient核心功能 - **连接管理**:支持集群地址配置和会话超时设置 - **节点操作**:包括创建(持久/临时节点)、读取、更新、删除(ZNode) - **事件监听**:通过Watcher机制实现节点变更通知 - **序列化支持**:内置Java对象序列化/反序列化 #### 2. 基础使用示例 ```java // 创建客户端 ZkClient zkClient = new ZkClient("localhost:2181", 5000); // 创建持久节点 String path = "/testNode"; zkClient.createPersistent(path, "初始数据".getBytes()); // 读取节点数据 byte[] data = zkClient.readData(path); System.out.println(new String(data)); // 输出: 初始数据 // 注册Watcher监听 zkClient.subscribeDataChanges(path, new IZkDataListener() { @Override public void handleDataChange(String path, Object data) { System.out.println("数据变更: " + new String((byte[])data)); } @Override public void handleDataDeleted(String path) { System.out.println("节点已删除"); } }); // 更新节点数据 zkClient.writeData(path, "更新数据".getBytes()); ``` #### 3. 重要注意事项 - **连接重试**:需要自行实现断连重试逻辑(Curator已封装此功能[^2]) - **异常处理**:需处理`ZkInterruptedException`、`ZkNoNodeException`等异常 - **序列化限制**:默认使用JdkSerializer,复杂对象建议自定义序列化器 - **性能优化**:合理设置`ZKClientConfig`参数如`ZkSerializer`、`OperationRetryTimeout` #### 4. 与Curator的对比 | 特性 | ZKClient | Curator[^2] | |--------------------|-----------------------------|--------------------------| | 连接管理 | 基础重连机制 | 自动重连+指数退避 | | 监听器注册 | 需手动重新注册 | 永久Watcher模式 | | 事务支持 | 无 | 提供事务构建器 | | 使用复杂度 | 较低级API | 高层抽象接口 | | 社区支持 | 官方基础实现 | Netflix维护+活跃社区 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值