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 }