[curator] Netflix Curator 使用
curator简介
Netflix curator 是Netflix公司开源的一个Zookeeper client library,用于简化zookeeper客户端编程,包含一下几个模块:
- curator-client - zookeeper client封装,用于取代原生的zookeeper客户端,提供一些非常有用的客户端特性
- curator-framework - zookeeper api的高层封装,大大简化zookeeper客户端编程,添加了例如zookeeper连接管理、重试机制等
- curator-recipes - zookeeper recipes 基于curator-framework的实现(除2PC以外)
maven dependency:
- <dependency>
- <groupId>com.netflix.curator</groupId>
- <artifactId>curator-recipes</artifactId>
- <version>0.6.4</version>
- </dependency>
注意:在www.mvnrepository.com中认为0.32为最新版本,其实迄今为止最新版本为0.64,github trunk中的版本现在是0.65-SNAPSHOT
curator framework 使用
示例代码:
- String path = "/test_path";
- CuratorFramework client = CuratorFrameworkFactory.builder()
- .connectString("test:2181").namespace("/test1")
- .retryPolicy(new RetryNTimes(Integer.MAX_VALUE, 1000))
- .connectionTimeoutMs(5000).build();
- //create a node
- client.create().forPath("/head", new byte[0]);
- //delete a node in background
- client.delete().inBackground().forPath("/head");
- // create a EPHEMERAL_SEQUENTIAL
- client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/head/child", new byte[0]);
- // get the data
- client.getData().watched().inBackground().forPath("/test");
- // check the path exits
- client.checkExists().forPath(path);
curator framework使用builder模式和类似nio的chain api,代码非常简洁
curator recipes 使用
InterProcessMutex
用途:进程间互斥锁
示例代码:
- String lockName = "/lock1";
- InterProcessLock lock1 = new InterProcessMutex(this.curator, lockName);
- InterProcessLock lock2 = new InterProcessMutex(this.curator, lockName);
- lock1.acquire();
- boolean result = lock2.acquire(1, TimeUnit.SECONDS);
- assertFalse(result);
- lock1.release();
- result = lock2.acquire(1, TimeUnit.SECONDS);
- assertTrue(result);
原理:每次调用acquire在/lock1节点节点下使用CreateMode.EPHEMERAL_SEQUENTIAL 创建新的ephemeral节点,然后getChildren获取所有的children,判断刚刚创建的临时节点是否为第一个,如果是,则获取锁成功;如果不是,则删除刚刚创建的临时节点。
注意: 每次accquire操作,成功,则请求zk server 2次(一次写,一次getChildren);如果失败,则请求zk server 3次(一次写,一次getChildren,一次delete)
InterProcessReadWriteLock
示例代码:
- @Test
- public void testReadWriteLock() throws Exception{
- String readWriteLockPath = "/RWLock";
- InterProcessReadWriteLock readWriteLock1 = new InterProcessReadWriteLock(this.curator, readWriteLockPath);
- InterProcessMutex writeLock1 = readWriteLock1.writeLock();
- InterProcessMutex readLock1 = readWriteLock1.readLock();
- InterProcessReadWriteLock readWriteLock2 = new InterProcessReadWriteLock(this.curator, readWriteLockPath);
- InterProcessMutex writeLock2 = readWriteLock2.writeLock();
- InterProcessMutex readLock2 = readWriteLock2.readLock();
- writeLock1.acquire();
- // same with WriteLock, can read
- assertTrue(readLock1.acquire(1, TimeUnit.SECONDS));
- // different lock, can't read while writting
- assertFalse(readLock2.acquire(1, TimeUnit.SECONDS));
- // different write lock, can't write
- assertFalse(writeLock2.acquire(1, TimeUnit.SECONDS));
- // release the write lock
- writeLock1.release();
- //both read lock can read
- assertTrue(readLock1.acquire(1, TimeUnit.SECONDS));
- assertTrue(readLock2.acquire(1, TimeUnit.SECONDS));
- }
原理: 同InterProcessMutext,在ephemeral node的排序算法上做trick,write lock的排序在前。
注意: 同一个InterProcessReadWriteLock如果已经获取了write lock,则获取read lock也会成功
LeaderSelector
示例代码:
- @Test
- public void testLeader() throws Exception{
- LeaderSelectorListener listener = new LeaderSelectorListener(){
- @Override
- public void takeLeadership(CuratorFramework client)
- throws Exception {
- System.out.println("i'm leader");
- }
- @Override
- public void handleException(CuratorFramework client,
- Exception exception) {
- }
- @Override
- public void notifyClientClosing(CuratorFramework client) {
- }};
- String leaderPath = "/leader";
- LeaderSelector selector1 = new LeaderSelector(this.curator, leaderPath, listener);
- selector1.start();
- LeaderSelector selector2 = new LeaderSelector(this.curator, leaderPath, listener);
- selector2.start();
- assertFalse(selector2.hasLeadership());
- }
原理:内部基于InterProcessMutex实现,具体细节参见shared lock一节
总结
curator还提供了很多其他的实现,具体参见https://github.com/Netflix/curator/wiki/Recipes
[curator] Netflix Curator 使用的更多相关文章
- Zookeeper开源客户端框架Curator简介
Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...
- Zookeeper开源客户端框架Curator简介[转]
Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...
- 15. 使用Apache Curator管理ZooKeeper
Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来. 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题. ...
- 15. 使用Apache Curator装饰ZooKeeper
Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来. 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题. ...
- Zookeeper框架Curator使用
本文参考自https://blog.csdn.net/wo541075754/article/details/69138878?utm_source=gold_browser_extension ht ...
- 03.Curator深入使用
1.Apache Curator简介 Curator提供了一套Java类库,可以更容易的使用ZooKeeper.ZooKeeper本身提供了Java Client的访问类,但是API太底层,不 ...
- zookeeper(二): Curator vs zkClient
目录 zookeeper Curator zkClient 客户端对比 写在前面 1.1. zookeeper应用开发 1.1.1. ZkClient简介 1.1.2. Curator简介 写在最后 ...
- Zookeeper原理与Curator使用
近期打算实现一个基于Zookeeper的分布式的集群状态一致性控制, 对Zookeeper的原理不太了解, 正好学习一下, 网上找到了几篇文章, 先贴在这边, 等我熟读官方文档后, 再来补充自己的见解 ...
- 使用Apache Curator管理ZooKeeper(转)
Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来. 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题. ...
随机推荐
- Spring MVC Rest 支持CORS
新建cors filter文件, package cn.ac.iscas.pebble.ufe.tools; import java.io.IOException; import javax.serv ...
- Jaxb 解析 带有继承关系的bean与xml
具体方法: 1. 在jaxb的setClasstobebounds中,只需要子类的class,无需父类. 2. 父类的前面加如下声明: @XmlAccessorType(XmlAccessType.F ...
- BZOJ 1051 & 强联通分量
题意: 怎么说呢...这种题目有点概括不来....还是到原题面上看好了... SOL: 求出强联通分量然后根据分量重构图,如果只有一个点没有出边那么就输出这个点中点的数目. 对就是这样. 哦还有论边双 ...
- 向 ViewPager 中添加 包含 ListView 的 Fragment
对与fragment就不说什么了,直接看API手册吧,亲. 向 ViewPager 中添加 包含 ListView 的 Fragment 的过程比较麻烦.他所表现的效果就是新闻客户端的滑动翻页效果. ...
- URAL 1501. Sense of Beauty(记忆化搜索)
题目链接 本来暴力写个TLE了,加上记忆化就A了. #include <cstring> #include <cstdio> #include <string> # ...
- C程序演示产生僵死进程的过程
先抄录网上一段对僵死进程的描述: 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中.这种 ...
- Solr JAVA客户端SolrJ 4.9使用示例教程
http://my.oschina.net/cloudcoder/blog/305024 简介 SolrJ是操作Solr的JAVA客户端,它提供了增加.修改.删除.查询Solr索引的JAVA接口.So ...
- 关于VSS上的项目源码管理的注意问题
1.将项目添加到vss上面去 如果项目取的名字没有问题,则不需要去vss上面去新建项目,直接在解决方案那里右击“添加到vss”中,把第一个输入框中的名字(xxxx.root)全部清除掉.确定即可. 2 ...
- php循环删除文件目录及文件
删除文件及目录: //循环删除目录和文件函数 function delDirAndFile( $dirName ) { if ( $handle = opendir( "$dirName&q ...
- 获取到body的offsetTop和offsetLeft值
function offsetTL(obj){//获取到body的offsetTop和offsetLeft var t=0,l=0; while(obj){ t=t+obj.offsetTop; l= ...