Apache Curator使用

1,158 阅读2分钟
Apache Curator简介

Apache Curator是Apache ZooKeeper的Java客户端库。Curator项目的目标是简化ZooKeeper客户端的使用。在ZooKeeper API中,我们都要自己处理ConnectionLossException。另外Curator为常见的分布式协同服务提供了高质量的实现。Apache Curator最初是Netflix研发的,后来捐献了Apache基金会,目前是Apache的顶级项目。

Curator技术栈

image.png

  • Client: 封装了Zookeeper类,管理和ZooKeeper集群的连接,并提供了重连机制。
  • Framework: 为所有的ZooKeeper提供了重试机制,对外提供了一个Fluent风格的API。
  • Recipes: 使用framework实现了大量的ZooKeeper协同服务。
  • Extensions:扩展模块。
Curator使用

Client初始化
初始化一个client分成两个步骤:

  1. 创建client
  2. 启动client 以下是两种创建client的方法:
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
//使用Factory方法
CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);
//使用Fluent风格
CuratorFramework client = CuratorFrameworkFactory.builder()
            .connectString(connectString)
            .retryPolicy(retryPolicy)
            .build();
            
//启动client
client.start();

Fluent风格API

//同步版本
client.create().withMode(CreateMode.PERSISTENT).forPath(path, data);
//异步版本
client.create().withMode(CreateMode.PERSISTENT).inBackground().forPath(path, data);
//使用watch
client.getData().watched().forPath(path);

测试用例示例代码:

public void testWatch() throws Exception {
    String path = "/three";
    byte[] data = {'3'};
    byte[] newData = {'4'};
    CountDownLatch latch = new CountDownLatch(1);

    // Use listener only for watches
    client
        .getCuratorListenable()
        .addListener(
            (CuratorFramework c, CuratorEvent event) -> {
              switch (event.getType()) {
                case WATCHED:
                  WatchedEvent we = event.getWatchedEvent();
                  System.out.println("watched event: " + we);
                  if (we.getType() == Watcher.Event.EventType.NodeDataChanged
                      && we.getPath().equals(path)) {
                    // 4. watch triggered
                    System.out.printf("got the event for the triggered watch\n");
                    byte[] actualData = c.getData().forPath(path);
                    assertThat(actualData).isEqualTo(newData);
                  }
                  latch.countDown();
                  break;
              }
            });

    // 1. create
    client.create().withMode(CreateMode.PERSISTENT).forPath(path, data);
    // 2. getData and register a watch
    byte[] actualData = client.getData().watched().forPath(path);
    assertThat(actualData).isEqualTo(data);

    // 3. setData
    client.setData().forPath(path, newData);
    latch.await();

    // 5. delete
    client.delete().forPath(path);
  }

Curator源码中curator-examples项目下有许多示例的代码,有兴趣的可以看看。
按下面步骤把Curator的源码导入到Idea:

  1. 从Curator的主页 curator.apache.org/下载最新的版本,目前是5.1.0
  2. 然后把apache-curator-5.1.0-source-release.zip解压到本地目录
  3. 然后用Idea的导入maven项目的功能导入这个项目。