ZooKeeper简单API

原创
2016/07/13 10:57
阅读数 278

##简单API ZooKeeper的设计目标之一就是提供一个非常简单的编程接口。这个编程接口主要支持以下几种操作:

操作 说明
create 在树中创建一个节点
delete 删除一个节点
exists 测试节点是否存在
get data 读取节点数据
set data 将数据写入节点
get children 查询节点的子节点
sync 等待数据被传输

##代码示例 下面的代码是使用 ZooKeeper 原生 API 来实现的。

// 创建 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。

// 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

展开阅读全文
打赏
0
5 收藏
分享
加载中
更多评论
打赏
0 评论
5 收藏
0
分享
返回顶部
顶部