zookeeper 编程框架 curator


 

Curator框架提供了一套高级的API, 简化了ZooKeeper的操作。 它增加了很多使用ZooKeeper开发的特性,可以处理ZooKeeper集群复杂的连接管理和重试机制。 这些特性包括:

  • 自动化的连接管理: 重新建立到ZooKeeper的连接和重试机制存在一些潜在的错误case。 Curator帮助你处理这些事情,对你来说是透明的。
  • 清爽API:
    • 简化了原生的ZooKeeper的方法,事件等
    • 提供了一个现代的流式接口
  • 提供了Recipes实现: 如前面的文章介绍的那样,基于这些Recipes可以创建很多复杂的分布式应用
  • 增加了事务处理

Curator框架通过CuratorFrameworkFactory以工厂模式和builder模式创建CuratorFramework实 例。 CuratorFramework实例都是线程安全的,你应该在你的应用中共享同一个CuratorFramework实例.

工厂方法newClient()提供了一个简单方式创建实例。 而Builder提供了更多的参数控制。一旦你创建了一个CuratorFramework实例,你必须调用它的start()启动,在应用退出时调用close()方法关闭.


简单编程实例

 1 package org.admln.program.CuratorTest;
 2 
 3 import org.apache.curator.framework.CuratorFramework;
 4 import org.apache.curator.framework.CuratorFrameworkFactory;
 5 import org.apache.curator.retry.RetryNTimes;
 6 import org.apache.zookeeper.CreateMode;
 7 import org.apache.zookeeper.WatchedEvent;
 8 import org.apache.zookeeper.Watcher;
 9 
10 
11 /**
12  * @author admln
13  * @date 2015年5月13日 上午9:56:36
14  */
15 public class CuratorTest {
16     public static void main(String[] args) throws Exception {
17         String path = "/test_path";
18         CuratorFramework client = CuratorFrameworkFactory.builder()
19                 .connectString("localhost:2181").namespace("brokers")
20                 .retryPolicy(new RetryNTimes(Integer.MAX_VALUE, 1000))
21                 .connectionTimeoutMs(5000).build();
22         // 启动 上面的namespace会作为一个最根的节点在使用时自动创建
23         client.start();
24 
25         // 创建一个节点
26         client.create().forPath("/head", new byte[0]);
27 
28         // 异步地删除一个节点
29         // client.delete().inBackground().forPath("/head");
30 
31         // 创建一个临时节点
32         client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL)
33                 .forPath("/head/child", new byte[0]);
34 
35         // 取数据
36         client.getData().watched().inBackground().forPath("/test");
37 
38         // 检查路径是否存在
39         client.checkExists().forPath(path);
40 
41         // 异步删除
42         client.delete().inBackground().forPath("/head");
43 
44         // 注册观察者,当节点变动时触发
45         client.getData().usingWatcher(new Watcher() {
46             public void process(WatchedEvent event) {
47                 System.out.println("node is changed");
48             }
49         }).inBackground().forPath("/test");
50 
51         // 结束使用
52         client.close();
53     }
54 }

 

posted @ 2015-05-13 09:59  Daem0n  阅读(592)  评论(0编辑  收藏  举报