curator zkclient
原生api的不足:
(1)连接的创建是异步的,需要开发人员自行编码实现等待。
(2)连接没有自动的超进重连机制。
(3)zk本身没提供序列化机制,需要开发人员自行指定,从而实现数据的序列化和反序列化。
(4)Watcher注册一次只会生效一次,需要不断的重复注册。
(5)不支持递归创建树形节点。
使用Java操作zookeeper时,一般有两种方式:zkclient和curator,相比较来说,curator的使用较为简单。
CuratorFrameworkFactory 的静态方法创建客户端
(a)static CuratorFramework newClient(String connectString , int sessionTimeoutMs, int connectionTimeoutMs, RetryPolicy retryPolicy)
(b)static CuratorFramework newClient(String connectString, RetryPolicy retryPolicy)
参数说明:
- connectString 分开的ip:port对。
- retryPolicy:重试策略
- sessionTimeoutMs:会话超时时间,默认60000ms
- connectionTimeoutMs:连接创建超时时间,单位为毫秒,默认是15000ms
实现接口RetryPolicy可以自定义重试策略:
boolean allowRetry(int retryCount, long elapsedTimeMs, RetrySleeper sleeper)
- retryCount:已经重试的次数,如果第一次重试,此值为0.
- elapsedTimeMs:重试花费的时间
- sleeper:类似于Thread.sleep,用于sleep指定时间。
- 返回值:如果还会继续重试,则返回true
默认重试策略:
(1)RetryNTimes(int n, int sleepMsBetweenRetries)
- n:最大重试次数。
- sleepMsBetweenRetry:重试间隔的时间。
(2)RetryOneTime(int sleepMsBetweenRetry)
- sleepMsBetweenRetry:重试间隔的时间
(3)RetryUntilElapsed(int maxElapsedTimeMs, int sleepMsBetweenRetries)
重试的时间超过最大时间后,就不再重试。
- maxElapsedTimeMs:最大重试时间。
- sleepMsBetweenRetriees:每次重试的间隔时间。
(4)ExponentialBackoffRetry(int baseSleepTimeMs, int maxRetries, int maxSleepMs)
- baseSleepTimeMs:初始sleep时间。
- maxRetries:最大重试次数。
- maxSleepMs:最大重试时间。
当前应该sleep的时间:baseSleepTimeMs*Math.max(1,random.nextInt(1<<retryCount+1)),随着重试次数,增加重试时间间隔,指数增加。
Fluent风格的API
一种面向对象的开发方式,目的是提高代码的可读性。
例子:
zkclient = CuratorFramework.builder().connectString(connectString).sessionTimeoutMs(5000).retryPolicy(retryPolicy)。
创建节点
CreateBuilder create()
- createingParentsIfNeeded()递归创建父目录。
- withMode(CreateMode mode)设置节点属性,如果是递归创建,创建模式为临时节点,则只有叶子节点是临时节点,非叶子都为持久节点。
- withACL(List aclList)
- forPath(String path) 指定路径。
删除节点
DeleteBuilder delete()
- withVersion(int version)
- guaranteed() 确保节点被删除
- forPath(String path) 指定路径
- deletingChildrenIfNeeded 递归删除所有子节点
读取数据
GetDataBuilder getData()
- storingStatIn(org.apache.zookeeper.data.Stat stat) 把服务器端获取的状态数据存储到stat对象。
- Byte[] forPath(String path) 节点路径
设置watcher
(1)NodeCache
监听数据节点的内容变更,如果指定的节点不存在,则节点创建后,会触发这个监听。
(2)PathChildrenCache
监听指定节点的子节点变化情况。
package com.zk.dev.zkClient.day1; import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.framework.recipes.cache.NodeCacheListener;
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.framework.recipes.cache.PathChildrenCache.StartMode;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids; /** * @see 测试curator框架例子 * @Author:xuehan * @Date:2016年5月14日下午8:44:49 */
public class CuratorUtils { public String connectString = "localhost:2181"; CuratorFramework zkclient = null ; public CuratorUtils(){ /** * connectString连接字符串中间用分号隔开,sessionTimeoutMs session过期时间,connectionTimeoutMs连接超时时间,retryPolicyc连接重试策略 */ //CuratorFrameworkFactory.newClient(connectString, sessionTimeoutMs, connectionTimeoutMs, retryPolicy) // fluent风格aip // CuratorFrameworkFactory.builder().sessionTimeoutMs(5000).connectString(connectString).namespace("/test").build(); // 重连策略,没1一秒重试一次,最大重试次数3次 RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); zkclient = CuratorFrameworkFactory.builder().connectString(connectString).sessionTimeoutMs(5000).retryPolicy(retryPolicy).namespace("tests").build(); zkclient.start(); } /** * 递归创建节点 * @param path * @param data * @throws Exception */ public void createNode(String path, byte[] data) throws Exception{ zkclient.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).withACL(Ids.OPEN_ACL_UNSAFE).forPath(path, data); } /** * 递归删除节点 * @param path * @throws Exception */ public void delNode(String path) throws Exception{ zkclient.delete().guaranteed().deletingChildrenIfNeeded().forPath(path); } public void zkClose(){ zkclient.close(); } public void delNodeCallBack(String path) throws Exception{ zkclient.delete().guaranteed().deletingChildrenIfNeeded().inBackground(new DeleteCallBack()).forPath(path); } public void dataChanges(String path) throws Exception{ final NodeCache dataWatch = new NodeCache(zkclient, path); dataWatch.start(true); dataWatch.getListenable().addListener(new NodeCacheListener(){ public void nodeChanged() throws Exception { System.out.println("path==>" + dataWatch.getCurrentData().getPath() + "==data==>" + new String(dataWatch.getCurrentData().getData())); } }); zkclient.delete().guaranteed().deletingChildrenIfNeeded().inBackground(new DeleteCallBack()).forPath(path); } public void addChildWatcher(String path) throws Exception{ final PathChildrenCache pc = new PathChildrenCache(zkclient, path, true); pc.start(StartMode.POST_INITIALIZED_EVENT); System.out.println("节点个数===>" + pc.getCurrentData().size()); pc.getListenable().addListener(new PathChildrenCacheListener() { public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception { System.out.println("事件监听到" + event.getData().getPath()); if(event.getType().equals(PathChildrenCacheEvent.Type.INITIALIZED)){ System.out.println("客户端初始化节点完成" + event.getData().getPath()); }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_ADDED)){ System.out.println("添加节点完成" + event.getData().getPath()); }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_REMOVED)){ System.out.println("删除节点完成" + event.getData().getPath()); }else if(event.getType().equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){ System.out.println("修改节点完成" + event.getData().getPath()); } } }); } public static void main(String[] args) throws Exception{ CuratorUtils cu = new CuratorUtils();
// cu.createNode("/test/sb/aa/bb", "erhu".getBytes());
// cu.delNode("/test"); cu.zkclient.setData().forPath("/aa", "love is not".getBytes()); cu.addChildWatcher("/aa"); try{ Thread.sleep(20000000); }catch(Exception e){}; } }
最后欢迎大家访问我的个人网站:1024s
curator zkclient相关推荐
- 高性能微服务 Dubbo RPC Redis 分布式框架
开发目标 兼容电脑.平板和手机的浏览器 支持分布式部署,支持Redis集群 友好的代码结构及注释,便于阅读及二次开发 提供Swagger API接口,方便团队协作和功能测试 Shiro认证授权,包含菜 ...
- 亲!你的专属Dubbo启动注册中心,请注意查收!
现在来说一下dubbo注册中心的大致结构,请看下图: Java学习笔记开源框架--dubbo启动之注册中心(Registry) 服务注册 对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务 ...
- LTS分布式任务调度文档
LTS介绍 LTS(light-task-scheduler)主要用于解决分布式任务调度问题,支持实时任务,定时任务,Cron任务,Repeat任务.有较好的伸缩性,扩展性,健壮稳定性而被多家公司使用 ...
- LTS分布式任务调度文档-转载
转载:https://www.cnblogs.com/dion-90/articles/8674591.html LTS介绍 LTS(light-task-scheduler)主要用于解决分布式任务调 ...
- Zookeeper实战之客户端Curator vs zkClient
1. zookeeper应用开发 Zookeeper应用开发,需要使用Zookeeper的java 客户端API ,去连接和操作Zookeeper 集群. 可以供选择的java 客户端API 有:Zo ...
- zookeeper学习笔记-zkclient,curator使用
开源客户端,原生api的不足 连接的创建是异步的,需要开发人员自行编码实现等待 连接没有自动的超时重连机制 Zk本身没提供序列化机制,需要开发人员自行指定,从而实现数据的序列化和反序列化 Wat ...
- Zookeeper客户端ZkClient、Curator的使用,史上最详细的教程来啦~
1 前言 本文主要介绍了操作Zookeeper的几种客户端的基础使用,希望对老铁们会有所帮助. 可以去操作zookeeper创建.删除.查询.修改znode节点 2 Zookeeper服务器客户端分类 ...
- Zookeeper开源客户端框架Curator的简单使用
为什么80%的码农都做不了架构师?>>> Curator最初由Netflix的Jordan Zimmerman开发, Curator提供了一套Java类库, 可以更容易的使用Z ...
- 聊聊、Zookeeper 客户端 Curator
[Curator] 和 ZkClient 一样,Curator 也是开源客户端,Curator 是 Netflix 公司开源的一套框架. <dependency><groupId ...
最新文章
- MongoDB数据库(一:基本操作)
- 口语学习Day6:今天聊聊国内安全还是国外安全?
- 阿里巴巴Druid数据源,史上最强的数据源,没有之一
- Qt Creator常用快捷键及技巧提升编码效率
- linux基于usb启动配置
- 成为一个拥有优势的人(转)
- python怎么使用time模块_PYTHON的TIME模块使用
- CSS3动画序列(CSS3)
- 语义Web的一些概念和资源
- python实现一款编译型语言_Java,Python谁是编译型语言,谁是解释型语
- Android ——游戏开发之文字冒险游戏
- 淘宝优惠券去哪里领?
- 搭建以太坊私有链多节点环境
- ipv6头部格式 c语言,2.2.1 IPv6和IPv4基本头部格式
- 第5期-通过飞卢小说网爬取小说
- 遍历一个文件夹下的所有文件和子文件夹
- 自动化测试——执行javaScript脚本
- 基于php鲜花花卉销售商城网站(源码+系统+mysql数据库+Lw文档)
- 华兴数控g71外圆循环编程_数控G71内外圆粗车循环指令教案
- Windows 10 美式键盘消失 解决方案
热门文章
- Python 自动贩卖机系统
- 数万美金奖励+中美往返差旅+国际周门票!万向区块链黑客马拉松硅谷站开始报名!...
- (附源码)计算机毕业设计ssm大学生心理健康咨询系统
- Python爬虫——正则表达式基础
- H.264——使用H.264视频编解码器JM进行YUV图像序列的编解码
- [手机分享]黑莓手机9系列分享之——黑莓9630
- java tr069_tr069 java源码 实现了简单的TR069功能 - 下载 - 搜珍网
- python人狗大战游戏_python入门教程NO.10「奇异博士大战灭霸」游戏,面向对象编程实战...
- php 正则匹配获取span标签值
- 二级计算机哪种最简单,计算机二级考什么好 哪个最实用