程序员ZooKeeper我爱编程

15. 使用Apache Curator装饰ZooKeeper

2017-12-09  本文已影响458人  码匠安徒生

Apache ZooKeeper是为了帮助解决复杂问题的软件工具,它可以帮助用户从复杂的实现中解救出来。 然而,ZooKeeper只暴露了原语,这取决于用户如何使用这些原语来解决应用程序中的协调问题。 社区已经在ZooKeeper数据模型及其API之上开发了高级框架。 Apache Curator是一个高级的包装类库和框架,使得ZooKeeper非常简单易用。

Tips
Curator最初由Netflix开发,现在是一个Apache项目。 项目页面位于http://curator.apache.org/

一 Curator组件

Curator是ZooKeeper的高级类库;它使处理ZooKeeper变得更容易,并扩展了核心ZooKeeper的功能。 Curator在高层次上由以下部分组成:

除了前面的组件外,Curator还附带一些ZooKeeper有用的工具。 Curator堆栈如下图所示:


The Curator stack

Curator JARs可以在Maven Central的仓库中找到。 Curator可以很容易地包含在Maven,Gradle,Ivy,SBT等构建脚本中。

各种Maven artifacts在http://mvnrepository.com/artifact/org.apache.curator上列出。

二 Curator客户端

Curator Client是ZooKeeper Java客户端的一个包装器。它使客户端访问ZooKeeper更简单,更不易出错。

Curator客户端提供以下功能:

使用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客户端支持以下重试策略:

一旦客户端启动,blockUntilConnectedOrTimedOut方法直到ZooKeeper连接服务器成功或者连接超时。连接成功之后,创建/testznode的znode。getZooKeeper()方法将连接的实例返回给托管的ZooKeeper服务器。

Note
Curator API文档可在http://curator.apache.org/apidocs/index.html察看。

Curator客户端是一个低层次的API,它提供了对管理员客户端API的抽象。开发人员应该使用Curator框架,而不是直接在他们的应用程序中使用CuratorZookeeperClient类作为最佳实践。

三 Curator框架

Curator框架(org.apache.curator.framework)是一个高层次的API,很大程度上简化了ZooKeeper的使用。 它提供的一些功能如下:

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();
  }
}

newClient()工厂方法创建一个新的客户端实例,默认会话超时和默认连接超时。 它需要一个连接字符串,是ZooKeeper主机-端口对列表和要使用的重试策略。

CuratorFramework有一个命名空间的概念。 通过这个,可以在使用构造器方法创建CuratorFramework实例时设置命名空间。 当其中一个API被调用时,该框架将该命名空间预加载到所有路径:

CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder();
CuratorFramework client = builder.connectString (server.getConnectString()).namespace("MyApp").retryPolicy(new RetryOneTime(1)).build();
client.create().forPath("/test_znode", data);

在这里,尽管znode的名称被指定为/test_znode,但是创建的实际znode是/MyApp/test_znode

Curator框架还提供了一个名为CuratorTempFramework的有限功能框架接口,用于通过不可靠的网络(如WAN)进行临时连接。 在这个框架中,如果会话保持空闲一段时间,ZooKeeper连接将被关闭。

四 Curator recipe

Curator为ZooKeeper提供了一系列随时可用的recipe。 Curator实现的recipe的详细列表和描述可以从http://curator.apache.org/curator-recipes/index.html的项目页面中获取。

在这里,将简略地介绍一下ZooKeeper的recipe:

五 Curator实用程序

Curator类库也为ZooKeeper提供了一些有用的工具。 其中一些如下所示:

六 Curator扩展

Curator扩展包除了包含在recipe包中那些外,还包括额外的recipe。 扩展包中的recipe具有curator-x-name的命名约定。

Curator目前提供以下扩展功能:

到目前为止,我们已经了解Curator类库及其各种组件。Curator为ZooKeeper API实现了一个非常好的,可靠的扩展,将ZooKeeper的许多复杂性抽象出来。 强烈建议开发人员使用Curator在Java语言的ZooKeeper开发分布式应用程序。 不仅如此,Curator的强大功能也可以从Java以外的语言编写的应用程序中使用。

上一篇 下一篇

猜你喜欢

热点阅读