什么是 Apache Curator?

Apache Curator 是分布式协调服务 Apache ZooKeeper 的 Java/JVM 客户端库。

Apache Curator 包括一个高级 API 框架和实用程序,使使用 Apache ZooKeeper 变得更加容易和可靠。

它还包括常见用例和扩展(例如服务发现和 Java 8 异步 DSL)的方法。

入门

学习 ZooKeeper

假定 Curator 用户了解 ZooKeeper。

一个好的起点是这里:https://zookeeper.apache.org/doc/current/zookeeperStarted.html

使用 Curator

Curator JAR 可从 Maven Central 获得。

主页上列出了各种工件。 Maven、Gradle、Ant 等的用户可以轻松地将 Curator 包含到他们的构建脚本中。

大多数用户会希望使用 Curator 的预建配方之一。 因此,策展人食谱是要使用的正确神器。 如果您只想在 ZooKeeper 周围添加一个包装器来添加连接管理和重试策略,请使用 curator-framework。

获得连接

Curator 使用 Fluent Style。

如果您以前没有使用过它,它可能看起来很奇怪,因此建议您熟悉该样式。

Curator 连接实例 (CuratorFramework) 是从 CuratorFrameworkFactory 分配的。

对于要连接到的每个 ZooKeeper 集群,您只需要一个 CuratorFramework 对象:

CuratorFrameworkFactory.newClient(zookeeperConnectionString, retryPolicy)

这将使用默认值创建到 ZooKeeper 集群的连接。

您唯一需要指定的是重试策略。

在大多数情况下,您应该使用:

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

客户端必须启动(并在不再需要时关闭)。

直接调用 ZooKeeper

拥有 CuratorFramework 实例后,您可以使用与使用 ZooKeeper 分发版中提供的原始 ZooKeeper 对象类似的方式直接调用 ZooKeeper。

例如:

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

这里的好处是 Curator 管理 ZooKeeper 连接,并在出现连接问题时重试操作。

食谱(Recipes)

分布式锁

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 Election

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://curator.apache.org/