zookeeper的Java客户端API
zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API。这里主要记录下JAVA客户端API的使用。
1.创建会话
客户端可以通过创建一个ZooKeeper实例来连接zookeeper服务器
ZooKeeper的4个构造函数如下:
- ZooKeeper(connectString, sessionTimeout, watcher);
- ZooKeeper(connectString, sessionTimeout, watcher,canBeReadOnly);
- ZooKeeper(connectString, sessionTimeout, watcher, sessionId, sessionPasswd);
- ZooKeeper(connectString, sessionTimeout, watcher, sessionId, sessionPasswd, canBeReadOnly);
参数说明:
connectString: 连接字符串 例如 "127.0.0.1:2181"
sessionTimeout: 会话超时时间 以毫秒为单位的整型值 在sessionTimeout时间内服务端与客户端没有有效的心跳检测 则会话失效
watcher: 默认的事件通知处理器
sessionId: 会话ID
sessionPasswd: 会话秘钥
canBeReadOnly: 是否是只读
- public class ZookeeperSampleTest implements Watcher {
- private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
- public static void main(String args[]) throws IOException, InterruptedException{
- ZooKeeper zk = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleTest());
- System.out.println(zk.getState());
- try {
- connectedSemaphore.await();
- } catch (Exception e) {
- // TODO: handle exception
- }
- Long sessionId = zk.getSessionId();
- byte[] password = zk.getSessionPasswd();
- zk = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleTest(),1L,"test".getBytes());
- zk = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleTest(),sessionId,password);
- Thread.sleep(Integer.MAX_VALUE);
- //System.out.println("ZooKeeper session established");
- }
- @Override
- public void process(WatchedEvent event) {
- // TODO Auto-generated method stub
- System.out.println("Receive watched event :" + event);
- if(event.getState()==KeeperState.SyncConnected){
- connectedSemaphore.countDown();
- }
- }
- }
2.创建节点
创建节点的方式分为同步和异步,构造函数如下:
- zk.create(path, data, acl, createMode);
- , data, acl, createMode, cb, ctx);
参数说明:
path: 创建节点的路径 如:/zk-test
data[]: 字节数组,节点数据
acl: 权限
createMode: 节点类型 分为4种: 持久性节点,持久性有序节点,临时节点,临时有序节点
cb: 回调函数 需要实现StringCallback接口
ctx: 上下文 一般用于回调函数时候使用
- public class ZookeeperSampleCreateTest implements Watcher {
- public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
- public static void main(String[] args) throws IOException, InterruptedException, KeeperException{
- ZooKeeper zk = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleCreateTest());
- connectedSemaphore.await();
- /*同步的方式*/
- /*String path1 = zk.create("/zk-test-ephemeral-", "test-ephemeral".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
- System.out.println("Success create node :" + path1);
- String path2 = zk.create("/zk-test-ephemeral-", "test-ephemeral-sequential".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
- System.out.println("Success create node :" + path2);*/
- /*异步的方式*/
- zk.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL,new IStringCallback(),"i am context");
- zk.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL,new IStringCallback(),"i am context");
- zk.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL,new IStringCallback(),"i am context");
- Thread.sleep(Integer.MAX_VALUE);
- }
- @Override
- public void process(WatchedEvent event) {
- // TODO Auto-generated method stub
- if(KeeperState.SyncConnected == event.getState()){
- connectedSemaphore.countDown();
- }
- }
- }
- class IStringCallback implements AsyncCallback.StringCallback{
- @Override
- public void processResult(int rc, String path, Object ctx, String name) {
- // TODO Auto-generated method stub
- System.out.println("Create path result: [" + rc + "," + path + "," + ctx + ", real path name " + name);
- }
- }
3.删除节点
- zk.delete(path,version);
- zk.delete(path,version,cb,ctx);
参数说明:
path:节点路径
version:版本号
cb: 回调函数
ctx: 上下文
4.获取子节点
getChildren有8个重载方法
- zk.getChildren(path, watch);
- zk.getChildren(path, watcher);
- zk.getChildren(path, watch, stat);
- zk.getChildren(path, watcher, stat);
- zk.getChildren(path, watch, cb, ctx);
- zk.getChildren(path, watcher, cb, ctx);
其中 回调函数有两种 ChildrenCallback Children2Callback
参数说明:
path:节点路径
watch: boolean类型 如果为true 表示使用默认的Watcher 为false表示不需要Watcher
watcher: 通知处理器 在本次获取子节点以后 一旦子节点有变化机会收到服务端传来的通知
stat: 指定数据节点的节点状态信息,传入一个旧的stat对象,当执行方法后 stat会被服务器响应的新stat替换
cb:回调函数 有两种类型 上面已经说过
ctx: 上下文
5.获取节点数据
获取节点数据有4个重载方法
- zk.getData(path, watch, stat);
- zk.getData(path, watcher, stat);
- zk.getData(path, watch, cb, ctx);
- zk.getData(path, watcher, cb, ctx);
参数说明:
path: 节点路径
watch: boolean类型 如果为true 表示使用默认的Watcher 为false表示不需要Watcher
stat: 指定数据节点的节点状态信息,传入一个旧的stat对象,当执行方法后 stat会被服务器响应的新stat替换
cb:回调函数 有两种类型 上面已经说过
ctx: 上下文
在获取节点数据时候 如果注册watcher 在节点数据发送变化的时候会通知客户端,当客户端收到通知以后,如果想下次数据发送变化再次收到通知,
需要重新注册watcher,获取子节点机制也如此
6.更新节点数据
更新节点数据也分为同步异步两个方法
- zk.setData(path, data, version);
- zk.setData(path, data, version, cb, ctx);
参数说明:同上
- public class ZookeeperSampleGetDataTest implements Watcher {
- public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
- public static Stat stat = new Stat();
- public static ZooKeeper zk = null;
- public static void main(String[] args) throws IOException, KeeperException, InterruptedException{
- String path = "/zk-test";
- zk = new ZooKeeper("192.168.1.138:2181", 5000, new ZookeeperSampleGetDataTest());
- connectedSemaphore.await();
- //获取子节点
- /*zk.delete(path, 0);
- zk.create(path, "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
- zk.create(path+"/c1", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
- //同步方法获取children
- //List<String> childs = zk.getChildren(path, true);
- //System.out.println(childs);
- //异步方法获取children
- zk.getChildren(path, true, new IChildren2Callback(), null);
- zk.create(path+"/c2", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
- Thread.sleep(Integer.MAX_VALUE);*/
- //获取节点数据
- zk.delete(path, 0);
- zk.create(path, "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
- System.out.println(new String(zk.getData(path, true, stat)));
- /** czxid: 创建该节点的事务ID mzxid: 更新该节点的事务ID version: 数据版本*/
- System.out.println("Czxid: " + stat.getCzxid() + "Mzxid: " + stat.getMzxid() + "Version: " + stat.getVersion());
- zk.setData(path, "123".getBytes(), -1);
- Thread.sleep(Integer.MAX_VALUE);
- }
- @Override
- public void process(WatchedEvent event) {
- // TODO Auto-generated method stub
- if(KeeperState.SyncConnected==event.getState()){
- if(EventType.None==event.getType() && null==event.getPath()){
- connectedSemaphore.countDown();
- }else if(event.getType()==EventType.NodeChildrenChanged){
- try {
- System.out.println("Get Child :" + zk.getChildren(event.getPath(), true));
- } catch (KeeperException | InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }else if(event.getType()==EventType.NodeDataChanged){
- try {
- System.out.println(new String(zk.getData(event.getPath(), true, stat)));
- System.out.println("Czxid: " + stat.getCzxid() + "Mzxid: " + stat.getMzxid() + "Version: " + stat.getVersion());
- } catch (KeeperException | InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- }
- class IChildren2Callback implements AsyncCallback.Children2Callback{
- @Override
- public void processResult(int rc, String path, Object ctx,
- List<String> childrens, Stat stat) {
- // TODO Auto-generated method stub
- System.out.println("Get Children znode result: [response code: " + rc + ", param path: " + path + ", ctx " + ctx
- + ", childrens :" + childrens + ", stat: " + stat);
- }
- }
其中更新节点数据 版本version问题 -1表示基于数据的最新版本更新 这里可以作为分布式锁的一个思路 如果客户端参入的version不是数据最新版本则会更新失败
比如目前节点"/zk-test"的数据版本为 2 而某个客户端尝试 执行 setData("/zk-test","test".getBytes(),1) 由于传入version为1 < 服务器目前版本2 这样就会更新失败
7.检测节点是否存在
- zk.exists(path, watch);
- zk.exists(path, watcher);
- zk.exists(path, watch, cb, ctx);
- zk.exists(path, watcher, cb, ctx);
如果判断节点是否存在是 注册watcher 会对节点是否存在进行监听--创建节点,删除节点,节点数据更新都会通知客户端
8.权限控制
zookeeper提供了ACL的权限控制机制,简单来说就是通过控制zookeeper服务器上数据节点的ACL,来控制客户端对节点的访问权限
- addAuthInfo(String scheme,byte[] auth);
参数说明:
scheme: 权限控制模式 分为: world ,auth,digest,ip和super
auth: 具体的权限信息 类似于shiro的权限字符串
如下代码:
- <span style="white-space:pre;"> </span>ZooKeeper zk1 = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleCreateTest());
- zk1.addAuthInfo("digest", "test:true".getBytes());
- zk1.create("/zk-test-auth", "123".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.EPHEMERAL);
- ZooKeeper zk2 = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleCreateTest());
- zk2.addAuthInfo("digest", "test:true".getBytes());
- System.out.println(new String(zk2.getData("/zk-test-auth", false, null)));
- ZooKeeper zk3 = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleCreateTest());
- zk3.addAuthInfo("digest", "test:false".getBytes());
- zk3.getData("/zk-test-auth", false, null);
zk2设置了正确的权限 所以可以获取到节点数据 zk3则会抛异常
org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /zk-test-auth
zookeeper的Java客户端API的更多相关文章
- Zookeeper的java客户端API使用方法(五)
前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...
- [转载] ZooKeeper的Java客户端API
转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...
- 六:ZooKeeper的java客户端api的使用
一:客户端链接测试 package com.yeepay.sxf.createConnection; import java.io.IOException; import org.apache.zoo ...
- 12. ZooKeeper之Java客户端API使用—创建会话。
转自:https://blog.csdn.net/en_joker/article/details/78686649 客户端可以通过创建一个ZooKeeper(org.apache.zookeeper ...
- 13.Zookeeper的java客户端API使用方法
转自:https://blog.csdn.net/jiuqiyuliang/article/details/56012027
- ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用
zkclient是zookeeper的Java客户端.它让Zookeeper API 使用起来更简单:它非常方便订阅各种事件并自动重新绑定事件(会话建立.节点修改.节点删除.子节点变更等):它提供了s ...
- JAVA客户端API调用memcached两种方式
1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...
- 02.ZooKeeper的Java客户端使用
1.ZooKeeper常用客户端比较 1.ZooKeeper常用客户端 zookeeper的常用客户端有3种,分别是:zookeeper原生的.Apache Curator.开源的zkclie ...
- Java客户端API
添加依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookee ...
随机推荐
- Xilinx 常用模块汇总(verilog)【02】
作者:桂. 时间:2018-05-08 18:35:56 链接:http://www.cnblogs.com/xingshansi/p/9010282.html [本文遗留几处细节问题,待闲下来解决 ...
- Atitit easyui翻页组件与vue的集成解决方案attilax总结
Atitit easyui翻页组件与vue的集成解决方案attilax总结 ===============使用1 ===========\paggingUtil_easyui_vue.js2 C:\U ...
- 将png图片转换为字体图标
字体图标不仅可以随意调整大小,而且可以避免在页面制作过程中引用N多的图片,发送请求造成的流量浪费,因此,我们可以将图标的icon转换成字体图标: 方法一: 1.将png格式的图片转换成svg格式: 网 ...
- iOS开发微信支付
现在基本所有的App都会接入支付宝支付以及微信支付,也有很多第三方提供给你 SDK帮你接入,但是这种涉及到支付的东西还是自己服务器搞来的好一些,其实搞懂了 逻辑非常的简单,下面直接给大家说说下基本流程 ...
- Java知多少(1) 语言概述
Java语言是SUN(Stanford University Network,斯坦福大学网络公司)公司1995年推出的一门高级编程语言,起初主要应用在小型消费电子产品上,后来随着互联网的兴起,Java ...
- 【转】ELK 日志分析系统
大纲: 一.简介 二.Logstash 三.Redis 四.Elasticsearch 五.Kinaba 一.简介 1.核心组成 ELK由Elasticsearch.Logstash和Kibana三部 ...
- 《FPGA全程进阶---实战演练》第五章 基于74HC595的LED操作
1基础理论部分 1.1分频 分频,是的,这个概念也很重要.分频是指将一单一频率信号的频率降低为原来的1/N,就叫N分频.实现分频的电路或装置称为“分频器”,如把33MHZ的信号2分频得到16.5MHZ ...
- python3二元Logistics Regression 回归分析(LogisticRegression)
纲要 boss说增加项目平台分析方法: T检验(独立样本T检验).线性回归.二元Logistics回归.因子分析.可靠性分析 根本不懂,一脸懵逼状态,分析部确实有人才,反正我是一脸懵 首先解释什么是二 ...
- DWZ使用中遇到的坑
DWZ官方文档中关于文件上传表单的提交: 因为Ajax不支持enctype="multipart/form-data" 所以用隐藏iframe来处理无刷新表单提交. <for ...
- MyBatis Generator使用com.mysql.cj.jdbc.Driver遇到的问题
MyBatis Generator使用com.mysql.cj.jdbc.Driver Mybatis Generator 1.3.5 新建了一个decision库,并创建了一张user表 impor ...