ZooKeeper(五)-- Curator使用
前言
Curator是Netflix开源的一套ZooKeeper客户端框架:
1.封装ZooKeeper client与ZooKeeper server之间的连接处理;
2.提供了一套Fluent风格的操作API;
3.提供ZooKeeper各种应用场景(recipe, 比如共享锁服务, 集群领导选举机制)的抽象封装。
Curator几个组成部分:
Client:是ZooKeeper客户端的一个替代品, 提供了一些底层处理和相关的工具方法
Framework: 用来简化ZooKeeper高级功能的使用, 并增加了一些新的功能, 比如管理到ZooKeeper集群的连接, 重试处理
Recipes:实现了通用ZooKeeper的recipe, 该组件建立在Framework的基础之上
Utilities:各种ZooKeeper的工具类
Errors: 异常处理, 连接, 恢复等
Extensions: recipe扩展
Curator内部实现的几种重试策略:
ExponentialBackoffRetry:重试指定的次数, 且每一次重试之间停顿的时间逐渐增加
RetryNTimes:指定最大重试次数的重试策略
RetryOneTime:仅重试一次
RetryUntilElapsed:一直重试直到达到规定的时间
正文
1.项目使用maven工程,在pom.xml中添加依赖
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.5.0</version>
</dependency>
2.下面代码从增删改查、事务、事件订阅/监听器来实现的。
package om.xbq.demo; import java.util.Collection;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.CuratorWatcher;
import org.apache.curator.framework.api.transaction.CuratorTransactionResult;
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.data.Stat; public class CuratorDemo { // 此demo使用的集群,所以有多个ip和端口
private static String CONNECT_SERVER = "192.168.242.129:2181,192.168.242.129:2182,192.168.242.129:2183";
private static int SESSION_TIMEOUT = 3000;
private static int CONNECTION_TIMEOUT = 3000; public static void main(String[] args) {
// 连接 ZooKeeper
CuratorFramework framework = CuratorFrameworkFactory.
newClient(CONNECT_SERVER, SESSION_TIMEOUT, CONNECTION_TIMEOUT, new ExponentialBackoffRetry(1000,10));
// 启动
framework.start(); Stat stat = ifExists(framework); if(stat != null){
// update(framework);
// delete(framework);
// query(framework); // 监听事件,只监听一次,不推荐
// listener1(framework);
}else {
// add(framework);
} // 事务
// transaction(framework); // 持久监听,推荐使用
listener2(framework);
} /**
* 判断节点是否存在
* @param cf
* @return
*/
public static Stat ifExists(CuratorFramework cf){
Stat stat = null;
try {
stat = cf.checkExists().forPath("/node_curator/test");;
System.out.println(stat);
} catch (Exception e) {
e.printStackTrace();
}
return stat;
} /**
* @Title: add
* @Description: TODO(增加节点 , 可以增加 多级节点)
* @param @param cf 设定文件
* @return void 返回类型
* @throws
*/
public static void add(CuratorFramework cf){
try {
String rs = cf.create().creatingParentsIfNeeded()
.withMode(CreateMode.PERSISTENT).forPath("/node_curator/test","xbq".getBytes());
System.out.println(rs);
} catch (Exception e) {
e.printStackTrace();
} finally {
cf.close();
}
} /**
* @Title: update
* @Description: TODO(修改指定节点的值)
* @param @param cf 设定文件
* @return void 返回类型
* @throws
*/
public static void update(CuratorFramework cf){
try {
Stat stat = cf.setData().forPath("/node_curator/test", "javaCoder".getBytes());
System.out.println(stat);
} catch (Exception e) {
e.printStackTrace();
} finally {
cf.close();
}
} /**
* @Title: delete
* @Description: TODO(删除节点或者删除包括子节点在内的父节点)
* @param @param cf 设定文件
* @return void 返回类型
* @throws
*/
public static void delete(CuratorFramework cf){
try {
// 递归删除的话,则输入父节点
cf.delete().deletingChildrenIfNeeded().forPath("/node_curator");
} catch (Exception e) {
e.printStackTrace();
} finally {
cf.close();
}
} /**
* @Title: query
* @Description: TODO(查询节点的值)
* @param @param cf 设定文件
* @return void 返回类型
* @throws
*/
public static void query(CuratorFramework cf){
try {
byte[] value = cf.getData().forPath("/node_curator/test");
System.out.println(new String(value));
} catch (Exception e) {
e.printStackTrace();
} finally {
cf.close();
}
} /**
* @Title: transaction
* @Description: TODO(一组crud操作同生同灭)
* @param @param cf 设定文件
* @return void 返回类型
* @throws
*/
public static void transaction(CuratorFramework cf){
try {
// 事务处理, 事务会自动回滚
Collection<CuratorTransactionResult> results = cf.inTransaction()
.create().withMode(CreateMode.PERSISTENT).forPath("/node_xbq1").and()
.create().withMode(CreateMode.PERSISTENT).forPath("/node_xbq2").and().commit();
// 遍历
for(CuratorTransactionResult result:results){
System.out.println(result.getResultStat() + "->" + result.getForPath() + "->" + result.getType());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
cf.close();
}
} /**
* @Title: listener1
* @Description: TODO(监听 事件 -- 通过 usingWatcher 方法)
* 注意:通过CuratorWatcher 去监听指定节点的事件, 只监听一次
* @param @param cf 设定文件
* @return void 返回类型
* @throws
*/
public static void listener1(CuratorFramework cf){
try {
cf.getData().usingWatcher(new CuratorWatcher() {
@Override
public void process(WatchedEvent event) throws Exception {
System.out.println("触发事件:" + event.getType());
}
}).forPath("/javaCoder"); System.in.read(); // 挂起,在控制台上输入 才停止
} catch (Exception e) {
e.printStackTrace();
} finally {
cf.close();
}
} /**
* @Title: listener2
* @Description: TODO(监听 子节点的事件,不监听 自己 -- 通过 PathChildrenCacheListener 方法,推荐使用)
* @param @param cf 设定文件
* @return void 返回类型
* @throws
*/
public static void listener2(CuratorFramework cf) {
// 节点node_xbq不存在 会新增
PathChildrenCache cache = new PathChildrenCache(cf, "/node_xbq", true);
try {
cache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
cache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
System.out.println("触发事件:" + event.getType());
}
});
System.in.read();
} catch (Exception e) {
e.printStackTrace();
} finally {
cf.close();
}
}
}
源码下载
https://gitee.com/xbq168/CuratorDemo
ZooKeeper(五)-- Curator使用的更多相关文章
- Zookeeper客户端Curator使用详解
Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBoot.Curator.Bootstrap写了一个可视化的Web应用: zookeep ...
- zookeeper(六):Zookeeper客户端Curator的API使用详解
简介 Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsEx ...
- 转:Zookeeper客户端Curator使用详解
原文:https://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBo ...
- Zookeeper(五)持久化快照
Zookeeper(五)持久化快照 用途 快照文件是指定时间间隔对zookeeper服务器上的节点数据的序列化后备份到磁盘中,快照文件不一定是最新的 如果zk集群挂了,可能会用到它来复原 基本术语 D ...
- zookeeper(2)-curator
一.Curator介绍 zookeeper的提交人也说过,curator对于zookeeper而言就像是guava对于java差不多,更加优雅高效. 而且之前的zookeeper原生API,往往因为2 ...
- ZooKeeper与Curator注册和监控
Curator提供了对zookeeper客户端的封装,并监控连接状态和会话session,特别是会话session过期后,curator能够重新连接zookeeper,并且创建一个新的session. ...
- Zookeeper与Curator二三事【坑爹】
起因:我的Dubbo服务起不来:我本地Zookeeper3.4.11,Curator4.1 Caused by: org.apache.zookeeper.KeeperException$Unimpl ...
- Zookeeper客户端Curator基本API
在使用zookeper的时候一般不使用原生的API,Curator,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsExceptio ...
- Zookeeper客户端Curator的使用,简单高效
Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量. 1.引入依赖: ...
- ZooKeeper和Curator相关经验总结
一.关于ZooKeeper的watch用法,需要注意 详细说明如下: ZooKeeper Watches All of the read operations in ZooKeeper - getDa ...
随机推荐
- JS中split用法和数组中元素的删除
JS中split用法 <script language="javascript"> function spli(){ datastr="2,2,3,5,6,6 ...
- [流水账]搜索与web-container版本匹配的jar包
刚才发现自己的servlet-api.jar里面的javax.servlet.jsp为空的,但是我又需要做一些JSP tag-lib的编程,所以没办法,只好去下一个新的包 上网找了找,我用的tomca ...
- 【Java】包装类总结
Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数 ...
- svn 版本导致
Malformed network data svn: Unable to parse URL '/svn/PROJECT/13.深大出版社/trunk/sdcbs/' svn 版本导致 1 ...
- win7语言设置为英语
控制面板,地区和语言 可以设置格式 键盘和语言 安装显示的语言 选择“可选更新包”,选择语言的语言
- localtime、localtime_s、localtime_r的使用
(1).localtime用来获取系统时间,精度为秒 #include <stdio.h>#include <time.h>int main(){ time_t time ...
- 全屏API接口
HTML5的诞生给我们提供了很多精彩的JavaScript和HTML新功能和新特征.有些新特征我们已知多年并大量的使用,而另外一些主要是用在前沿的手机移动技术上,或者桌面应用中起辅助作用.不管这些HT ...
- 一款由html5 canvas实现五彩小圆圈背景特效
之前介绍了好几款html5 canvas实现的特效.今天要为大家介绍一款由html5 canvas实现五彩小圆圈背景特效.五彩的小圆圈渐显渐失的特效.效果图如下: 在线预览 源码下载 html代码 ...
- jquery-ajax-php(内容点赞并进行cookie限制实现)
1.模板页html例如以下: 2.模板页的jquery里的ajax实现例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T ...
- 谈API网关的背景、架构以及落地方案
Chris Richardson曾经在他的博客上详细介绍过API网关,包括API网关的背景.解决方案以及案例.对于大多数基于微服务的应用程序而言,API网关都应该是系统的入口,它会负责服务请求路由.组 ...