Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来。 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题。 社区已经在ZooKeeper数据模型及其API之上开发了高级框架。 Apache Curator是一个高级的包装类库和框架,使得ZooKeeper非常简单易用。
Tips
Curator最初由Netflix开发,现在是一个Apache项目。 项目页面位于。
Curator是ZooKeeper的高级类库;它使处理ZooKeeper变得更容易,并扩展了核心ZooKeeper的功能。 Curator在高层次上由以下部分组成:
Client:Curator客户端是ZooKeeper的Java客户端的一个包装器。 它是Curator堆栈中的一个低级API,并且抽象出ZooKeeper客户端的功能。
Framework:Curator框架是一个具有高级功能的高级API,如自动连接管理,操作重试等等。 它在很大程度上简化了ZooKeeper的使用。
Recipe:Curator Recipe提供ZooKeeper Recipe的实现; 这些实现可以直接用于分布式应用程序来解决协调问题。
Extensions:Curator Recipe包实现了常见的Recipe。 为了避免这个包的膨胀,使用一个单独的扩展包。
除了前面的组件外,Curator还附带一些ZooKeeper有用的工具。 Curator堆栈如下图所示:
Curator JARs可以在Maven Central的仓库中找到。 Curator可以很容易地包含在Maven,Gradle,Ivy,SBT等构建脚本中。
各种Maven artifacts在上列出。
二 Curator客户端Curator Client是ZooKeeper Java客户端的一个包装器。它使客户端访问ZooKeeper更简单,更不易出错。
Curator客户端提供以下功能:
连接管理:管理与ZooKeeper服务器的连接
操作重试实用程序:这是重试操作的机制
测试ZooKeeper服务器:这是用于测试ZooKeeper服务器
使用Curator客户端连接ZooKeeper服务器的MyCuratorClient.java的代码片段如下:
public void myCuratorClient() throws Exception { CuratorZookeeperClient client = new CuratorZookeeperClient(server.getConnectString(), 10000, 10000, null,new RetryOneTime(1)); client.start(); try { client.blockUntilConnectedOrTimedOut(); String path = client.getZooKeeper().create("/test_znode", "".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } finally { client.close(); } }CuratorZooKeeperClient构造方法用于连接到ZooKeeper服务器。 它需要连接字符串或ZooKeeper主机端口对列表,会话和连接超时时间,可选的观察器对象以及要使用的重试策略。 重试策略是客户端在重试连接时尝试各种重试机制的机制。在前面的例子中,使用了一个客户端只会重试一次的策略。
Curator客户端支持以下重试策略:
BoundedExponentialBackoffRetry:通过增加重试之间的休眠时间直到最大上限重试指定的次数
ExponentialBackoffRetry:通过增加重试之间的休眠时间来重试指定的次数
RetryNTimes:重试n次
RetryOneTime:只重试一次
RetryUntilElapsed:一直重试,直到超过指定时间
一旦客户端启动,blockUntilConnectedOrTimedOut方法直到ZooKeeper连接服务器成功或者连接超时。连接成功之后,创建/testznode的znode。getZooKeeper()方法将连接的实例返回给托管的ZooKeeper服务器。
Note
Curator API文档可在察看。
Curator客户端是一个低层次的API,它提供了对管理员客户端API的抽象。开发人员应该使用Curator框架,而不是直接在他们的应用程序中使用CuratorZookeeperClient类作为最佳实践。
三 Curator框架Curator框架(org.apache.curator.framework)是一个高层次的API,很大程度上简化了ZooKeeper的使用。 它提供的一些功能如下:
自动连接管理:此功能自动且透明地处理客户端需要重新建立与ZooKeeper服务器的连接和/或重试操作的场景。
简单而灵活的API:使用一组新式且流畅的接口来应用ZooKeeper原始的API。
Recipe:这个功能实现了常见的ZooKeeper Recipe。
CuratorFramework使用CuratorFrameworkFactory进行分配。 它提供了工厂方法以及构造器创建实例。CuratorFramework实例完全是线程安全的。在使用CuratorFramework开发应用程序时,开发人员应该为每个ZooKeeper集群创建和共享一个CuratorFramework实例。CuratorFramework使用fluent风格接口。
以下展示的是ZooKeeper客户端使用CuratorFramework的代码示例:
public void myCuratorFrameworkClient() throws Exception { CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)); client.start(); try { String path = client.create().withMode( CreateMode.PERSISTENT).forPath( "/test_znode", "".getBytes()); } finally { client.close(); } }