zoukankan      html  css  js  c++  java
  • 07_zookeeper的客户端工具curator_基本api

    【zk原生api的不足之处】

    * 不能自动超时重连,需要手动操作

    * watcher事件注册一次后就会失效

    * 不支持递归创建节点

    【 Apache curator 】

    * 解决了watcher的注册一次就失效的问题

    * api相对更加简单易用

    * 提供更多的解决方案并且实现简单:如分布式锁

    * 提供了常用的zk工具类

    【实例化zk客户端的多种重试机制】

    package com.zk.demo;
    import org.apache.curator.RetryPolicy;
    import org.apache.curator.framework.CuratorFramework;
    import org.apache.curator.framework.CuratorFrameworkFactory;
    import org.apache.curator.retry.*;
    
    /**
     * Created by HigginCui on 2018/9/23.
     */
    public class CuratorClient {
    
        public CuratorFramework client = null;
        public static final String zkServerPath = "127.0.0.1";
    
        /**
         * 构造方法中实例化zk客户端
         */
        public CuratorClient() {
    
    
            /**
             * 同步创建zk示例,原生api是异步的
             * curator连接zk的策略:ExponentialBackoffRetry
             *
             * ExponentialBackoffRetry(int baseSleepTimeMs, int maxRetries)
             *  baseSleepTimeMs:初始sleep的时间
             *  maxRetries:最大重试次数
             *  maxSleepMs:最大充实实际那
             */
            RetryPolicy retryPolicy1 = new ExponentialBackoffRetry(1000, 3);
    
            /**
             * curator连接zk的策略:RetryNTimes
             *
             * RetryNTimes(int n, int sleepMsBetweenRetries)
             *  n:重试的次数
             *  sleepMsBetweenRetries:每次重试的间隔的时间
             */
            RetryPolicy retryPolicy2 = new RetryNTimes(3, 5000);
    
            /**
             * curator连接zk的策略:RetryOneTime
             *
             * RetryOneTime(int sleepMsBetweenRetry)
             * sleepMsBetweenRetry:每次重试间隔的时间
             */
            RetryPolicy retryPolicy3 = new RetryOneTime(3000);
    
            /**
             * curator连接zk的策略:RetryForever
             *
             *  RetryForever(int retryIntervalMs)
             *  永远重试,不推荐
             */
            RetryPolicy retryPolicy4 = new RetryForever(5000);
    
            /**
             * curator连接zk的策略:RetryUntilElapsed
             *
             * RetryUntilElapsed(int maxElapsedTimeMs, int sleepMsBetweenRetries)
             * maxElapsedTimeMs:最大重试时间
             * sleepMsBetweenRetries:每次重试间隔
             * 重试时间超过maxElapsedTimeMs后,就不在重试
             */
            RetryPolicy retryPolicy5 = new RetryUntilElapsed(2000, 3000);
    
            client = CuratorFrameworkFactory.builder()
                    .connectString(zkServerPath)
                    .sessionTimeoutMs(10000)
                    .retryPolicy(retryPolicy2)
                    .namespace("workspace")
                    .build();
            client.start();
        }
    
        public void closeClient() {
            if (null != client) {
                this.client.close();
            }
        }
    }

    【创建节点】

    package com.zk.demo;
    import org.apache.curator.framework.CuratorFramework;
    import org.apache.zookeeper.CreateMode;
    import org.apache.zookeeper.ZooDefs;
    
    /**
     * Created by HigginCui on 2018/9/23.
     */
    public class CuratorClientTest {
    
        public static void main(String[] args) throws Exception{
            CuratorFramework client = new CuratorClient().client;
            boolean isCuratorStarted = client.isStarted();
            System.out.println("当前客户端是否正常连接:"+isCuratorStarted);
    
            //创建节点
            String nodePath = "/curator/ccc1";
            byte[] data = "hahaha".getBytes();
            client.create()
                    .creatingParentsIfNeeded()
                    .withMode(CreateMode.PERSISTENT)
                    .withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE)
                    .forPath(nodePath,data);
    
        }
    }

    【运行结果】

    【更新节点数据】

    //更新节点数据
    byte[] newData = "xixixi".getBytes();
    client.setData()
            .withVersion(0)
            .forPath(nodePath,newData);

    【运行结果】

    【删除节点】

    //删除节点
    client.delete()
            .guaranteed()               //如果删除失败,那么在后端还是会继续删除,直到成功
            .deletingChildrenIfNeeded()  //如果有子节点会一并删除
            .withVersion(1)
            .forPath(nodePath);

    【运行结果】

     【读取节点的数据】

    //读取节点数据
    Stat stat = new Stat();
    byte[] data = client.getData()
                        .storingStatIn(stat)
                        .forPath(nodePath);
    System.err.println("节点 "+nodePath+" 的数据为:"+new String(data)+",version为:"+stat.getVersion());

    先在zk上设置好数据

    【运行结果】

     【查询子节点】

    //查询子节点
    List<String> childNodes = client.getChildren()
                                .forPath(nodePath);
    for (String childNode : childNodes){
        System.out.println("childNode = "+childNode);
    }

    提前创建好一批子节点

    【运行结果】

    【判断节点是否存在】

    //判断节点是否存在,如果节点不存在则为空
    Stat statExist = client.checkExists()
                        .forPath(nodePath);
    System.err.println(statExist);
    Stat statExist2 = client.checkExists()
            .forPath(nodePath+"/lll");  //这里故意设置一个不存在的节点
    System.err.println(statExist2);

    【运行结果】

  • 相关阅读:
    将数字转化为字符串
    给定一列数字将其平移n位
    判断回文数的问题
    c语言链表逆序的问题
    python中类属性和实例属性的区别
    python中__repr__()方法
    python中模块和包
    flask如何写一个model
    遍历文件夹下excel文件并且写入一个新excel
    python统计任务耗时
  • 原文地址:https://www.cnblogs.com/HigginCui/p/9692128.html
Copyright © 2011-2022 走看看