一.zookeeper简介html
一款管理分布式应用程序的协调服务系统java
二.zookeeper应用场景apache
网上也有不少介绍,能够参见 http://blog.csdn.net/xinguan1267/article/details/38422149api
本文主要介绍基于java的客户端开发服务器
三.基于JAVA客户端实战session
3.1Client框架
// 建立一个与服务器的链接 须要(服务端的 ip+端口号)(session过时时间)(Watcher监听注册) ZooKeeper zk = new ZooKeeper("10.154.156.180:2181", 3000, new Watcher() { // 监控全部被触发的事件 public void process(WatchedEvent event) { // TODO Auto-generated method stub System.out.println("已经触发了" + event.getType() + "事件!"); } }); // 建立一个目录节点 /** * CreateMode: * PERSISTENT (持续的,相对于EPHEMERAL,不会随着client的断开而消失) * PERSISTENT_SEQUENTIAL(持久的且带顺序的) * EPHEMERAL (短暂的,生命周期依赖于client session) * EPHEMERAL_SEQUENTIAL (短暂的,带顺序的) */ zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); // 建立一个子目录节点 zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); System.out.println(new String(zk.getData("/testRootPath",false,null))); // 取出子目录节点列表 System.out.println(zk.getChildren("/testRootPath",true)); // 建立另一个子目录节点 zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); System.out.println(zk.getChildren("/testRootPath",true)); // 修改子目录节点数据 zk.setData("/testRootPath/testChildPathOne","hahahahaha".getBytes(),-1); byte[] datas = zk.getData("/testRootPath/testChildPathOne", true, null); String str = new String(datas,"utf-8"); System.out.println(str); //删除整个子目录 -1表明version版本号,-1是删除全部版本 zk.delete("/testRootPath/testChildPathOne", -1); System.out.println(zk.getChildren("/testRootPath",true)); System.out.println(str);
部分例式 具体可参见官网api: http://zookeeper.apache.org/doc/r3.2.2/api/org/apache/zookeeper/ZooKeeper.html#create%28java.lang.String,%20byte%5B%5D,%20java.util.List,%20org.apache.zookeeper.CreateMode%29分布式
3.2Curatorui
Curator框架提供了一套高级的API, 简化了ZooKeeper的操做。 它增长了不少使用ZooKeeper开发的特性,能够处理ZooKeeper集群复杂的链接管理和重试机制。 这些特性包括:spa
封装ZooKeeper client与ZooKeeper server之间的链接处理;
提供了一套Fluent风格的操做API;
提供ZooKeeper各类应用场景(recipe, 好比共享锁服务, 集群领导选举机制)的抽象封装.
关于Fluent风格能够查看个人一篇博客(建造者模式),在偶看es搜索源码时发现也使用了Fluent风格。
以下是使用Curator建立对象的方法
public static CuratorFramework createWithOptions(String connectionString, RetryPolicy retryPolicy, int connectionTimeoutMs, int sessionTimeoutMs) { return CuratorFrameworkFactory.builder().connectString(connectionString) .retryPolicy(retryPolicy) .connectionTimeoutMs(connectionTimeoutMs) .sessionTimeoutMs(sessionTimeoutMs) .build(); }
调用代码以下:
client = createWithOptions("10.154.156.180:2181", new ExponentialBackoffRetry(1000, 3), 1000, 1000); client.start();
若是须要建立新目录节点 依然是Fluent风格
client.create().forPath("/curator", new byte[0]); client.create().withMode(CreateMode.PERSISTENT).forPath("/curator/childOne", new byte[0]);
固然建立zk也能够不使用Fluent风格
public static CuratorFramework createSimple(String connectionString) { ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3); return CuratorFrameworkFactory.newClient(connectionString, retryPolicy); }
其余方法说明:
create(): 发起一个create操做. 能够组合其余方法 (好比mode 或background) 最后以forPath()方法结尾
delete(): 发起一个删除操做. 能够组合其余方法(version 或background) 最后以forPath()方法结尾
checkExists(): 发起一个检查ZNode 是否存在的操做. 能够组合其余方法(watch 或background) 最后以forPath()方法结尾
getData(): 发起一个获取ZNode数据的操做. 能够组合其余方法(watch, background 或get stat) 最后以forPath()方法结尾
setData(): 发起一个设置ZNode数据的操做. 能够组合其余方法(version 或background) 最后以forPath()方法结尾
getChildren(): 发起一个获取ZNode子节点的操做. 能够组合其余方法(watch, background 或get stat) 最后以forPath()方法结尾
inTransaction(): 发起一个ZooKeeper事务. 能够组合create, setData, check, 和/或delete 为一个操做, 而后commit() 提交