Zookeeper学习之路——ZKClient操作Zookeeper

ZKClient介绍

ZKClient是Github上一个开源的ZooKeeper客户端,是由Datameer的工程师Stefan Groschupf和Peter Voss一起开发的。ZKClient是在原生的ZooKeeper接口上做了一次包装,使得一些方法对于开发人员透明,方法更加易用。

ZKClient的maven依赖

<dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
</dependency>

建立会话连接

跟原生的ZooKeeper接口方法相比,ZKClient的方法更加易用,ZKClient将ZooKeeper的异步调用,封装成了同步调用,将原来的异步对开发人员透明化,这样开发人员不在需要写一些相关的异步阻塞唤醒之类的代码。两者的最大区别在于在连接的构造方法中不在需要提供传入的Watcher对象参数,ZKClient从内部为我们引入了Listener来实现Watcher的注册。

package zkclient;

import org.I0Itec.zkclient.ZkClient;

public class CreateSession {

    public static void main(String[] args) {
        ZkClient client = new ZkClient("192.168.28.124:2181",5000);
        System.out.println("zookeeper connection is established!");

    }
}

创建节点

看一下ZKClient提供的创建节点的方法:
这里写图片描述
跟ZooKeeper一样,同样提供了创建节点的方法,但是不同的是,它自己也提供了自己的实现方式,创建节点的类型在ZooKeeper中是通过枚举类CreateMode来区分不同的节点类型,ZKClient则自己提供了相关的实现。值得关注的是在ZooKeeper中是不支持递归创建节点的,也就是不能够同时创建父节点和子节点。在ZKClient中提供了参数createParents布尔值参数来表示是否要创建父节点。

package zkclient;

import org.I0Itec.zkclient.ZkClient;

public class ZKClientCreateZNode {

    public static void main(String[] args) {
        ZkClient client = new ZkClient("192.168.28.124:2181",5000);
        System.out.println("zookeeper connection is established!");
        client.createPersistent("/zkclient/zksubclient",true);
    }
}

查看客户端是否创建了该节点

[zk: localhost:2181(CONNECTED) 1] ls /
[zkclient, zookeeper, sequenceNode0000000002, athird_node, forth_node0000000006, jiang, aforth_node0000000011]
[zk: localhost:2181(CONNECTED) 2] ls /zkclient
[zksubclient]

删除节点

在原生的API中不提供逐层删除的功能,如果当前节点存在子节点,那么这个节点是不可能被删除的,只有先删除子节点,再删除父节点。而在ZKClient中提供了deleteRecursive方法来进行逐层删除。
提供方法如下:
这里写图片描述

package zkclient;

import org.I0Itec.zkclient.ZkClient;

public class ZKClientDeleteZKNode {

    public static void main(String[] args) {
        ZkClient client = new ZkClient("192.168.28.124:2181",5000);
        System.out.println("zookeeper connection is established!");
        client.deleteRecursive("/zkclient");
    }
}

获取节点

在获取节点的方法上同样是使用getChildren的方法,但是在ZKClient中没有提供一个warcher参数来监听服务店该节点在的子节点的变化通知。如果想要获得对节点上子节点的变化通知,需要使用subscribeChildChanges方法,通过该API的调用,就完成了事件的监听注册。对于节点的新增,减少,删除父节点该方法都会收到服务器的通知。

package zkclient;

import java.util.List;

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

public class ZKClientGetZNode {

    public static void main(String[] args) throws InterruptedException {
        ZkClient client = new ZkClient("192.168.28.124:2181",5000);
        System.out.println("zookeeper connection is established!");
        client.subscribeChildChanges("/zkclient", new IZkChildListener() {

            @Override
            public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
                // TODO Auto-generated method stub
                System.out.println(parentPath + "'s child changed,current children are : " + currentChilds);
            }
        });

        client.createPersistent("/zkclient/zksubclient",true);
        Thread.sleep(2000);
        client.createPersistent("/zkclient/zksubclient1");
        Thread.sleep(2000);
        client.createPersistent("/zkclient/zksubclient2");
        Thread.sleep(2000);
    }
}

执行效果如下

zookeeper connection is established!
/zkclient's child changed,current children are : [zksubclient]
/zkclient's child changed,current children are : [zksubclient1, zksubclient]
/zkclient's child changed,current children are : [zksubclient2, zksubclient1, zksubclient]

猜你喜欢

转载自blog.csdn.net/u010871004/article/details/80716929