Curator框架实现Zookeeper基本操作

发布时间:2022-06-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Curator框架实现Zookeeper基本操作脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Zookeeper是一个Apache开源的分布式的应用,为系统架构提供协调服务。从设计模式角度来审视:该组件是一个基于观察者模式设计的框架,负责存储和管理数据,接受观察者的注册,一旦数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

curator是对zookeeper原生api的封装。原生的api特别难用。

curator提供了流式编程风格,做的非常不错,是目前使用率最高的一种zookeeper框架。

curator它主要包含三个依赖(curator的依赖都已经放到maven仓库,你直接使用maven来构建它。对于大多数人来说,我们可能最常需要引入的是curator-recipes):

  • curator-recipes:包含了curator实现的各项功能,如读写锁、互斥锁、队列等,依赖于framework和Client:http://curator.apache.org/curator-recipes/index.html
  • curator-framework:包含了高层级的流式API,构建在Client之上如对节点的增删改查等:http://curator.apache.org/curator-recipes/index.html
  • curator-client:Zookeeper的基础客户端实现,如连接、重试、超时处理等:http://curator.apache.org/curator-client/index.htm

一般我们使用引入以下依赖即可:

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

Curator使用演示

创建客户端连接

//并没有创建会话连接
CuratorFramework client = CuratorFrameworkFactory.builder()
    .connectString(addr)
    .connectionTimeoutMs(timeout)
    .sessionTimeoutMs(timeout)
    .retryPolicy(new ExponentialBackoffRetry(1000, 3))//初始时间1s,重试连接3次
    .build();
//创建会话连接,是个阻塞方法
client.start();

创建节点

client.create().creatingParentsIfNeeded()
                .withMode(CreateMode.PERSISTENT)
                .forPath("/123/456","hello zk".getBytes());

删除节点

client.delete().deletingChildrenIfNeeded().forPath("/123");

查询节点

byte[] bytes = client.getData().forPath("/123/456");
System.out.println(new String(bytes));

修改数据

client.setData().forPath("/123/456","hello hadoop".getBytes());

以上的操作都是同步的。

下面介绍一个异步回调接口BackgroundCallBack。

在程序用到了这个回调接口,说明程序是异步的。我们知道,异步就需要搞一个线程才行。所以要求传一个线程池,如果不传,就默认自己new一个线程。

比如create节点方法,用了异步接口,那么会在创建完节点后,回调接口。

private static void createNode(CuratorFramework client,CountDownLatch countDownLatch,ExecutorService executorService) throws Exception {
    client.create().creatingParentsIfNeeded()
        .withMode(CreateMode.PERSISTENT)
        .inBackground(new BackgroundCallback() {
            @Override
            public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {
                countDownLatch.countDown();
                Thread.sleep(3000);
                System.out.println("节点创建成功");
            }
        },executorService)
        .forPath("/123/123", "hello zksss".getBytes());


}

事件监听

zookeeper原生支持通过注册Watcher来进行事件监听,但是其使用并不是特别方便,需要开发人员自己反复注册Watcher,比较繁琐。curator引入了cache来实现zookeeper服务端事件的监听。Cache是Curator中对时间监听的包装,其对事件的监听其实可以近似看作是一个本地缓存视图和远程zookeeper视图的对比过程。

cache分为两类监听类型,节点监听和子节点监听。

  • NodeCache(监听和缓存根节点变化) 只监听单一个节点(变化 添加,修改,删除)。
  • PathChildrenCache(监听和缓存子节点变化) 监听这个节点下的所有子节点(变化 添加,修改,删除)。
  • TreeCache(监听和缓存根节点变化和子节点变化) NodeCache+ PathChildrenCache 监听当前节点及其下的所有子节点的变化。

 

 

 

分布式锁

String lockPath = "/123/111";
InterProcessMutex lock = new InterProcessMutex(client,lockPath);
lock.acquire();
//do something
lock.release();

curator直接给出了分布式锁的实现。原理是客户端创建锁节点,执行完毕后再删除锁节点。一个客户端先检查是否有锁节点,如果没有,说明可以执行,则创建锁节点去执行。如果有锁节点,则说明现在锁在别的客户端那里,自己则需要等待。

分布式计数器

分布式计数器的一个典型应用场景是统计在线人数。

指定一个zookeeper节点作为计数器,多个应用实例在分布式锁的控制下,通过更新该数据节点的内容来实现技术功能。

通过类DistributedAtomicInteger来实现。

分布式Barrier

Barrier是一种用来控制多线程之间同步的经典方式,在JDK中也自带了CyclicBarrier实现。

curator用DistributeBarrier类来实现。

 

Curator API

 

脚本宝典总结

以上是脚本宝典为你收集整理的Curator框架实现Zookeeper基本操作全部内容,希望文章能够帮你解决Curator框架实现Zookeeper基本操作所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: