Curator-简单使用

552 阅读2分钟

前言:

这是一款zookeeper 管理框架,实现了自动重连,安全验证,超时时间,链接重试,等方便管理的功能,本章只是实现CUrator的简单使用.

一:版本管理

注意: 这里只有一个依赖,如果出现错误,请查看是否依赖冲突,如果依赖冲突,请删除对应的依赖,5.0版本才有的一个监听器,如果版本不对 还未CuratorCache 这个监听器版本

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.0.0</version>
</dependency>

二:常规使用

代码解析:
: 通过CuratorFrameworkFactor 创建client链接客户端的管理通道,并且使用建造者模式来简化代码,也就是builder方法,来设置对应的参数,比如connectString("127.0.0.1:2181") 这样子就是制定了zk的链接地址,或者说.retryPolicy传入对应的重试策略看起来也是很方便的,实际上用起来也是.
: getConnectionStateListenable 这个是状态监听器,当Curator 链接成功后的一个回调函数,正常情况下可以写链接成功后的业务逻辑,或者功能逻辑,剩下就很好理解了,按照字面意思来理解就没啥毛病

public static void main(String[] args) {
    CuratorFramework client = CuratorFrameworkFactory.builder()
            .connectString("127.0.0.1:2181")//链接地址
            .retryPolicy(new RetryNTimes(1, 1000)) //重试次数
            .connectionTimeoutMs(10000)//超时时间
            .build();
    client.getConnectionStateListenable().addListener(new ConnectionStateListener() {
        @Override
        public void stateChanged(CuratorFramework curatorFramework, ConnectionState connectionState) {
         //curatorFramework 链接成功的客户端-或者说通道这样子
         //connectionState 链接成功的状态
            if (connectionState.isConnected()){
                System.out.println("链接成功+---------------");
                //链接成功 可以在这里写 回调函数
                setListenterThreeThree(client,"watcher");
            }
        }
    });
    client.start();

    try {
        CreateMode nodeType = getNodeType(client, "/watcher/foreacg");
        //判断节点是否存在,如果存在就是
        if (nodeType==null){
            client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/watcher/foreacg");
        }
        Thread.sleep(Integer.MAX_VALUE);
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

二:监听器的使用

这里是CuratorCache 是5.0版本的特性,如果想使用这个特性,请使用大于5.0
CuratorCache: 可以理解为一个管理缓存监听器的东西, 可以通过builder 构建出监听器的集合,在这个集合也就是listenable 添加一个默认的Cache 监听器就可以监听到,该节点的数据变化,或者说可以理解,当该节点改变时,会通知该方法,回调你的业务逻辑

private static void setListenterThreeThree(CuratorFramework client,String path){
    CuratorCache build = CuratorCache.builder(client, path).build();
    Listenable<CuratorCacheListener> listenable = build.listenable();
    listenable.addListener(new CuratorCacheListener() {
        @Override
        public void event(Type type, ChildData oldData, ChildData data) {

            switch (type){
                case NODE_CHANGED://节点包括子节点数据发生了改变
                    System.out.println("节点数据变化-也会监听的到"+new String(oldData.getData())+"-----------------"+new String( data.getData()));
                    break;
                case NODE_CREATED://节点添加
                    System.out.println("添加了新的节点"+"-----------------"+data.getPath());
                case NODE_DELETED:
                    System.out.println("删除了某个节点"+oldData.getPath());
                    break;
            }
        }
    });
    build.start();
}

三:创建节点

补全:上边缺失的方法

/**
 * 判断节点是否是持久化节点
 * @param client 客户端
 * @param path 路径
 * @return null-节点不存在  | CreateMode.PERSISTENT-是持久化 | CreateMode.EPHEMERAL-临时节点
 */
public static CreateMode getNodeType(CuratorFramework client,String path) {
    Stat stat = null;
    try {
        stat = client.checkExists().forPath(path);
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (stat == null) {
            //不存在该节点 
            return null;
    }
    if (stat.getEphemeralOwner() > 0) {
            //节点为不持久化节点 
            return CreateMode.EPHEMERAL;
    }
    //都不是就是持久化节点 
    return CreateMode.PERSISTENT;
}