zookeeper开源客户端curator

  zookeeper的原生api相对来说比较繁琐,比如:对节点添加监听事件,当监听触发后,我们需要再次手动添加监听,否则监听只生效一次;再比如,断线重连也需要我们手动代码来判断处理等等。对于curator的介绍,从网上百度了一段:Curator是Netflix开源的一套zookeeper客户端框架,用它来操作zookeeper更加方便,按Curator官方所比喻的,guava to JAVA,curator to zookeeper,Curator采用了fluent风格的代码,非常简洁

---------------正-----文-----------------------------------------------------------------------------------------------------------------------------------------------

  Curator包含6部分,均可提供单独jar包,每个包简单介绍如下:

  client:zk-client的替代品,提供一些底层处理跟工具类;

  framework:高级封装,大大简化了zk的客户端编程,包含对zk的连接管理,重试机制等;

  repices:提供了一些常用的操作,比如持续监听,锁,选举等;

  utilities:各种工具类;

  errors:curator对异常跟错误的处理;

  extendsion:扩展包;

  基本api代码解释:

  1、建立连接

  建立连接需要指定zk地址以及重试策略等,先上代码再解释:

 RetryPolicy retry = new ExponentialBackoffRetry(1000, 5);//重试5次,每次间隔时间指数增长(有具体增长公式)
 RetryPolicy retry1 = new RetryNTimes(5, 5000);//重试5次,每次间隔5秒
 RetryPolicy retry2 = new RetryUntilElapsed(60000 * 2, 5000);//重试2分钟,每次间隔5秒 //普通创建
 CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", 5000, 5000, retry);
 //fluent风格创建
 CuratorFramework client1 = CuratorFrameworkFactory.builder()
          .connectString("localhost:2181")
          .connectionTimeoutMs(5000)   //会话超时时间
          .sessionTimeoutMs(3000)      //连接超时时间
          .retryPolicy(retry)
          .build();

  //建立连接
  client.start();

  如注释,创建客户端连接我们通常需要指定重试策略,curator提供了3种重试机制,分别如上;对于fluent风格,就是每个操作都返回了一个对象,我们可以一直通过[.方法名]的方式书写代码;client创建了之后,需要调用start方法才能真正去建立连接。会话超时时间是指当连接发生故障时,由于zk的心跳机制检测,服务端认为会话超时的时间,会清除session;

  2、创建、删除、更新节点

  连接建立之后,我们可以在服务器上进行创建节点的操作,代码如下:

 //创建节点
 String path = client.create()
          .creatingParentsIfNeeded()        //对节点路径上没有的节点进行创建
          .withMode(CreateMode.EPHEMERAL)   //临时节点
          .forPath("/curator/test", "123".getBytes());  //节点路径,节点的值

 //删除节点
 client.delete()
        .guaranteed()      //删除失败,则客户端持续删除,直到节点删除为止
        .deletingChildrenIfNeeded()   //删除相关子节点
        .withVersion(-1)    //无视版本,直接删除
        .forPath("/curator/mytest");
 //更新节点信息
 Stat stat2 = new Stat();
 byte[] theValue2 = client.getData().storingStatIn(stat).forPath("/curator/test");
 client.setData()
        .withVersion(stat2.getVersion())  //版本校验,与当前版本不一致则更新失败,-1则无视版本信息进行更新
        .forPath("/curator/test", "456".getBytes());
 //判断节点是否存在(存在返回节点信息,不存在则返回null)
 Stat s = client.checkExists().forPath("/curator/test");

  持久节点是persistent,我们创建的节点可能有好几层,如果服务器不存在父节点则会报错并创建失败,createingParentsIfNodeed()的作用是在父节点不存在的时候进行创建。删除操作可能由于网络抖动等情况导致删除失败,由于节点数据操作一般对业务影响较大,故多数都会带持续删除的动作来确保正确删除;节点更新删除等操作若考虑版本校验,则采用代码所示方式,在获取节点数据的时候对节点状态进行赋值,然后通过节点状态可以获得版本信息。判断节点是否存在,一般通过节点信息判断,若不存在,则节点信息为null。

  3、获取字节点列表

  只有一行代码,返回string类型的list

 //获取子节点列表
 List<String> paths = client.getChildren().forPath("/curator");

  4、异步操作

  异步操作不会阻塞代码执行,对于操作完成后的业务处理,需要设定回调函数来完成。以判断节点是否存在为例:

 ExecutorService es = Executors.newFixedThreadPool(5);//异步操作线程池,
 //异步判断操作
 Stat s1 = client.checkExists().inBackground().forPath("/curator/test"); //无回调
 client.checkExists().inBackground(new BackgroundCallback() {  //有回调
     @Override
     public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {
         CuratorEventType c = curatorEvent.getType();//事件类型,可在CuratorEventType看到具体种类
         int r = curatorEvent.getResultCode();//0,执行成功,其它,执行失败
         Object o = curatorEvent.getContext();//事件上下文,一般是由调用方法传入,供回调函数使用的参数
         String p = curatorEvent.getPath();//节点路径
         List<String> li = curatorEvent.getChildren();//子节点列表
         byte[] datas = curatorEvent.getData();//节点数据
         //一些其它操作
     }
 },es).forPath("/curator/test");

  异步操作实际是在后台另起一个线程来完成该操作,若线程较多势必会影响服务器性能,所以要用线程池来尽量降低对服务器的消耗。需要考虑线程池的关闭操作,较繁琐,不作赘述。

  5、节点、子节点监听

  节点监听需要用repices包中的NodeCache来完成,代码如下:

 //节点监听
 final NodeCache cache = new NodeCache(client,"/curator/test");
 cache.start();
 cache.getListenable().addListener(new NodeCacheListener() {
     @Override
     public void nodeChanged() throws Exception {
         byte[] ret = cache.getCurrentData().getData();
         System.out.println("当前节点内容是:"+ new String(ret));
     }
 });

  子节点的监听需要用PathChildrenCache来完成,跟节点本身不一样,代码如下:

 //子节点监听
 final PathChildrenCache pccache = new PathChildrenCache(client,"/curator",true);//true指当子节点变化时,获取子节点内容
 pccache.start();
 pccache.getListenable().addListener(new PathChildrenCacheListener() {
     @Override
     public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
         switch (pathChildrenCacheEvent.getType()){
             case CHILD_ADDED:
                 System.out.println(pathChildrenCacheEvent.getData());
                 break;
             case CHILD_REMOVED:
                 System.out.println(pathChildrenCacheEvent.getData().getPath());
                 break;
             case CHILD_UPDATED:
                 break;
             default:
                 break;
         }
     }
 });

  6、权限控制部分,略。

  只是简单罗列了curator的一些基本用法,举例具体应用还是有很大差距,稍后将动手写一下选主程序来练手试试,希望顺利。

  

时间: 2024-12-24 17:44:33

zookeeper开源客户端curator的相关文章

Zookeeper开源客户端Curator之基本功能讲解

简介 Curator是Netflix公司开源的一套Zookeeper客户端框架.了解过Zookeeper原生API都会清楚其复杂度.Curator帮助我们在其基础上进行封装.实现一些开发细节,包括接连重连.反复注册Watcher和NodeExistsException等.目前已经作为Apache的顶级项目出现,是最流行的Zookeeper客户端之一.从编码风格上来讲,它提供了基于Fluent的编程风格支持. 除此之外,Curator还提供了Zookeeper的各种应用场景:Recipe.共享锁服

八:Zookeeper开源客户端Curator的api测试

curator是Netflix公司开源的一套ZooKeeper客户端,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作.包括连接重连,反复注册Watcher等.实现了Fluent风格的API接口,目前已经为Apache的顶级项目,是全世界使用最广泛的ZooKeeper客户端之一 第一:maven依赖 1 <dependency> 2 <groupId>org.apache.curator</groupId> 3 <artifactId>

ZooKeeper(3.4.5) 开源客户端Curator的简单示例

一.创建会话 1. 创建会话 package com.huey.dream.demo; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.retry.ExponentialBackoffRetry; /** * 使用Curator创建会话 * @author huey

Zookeeper开源客户端框架Curator简介

Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情, 于是在它的基础上包装了一下, 提供了一套更好用的客户端框架. Netflix在用ZooKeeper的过程中遇到的问题, 我们也遇到了, 所以开始研究一下, 首先从他在github上的源码, wiki文档以及Netflix的技术blog入手. 看完官方的文档之后, 发现Curator主要解决了三类

Zookeeper【客户端启动】

今天我们来说说 Zookeeper 客户端启动,整个文章分三个部分:第一部分是 Zookeeper 原生 API 客户端,第二部分是开源客户端 ZkClient,第三部分是开源客户端 Curator. [Zookeeper API 客户端]

Zookeeper之开源客户端ZkClient

ZkClient是由Datameer的工程师开发的开源客户端,对Zookeeper的原生API进行了包装,实现了超时重连.Watcher反复注册等功能. ZKClient版本及源码 maven依赖 ZkClient目前有两个不同artifactId的系列. 其中最早的0.1版本maven依赖如下: <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</ar

【zookeeper】Apache curator的使用及zk分布式锁实现

上篇,本篇主要讲Apache开源的curator的使用,有了curator,利用Java对zookeeper的操作变得极度便捷. 其实在学之前我也有个疑虑,我为啥要学curator,撇开涨薪这些外在的东西,就单技术层面来讲,学curator能帮我做些什么?这就不得不从zookeeper说起,上篇我已经大篇幅讲了zk是做什么的了,但真正要靠zk去实现多服务器自动拉取更新的配置文件等功能是非常难的,如果没有curator,直接去写的话基本上能把你累哭,就好比连Mybatis或者jpa都没有,让你用原

.NET Core)的ZooKeeper异步客户端

支持断线重连.永久watcher.递归操作并且能跨平台(.NET Core)的ZooKeeper异步客户端 阅读目录 什么是ZooKeeper? 项目介绍 提供的功能 使用说明 FAQ 在公司内部的微服务架构中有使用到了"ZooKeeper",虽然官方有提供了.NET的SDK,但易用性非常的差,且搜遍github.nuget,没有发现一个可以跨平台且易用的组件,所以我又"美化"了一个轮子. 回到目录 什么是ZooKeeper? ZooKeeper是一个分布式的,开放

为什么dubbo使用ZkClient作为zookeeper的客户端

本文内容并非原创,使用资料均来自互联网. dubbo使用了zkClient而不是使用zookeeper本身的客户端与zookeeper进行交互,为什么呢? 先看看zookeeper本身自带的客户端的问题. 1)ZooKeeper的Watcher是一次性的,用过了需要再注册: 2) session的超时后没有自动重连,生产环境中如果网络出现不稳定情况,那么这种情况出现的更加明显:3) 没有领导选举机制,集群情况下可能需要实现stand by,一个服务挂了,另一个需要接替的效果:4) 客户端只提供了