ZooKeeper简单API

##简单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框架

相关文章
相关标签/搜索