脚本宝典收集整理的这篇文章主要介绍了Curator框架实现Zookeeper基本操作,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
Zookeeper是一个Apache开源的分布式的应用,为系统架构提供协调服务。从设计模式角度来审视:该组件是一个基于观察者模式设计的框架,负责存储和管理数据,接受观察者的注册,一旦数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的观察者做出相应的反应,从而实现集群中类似Master/Slave管理模式。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
curator是对zookeeper原生api的封装。原生的api特别难用。
curator提供了流式编程风格,做的非常不错,是目前使用率最高的一种zookeeper框架。
curator它主要包含三个依赖(curator的依赖都已经放到maven仓库,你直接使用maven来构建它。对于大多数人来说,我们可能最常需要引入的是curator-recipes):
一般我们使用引入以下依赖即可:
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.2.0</version>
</dependency>
//并没有创建会话连接
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分为两类监听类型,节点监听和子节点监听。
String lockPath = "/123/111";
InterProcessMutex lock = new InterProcessMutex(client,lockPath);
lock.acquire();
//do something
lock.release();
curator直接给出了分布式锁的实现。原理是客户端创建锁节点,执行完毕后再删除锁节点。一个客户端先检查是否有锁节点,如果没有,说明可以执行,则创建锁节点去执行。如果有锁节点,则说明现在锁在别的客户端那里,自己则需要等待。
分布式计数器的一个典型应用场景是统计在线人数。
指定一个zookeeper节点作为计数器,多个应用实例在分布式锁的控制下,通过更新该数据节点的内容来实现技术功能。
通过类DistributedAtomicInteger来实现。
Barrier是一种用来控制多线程之间同步的经典方式,在JDK中也自带了CyclicBarrier实现。
curator用DistributeBarrier类来实现。
以上是脚本宝典为你收集整理的Curator框架实现Zookeeper基本操作全部内容,希望文章能够帮你解决Curator框架实现Zookeeper基本操作所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。