Curator API操作

为什么选择Curator API

ZooKeeper原生Java API的不足之处:

在连接zk超时的时候,不支持自动重连,需要手动操作
Watch注册一次就会失效,需要反复注册
不支持递归创建节点

Apache curator:

Apache 的开源项目
解决Watch注册一次就会失效的问题
提供的 API 更加简单易用
提供更多解决方案并且实现简单,例如:分布式锁
提供常用的ZooKeeper工具类

使用Curator

在pom.xml添加关于Curator的依赖,具体Curator版本的选择可以参考官网:http://curator.apache.org/zk-compatibility.html

    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.5-cdh5.15.1</version>
    </dependency>
        <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>4.0.0</version>
    </dependency>

    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-recipes</artifactId>
      <version>4.0.0</version>
    </dependency>
package com.ruozedata.bigdata.zookeeper;


import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.BackgroundCallback;
import org.apache.curator.framework.api.CuratorEvent;
import org.apache.curator.framework.api.CuratorWatcher;
import org.apache.curator.framework.api.ExistsBuilder;
import org.apache.curator.framework.imps.CuratorFrameworkState;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


public class CuratorApp implements CuratorWatcher {
//使用Logger来打印日志信息
    private static Logger logger= LoggerFactory.getLogger(CuratorApp.class);
    //优雅的等待Curator连接ZK
    public static CountDownLatch connected=new CountDownLatch(1);

    public static void main(String[] args) throws Exception {
    /**
         *  ExponentialBackoffRetry构造器参数:
         *  curator链接zookeeper的策略:ExponentialBackoffRetry
         *  baseSleepTimeMs:初始sleep的时间
         *  maxRetries:最大重试次数
         *  maxSleepMs:最大重试时间
         */
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 5);
        // 实例化Curator客户端,Curator的编程风格可以让我们使用方法链的形式完成客户端的实例化
        // 使用工厂类来建造客户端的实例对象(CuratorFrameworkFactory)
        // connectString:放入zookeeper服务器ip
        // sessionTimeoutMs、retryPolicy设定会话时间以及重连策略
        //build: 建立连接通道
        CuratorFramework client = CuratorFrameworkFactory.builder().connectString("hadoop001:2181").sessionTimeoutMs(20000).retryPolicy(retryPolicy).build();
        logger.warn("客户端状态:{}", client.getState());
         // 启动Curator客户端
        client.start();
        connected.await();
        logger.warn("客户端状态:{}", client.getState());
//同步创建节点,如果不存在父节点,就会先创建父节点,再创建子节点
//creatingParentsIfNeeded() 递归创建,如果没有父节点,自动创建父节点
//withMode(CreateMode.PERSISTENT) 节点类型,持久节点
//        String result = client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/ruozedata/tmp", "ruoze".getBytes());
//        logger.warn("创建节点:{}", result);
//异步创建节点,异步处理接口为BackgroundCallback
//        ExecutorService executorService = Executors.newFixedThreadPool(1);
//        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)
//                .inBackground(new BackgroundCallback() {
//                    @Override
//                    public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {
//                        logger.warn("===>响应码:" + event.getResultCode()+",type:" + event.getType());
//                        logger.warn("===>Thread of processResult:"+Thread.currentThread().getName());
//                        logger.warn("===>context参数回传:" + event.getContext());
//                    }
//                },"传给服务端的内容,异步会传回来",executorService)
//                .forPath("/node10","123456".getBytes());
//        Thread.sleep(1000);
//        executorService.shutdown();
//setData可以修改节点的数据信息
//        Stat stat = client.setData().forPath("/ruoze", "ruozedata001".getBytes());
//        logger.warn("版本号:{}",stat.getVersion());
//删除节点
//        client.delete().deletingChildrenIfNeeded().forPath("/node10");
//storingStatIn:获取节点数据信息
//        Stat stat = new Stat();
//        byte[] data = client.getData().storingStatIn(stat).forPath("/ruoze");
//        logger.warn("获取节点数据:{}", new String(data));
//        logger.warn("节点版本号:{}", stat.getVersion());
//判断节点是否存在
//        Stat stat = client.checkExists().forPath("/ruoz2e");
//        if(stat !=null){
//            logger.warn("节点存在");
//        }else{
//            logger.warn("节点不存在");
//        }
//查看节点下面的子节点
//        List<String> lists = client.getChildren().forPath("/ruoze");
//        for(String list:lists ){
//            logger.warn(list);
//        }

        client.close();
        logger.warn("客户端状态:{}", client.getState());


    }

    @Override
    public void process(WatchedEvent event) throws Exception {
        if(event.getState() == Watcher.Event.KeeperState.SyncConnected) {
            logger.warn("接收到watch通知:{}", event);
            connected.countDown();
        }
    }
}

常用方法:

create()	    开始创建操作, 可以调用额外的方法(比如方式mode 或者后台执行background)
                并在最后调用forPath()指定要操作的ZNode
delete()	    开始删除操作. 可以调用额外的方法(版本或者后台处理version or background)
                并在最后调用forPath()指定要操作的ZNode
checkExists()	开始检查ZNode是否存在的操作. 可以调用额外的方法(监控或者后台处理)
                并在最后调用forPath()指定要操作的ZNode
getData()	    开始获得ZNode节点数据的操作. 可以调用额外的方法(监控、后台处理或者获取状态watch, background or get stat)   
                并在最后调用forPath()指定要操作的ZNode
setData()	    开始设置ZNode节点数据的操作. 可以调用额外的方法(版本或者后台处理) 
                并在最后调用forPath()指定要操作的ZNode
getChildren()	开始获得ZNode的子节点列表。 以调用额外的方法(监控、后台处理或者获取状态watch, background or get stat) 
                并在最后调用forPath()指定要操作的ZNode
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值