Zookeeper学习:开源客户端 ZkClient

本文介绍了开源Zookeeper客户端ZkClient的使用,包括创建会话、创建和删除节点、获取子节点以及监听节点数据变化和删除事件。ZkClient提供了一种更便捷的方式来操作Zookeeper,如自动处理Session超时和Watcher注册。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 简介

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

2. 准备工作

  • 导入依赖
<dependency>
	<groupId>com.101tec</groupId>
	<artifactId>zkclient</artifactId>
	<version>0.2</version>
</dependency>

3. 创建会话

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

package com.study.zkclient;

import org.I0Itec.zkclient.ZkClient;

public class CreateSession {


    /*
        借助zkclient完成会话的创建
     */
    public static void main(String[] args) {

        /*
            创建一个zkclient实例就可以完成连接,完成会话的创建
            serverString : 服务器连接地址

            注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
         */

        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        System.out.println("会话被创建了..");
    }

}

4. 创建节点

package com.study.zkclient;

import org.I0Itec.zkclient.ZkClient;

public class Create_Note {

    /*
        借助zkclient完成会话的创建
     */
    public static void main(String[] args) {

        /*
            创建一个zkclient实例就可以完成连接,完成会话的创建
            serverString : 服务器连接地址

            注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
         */

        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        System.out.println("会话被创建了..");

        //创建节点
        /*
            createParents : 是否要创建父节点,如果值为true,那么就会递归创建节点
         */
        zkClient.createPersistent("/sys-zkclient/c1",true);
        System.out.println("节点递归创建完成");
    }
}

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

5. 删除节点

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

package com.study.zkclient;

import org.I0Itec.zkclient.ZkClient;

public class Delete_Note {
    
    /*
        借助zkclient完成会话的创建
     */
    public static void main(String[] args) {

        /*
            创建一个zkclient实例就可以完成连接,完成会话的创建
            serverString : 服务器连接地址

            注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
         */

        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        System.out.println("会话被创建了..");

        // 递归删除节点
        String path = "/sys-zkclient/c1";
        zkClient.createPersistent(path+"/c11");
        zkClient.deleteRecursive(path);
        System.out.println("递归删除成功");

    }
}

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

6. 获取子节点

package com.study.zkclient;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;

import java.util.List;

public class Get_NoteChildren {


    /*
        借助zkclient完成会话的创建
     */
    public static void main(String[] args) throws InterruptedException {

        /*
            创建一个zkclient实例就可以完成连接,完成会话的创建
            serverString : 服务器连接地址

            注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
         */
        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        System.out.println("会话被创建了..");

        // 获取子节点列表
        List<String> children = zkClient.getChildren("/sys-zkclient");
        System.out.println(children);

        // 注册监听事件

        /*
            客户端可以对一个不存在的节点进行子节点变更的监听
            只要该节点的子节点列表发生变化,或者该节点本身被创建或者删除,都会触发监听
         */
        zkClient.subscribeChildChanges("/sys-zkclient-get", new IZkChildListener() {

            /*
                s : parentPath
                list : 变化后子节点列表
             */

            public void handleChildChange(String parentPath, List<String> list) throws Exception {
                System.out.println(parentPath + "的子节点列表发生了变化,变化后的子节点列表为"+ list);

            }
        });

        //测试
        zkClient.createPersistent("/sys-zkclient-get");
        Thread.sleep(1000);

        zkClient.createPersistent("/sys-zkclient-get/c1");
        Thread.sleep(1000);

    }
}

运行结果:

/zk-book 's child changed, currentChilds:[]
/zk-book 's child changed, currentChilds:[c1]
/zk-book 's child changed, currentChilds:[]
/zk-book 's child changed, currentChilds:null

结果表明∶

客户端可以对一个不存在的节点进行子节点变更的监听。

一旦客户端对一个节点注册了子节点列表变更监听之后,那么当该节点的子节点列表发生变更时,服务端都会通知客户端,并将最新的子节点列表发送给客户端

该节点本身的创建或删除也会通知到客户端。

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

package com.study.zkclient;

import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;

public class Note_API {


    /*
        借助zkclient完成会话的创建
     */
    public static void main(String[] args) throws InterruptedException {

        /*
            创建一个zkclient实例就可以完成连接,完成会话的创建
            serverString : 服务器连接地址

            注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
         */

        ZkClient zkClient = new ZkClient("39.106.101.9:2181");
        System.out.println("会话被创建了..");

        // 判断节点是否存在
        String path = "/sys-zkClient-Ep";
        boolean exists = zkClient.exists(path);

        if(!exists){
            // 创建临时节点
            zkClient.createEphemeral(path,"123");
        }
        // 读取节点内容
        Object o = zkClient.readData(path);
        System.out.println(o);

        // 注册监听
        zkClient.subscribeDataChanges(path, new IZkDataListener() {

            /*
                当节点数据内容发生变化时,执行的回调方法
                s: path
                o: 变化后的节点内容
             */
            public void handleDataChange(String s, Object o) throws Exception {
                System.out.println(s+"该节点内容被更新,更新的内容"+o);
            }

            /*
                当节点被删除时,会执行的回调方法
                s : path
             */
            public void handleDataDeleted(String s) throws Exception {
                System.out.println(s+"该节点被删除");
            }
        });

        // 更新节点内容
        zkClient.writeData(path,"456");
        Thread.sleep(1000);

        // 删除节点
        zkClient.delete(path);
        Thread.sleep(1000);
    }
}

运行结果:

123
/sys-zkClient-Ep该节点内容被更新,更新后的内容4567
/sys-zkClient-Ep 该节点被删除

结果表明可以成功监听节点数据变化或删除事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值