Curator提供了一套Java类库, 可以更容易的使用ZooKeeper。 ZooKeeper本身提供了Java Client的访问类,但是API太底层,不宜使用, 容易出错。 Curator提供了三个组件。 Curator client用来替代ZOoKeeper提供的类, 它封装了底层的管理并提供了一些有用的工具。Curator framework提供了高级的API来简化ZooKeeper的使用。它增加了很多基于ZooKeeper的特性,帮助管理ZooKeeper的连接以及重试操作。Curator Recipes提供了使用ZooKeeper的一些通用的技巧(方法)。 除此之外, Curator Test提供了基于ZooKeeper的单元测试工具。
所谓技巧(Recipes),也可以称之为解决方案, 或者叫实现方案, 是指ZooKeeper的使用方法, 比如分布式的配置管理, Leader选举等。

Curator最初由Netflix的Jordan Zimmerman开发。20117月在github上基于Apache 2.0开源协议开源。 之后发布了多个版本,并被广泛的应用。

Curator作为Apache ZooKeeper天生配套的组件。ZooKeeper的Java开发者自然而然的会选择它在项目中使用。

Curator作为ApacheCurator作为Apache

组件概览

组件名 描述
Recipes 通用ZooKeeper技巧(“recipes”)的实现. 建立在Curator Framework之上
Framework 简化zookeeper使用的高级. 增加了很多建立在zooper之上的特性. 管理复杂连接处理和重试操作
Utilities 各种工具类
Client ZooKeeper本身提供的类的替代者。 负责底层的开销以及一些工具
Errors Curator怎样来处理错误和异常
Extensions curator-recipes包实现了通用的技巧,这些技巧在ZooKeeper文档中有介绍。为了避免是这个包(package)变得巨大, recipes/applications将会放入一个独立的extension包下。并使用命名规则curator-x-name.

Maven / Artifacts

Curator 编译好的类库被发布到Maven Center中。Curator包含几个artifact. 你可以根据你的需要在你的项目中加入相应的依赖。对于大多数开发者来说,引入curator-recipes这一个就足够了。

使用Curator

Curator的类库可以从Maven仓库中获取。上一篇文章已经介绍了它的相关组件。无论你使用Maven, Gradle还是 Ant都可以很容易的将curator包含到你的编译脚本中。

大部分用户都想使用curator预置的技巧(解决方案),所以你需要加上curator-recipes依赖。如果你想包装ZOoKeeper增加连接管理重试机制等, 加上 curator-framework依赖。

得到连接

Curator使用流式风格。 非常适合编程的一种风格, 如果你还了解它,建议先熟悉它。
Curator连接实例(CuratorFramework)由CuratorFrameworkFactory产生。对于你要连接的ZooKeeper集群, 只需一个CuratorFramework对象即可。

     
     
1
     
     
CuratorFrameworkFactory.newClient(zookeeperConnectionString, retryPolicy)

它会使用缺省值创建到zookeeper集群的连接。唯一需要设置的是指定重试策略。大部分情况你只需下面的代码:

     
     
1
2
3
     
     
RetryPolicy retryPolicy = new ExponentialBackoffRetry( 1000, 3)
CuratorFramework client = CuratorFrameworkFactory.newClient(zookeeperConnectionString, retryPolicy);
client.start();

client必须调用start方法。 (不再使用时调用close方法)

直接调用ZooKeeper

一旦获得了CuratorFramework实例,就可以直接调用zookeeper,就像ZOoKeeper发布包中提供的原始的ZooKeeper对象一样。

     
     
1
     
     
client.create().forPath( "/my/path", myData)

好处是Curator自己负责连接的管理和重试, 不必再写复杂的代码处理这个问题(如果你用ZOoKeeper自己的API, 就会理解管理连接的痛苦了)

技巧

来看Curator提供的两个技巧。

分布式的锁

     
     
1
2
3
4
5
6
7
8
9
10
11
12
     
     
InterProcessMutex lock = new InterProcessMutex(client, lockPath);
if ( lock.acquire(maxWait, waitUnit) )
{
try
{
// do some work inside of the critical section here
}
finally
{
lock.release();
}
}

leader选举

     
     
1
2
3
4
5
6
7
8
9
10
11
12
13
     
     
LeaderSelectorListener listener = new LeaderSelectorListenerAdapter()
{
public void takeLeadership( CuratorFramework client) throws Exception
{
// this callback will get called when you are the leader
// do whatever leader work you need to and only exit
// this method when you want to relinquish leadership
}
}
LeaderSelector selector = new LeaderSelector(client, path, listener);
selector.autoRequeue(); // not required, but this is behavior that you will probably expect
selector.start();

代码相当的简单。

转至:http://colobu.com/

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐