##简单API ZooKeeper的设计目标之一就是提供一个很是简单的编程接口。这个编程接口主要支持如下几种操做:html
操做 | 说明 |
---|---|
create | 在树中建立一个节点 |
delete | 删除一个节点 |
exists | 测试节点是否存在 |
get data | 读取节点数据 |
set data | 将数据写入节点 |
get children | 查询节点的子节点 |
sync | 等待数据被传输 |
##代码示例 下面的代码是使用 ZooKeeper 原生 API 来实现的。apache
// 建立 ZooKeeper 实例 ZooKeeper zk = new ZooKeeper("192.168.109.137:2181,192.168.109.138:2181,192.168.109.139:2181", 500000, new Watcher() { // 监控被触发的事件 public void process(WatchedEvent event) { System.out.println(event); } }); // 判断 /zk_test 节点是否存在 System.out.println(zk.exists("/zk_test", true)); // 建立一个持久节点 /zk_test, 数据内容是 test-data, 不进行 ACL 权限控制 zk.create("/zk_test", "test-data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 建立两个子节点, 节点类型均为持久节点 zk.create("/zk_test/child_a", "test-data-child-a".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.create("/zk_test/child_b", "test-data-child-b".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 获取 /zk_test 节点数据 System.out.println(new String(zk.getData("/zk_test", false, null))); // 取出 /zk_test 节点的子节点列表 System.out.println(zk.getChildren("/zk_test", true)); // 更新 /zk_test 节点数据 zk.setData("/zk_test", "test-data-update".getBytes(), -1); // 获取 /zk_test 节点更新后的数据 System.out.println(new String(zk.getData("/zk_test", false, null))); // 删除子节点 zk.delete("/zk_test/child_a", -1); zk.delete("/zk_test/child_b", -1); // 删除父节点 /zk_test zk.delete("/zk_test", -1); // 关闭链接 zk.close();
##Curator Curator 是 Netflix 公司开源的一个 ZooKeeper 客户端框架, 由 Jordan Zimmerman 开发。Curator 提供了一套可读性更强的 Fluent 风格的 API, 而且提供了 ZooKeeper 各类应用场景(recipe, 好比共享锁服务, 集群领导选举机制)的抽象封装。更多详细介绍参见 Curator官网编程
###Curator组件 | 组件名称 | 说明 | | ------------- |:-------------:| |Recipes |一些 ZooKeeper 经常使用应用场景的实现, 其实现是基于 Curator Framework。| |Framework |Curator Framework 是一个高级别的 API, 它极大的简化了 ZooKeeper 的使用。它添加了不少使用 ZooKeeper 开发的特性, 而且能够处理复杂的 ZooKeeper 集群链接管理和重试操做。| |Utilities |使用 ZooKeeper 时不少实用的工具类。| |Client |ZooKeeper 原生客户端的一个替代品, 它负责处理一些底层的操做并提供了一些实用工具类。| |Errors |Curator 用于处理错误, 链接问题, 恢复异常等。| |Extensions |curator-recipes 包实现了 ZooKeeper 文档中描述的一些经常使用的应用场景。为了不这个包变得很大, 将一些 recipes/applications 使用命名规则 curator-x-name 放到一个单独的 extension 包中, 好比 curator-x-discovery, curator-x-discoveryserver 以及 curator-x-rpc 等等。| ###代码示例 下面使用 Curator 提供的 API 来替换上面示例中 ZooKeeper 原生的 API。app
// ZooKeeper集群地址 String zkConnectionString = "192.168.109.137:2181,192.168.109.138:2181,192.168.109.139:2181"; // 指定ZooKeeper集群链接重试策略 RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); // 使用CuratorFrameworkFactory建立Curator链接实例CuratorFramework, 只须要为每一个链接的ZooKeeper集群建立一个CuratorFramework对象实例 CuratorFramework zkClient = CuratorFrameworkFactory.newClient(zkConnectionString, retryPolicy); // 启动客户端 zkClient.start(); // 判断 /zk_test 节点是否存在 zkClient.checkExists().forPath("/zk_test"); // 建立一个持久节点 /zk_test, 数据内容是 test-data。 zkClient.create().forPath("/zk_test", "test-data".getBytes()); // 建立两个子节点, 节点类型均为持久节点 zkClient.create().forPath("/zk_test/child_a", "test-data-child-a".getBytes()); zkClient.create().forPath("/zk_test/child_b", "test-data-child-b".getBytes()); // 获取 /zk_test 节点数据 System.out.println(new String(zkClient.getData().forPath("/zk_test"))); // 取出 /zk_test 节点的子节点列表 System.out.println(zkClient.getChildren().forPath("/zk_test")); // 更新 /zk_test 节点数据 zkClient.setData().forPath("/zk_test", "test-data-update".getBytes()); // 获取 /zk_test 节点更新后的数据 System.out.println(new String(zkClient.getData().forPath("/zk_test"))); // 删除子节点 zkClient.delete().forPath("/zk_test/child_a"); zkClient.delete().forPath("/zk_test/child_b"); // 取出 /zk_test 节点的子节点列表 System.out.println(zkClient.getChildren().forPath("/zk_test")); // 删除父节点 /zk_test zkClient.delete().forPath("/zk_test"); // 关闭链接 zkClient.close();
##参考资料 http://curator.apache.org/index.html框架