zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API。这里主要记录下JAVA客户端API的使用。

1.创建会话

客户端可以通过创建一个ZooKeeper实例来连接zookeeper服务器

ZooKeeper的4个构造函数如下:

  1. ZooKeeper(connectString, sessionTimeout, watcher);
  2. ZooKeeper(connectString, sessionTimeout, watcher,canBeReadOnly);
  3. ZooKeeper(connectString, sessionTimeout, watcher, sessionId, sessionPasswd);
  4. ZooKeeper(connectString, sessionTimeout, watcher, sessionId, sessionPasswd, canBeReadOnly);

参数说明:

connectString: 连接字符串 例如 "127.0.0.1:2181"

sessionTimeout: 会话超时时间 以毫秒为单位的整型值 在sessionTimeout时间内服务端与客户端没有有效的心跳检测 则会话失效

watcher: 默认的事件通知处理器

sessionId: 会话ID

sessionPasswd: 会话秘钥

canBeReadOnly: 是否是只读

  1. public class ZookeeperSampleTest implements Watcher {
  2. private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  3. public static void main(String args[]) throws IOException, InterruptedException{
  4. ZooKeeper zk = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleTest());
  5. System.out.println(zk.getState());
  6. try {
  7. connectedSemaphore.await();
  8. } catch (Exception e) {
  9. // TODO: handle exception
  10. }
  11. Long sessionId = zk.getSessionId();
  12. byte[] password = zk.getSessionPasswd();
  13. zk = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleTest(),1L,"test".getBytes());
  14. zk = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleTest(),sessionId,password);
  15. Thread.sleep(Integer.MAX_VALUE);
  16. //System.out.println("ZooKeeper session established");
  17. }
  18. @Override
  19. public void process(WatchedEvent event) {
  20. // TODO Auto-generated method stub
  21. System.out.println("Receive watched event :" + event);
  22. if(event.getState()==KeeperState.SyncConnected){
  23. connectedSemaphore.countDown();
  24. }
  25. }
  26. }

2.创建节点

创建节点的方式分为同步和异步,构造函数如下:

  1. zk.create(path, data, acl, createMode);
  2. , data, acl, createMode, cb, ctx);

参数说明:

path: 创建节点的路径 如:/zk-test

data[]: 字节数组,节点数据

acl: 权限

createMode: 节点类型  分为4种: 持久性节点,持久性有序节点,临时节点,临时有序节点

cb: 回调函数 需要实现StringCallback接口

ctx: 上下文 一般用于回调函数时候使用

  1. public class ZookeeperSampleCreateTest implements Watcher {
  2. public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  3. public static void main(String[] args) throws IOException, InterruptedException, KeeperException{
  4. ZooKeeper zk = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleCreateTest());
  5. connectedSemaphore.await();
  6. /*同步的方式*/
  7. /*String path1 = zk.create("/zk-test-ephemeral-", "test-ephemeral".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  8. System.out.println("Success create node :" + path1);
  9. String path2 = zk.create("/zk-test-ephemeral-", "test-ephemeral-sequential".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
  10. System.out.println("Success create node :" + path2);*/
  11. /*异步的方式*/
  12. zk.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL,new IStringCallback(),"i am context");
  13. zk.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL,new IStringCallback(),"i am context");
  14. zk.create("/zk-test-ephemeral-", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL,new IStringCallback(),"i am context");
  15. Thread.sleep(Integer.MAX_VALUE);
  16. }
  17. @Override
  18. public void process(WatchedEvent event) {
  19. // TODO Auto-generated method stub
  20. if(KeeperState.SyncConnected == event.getState()){
  21. connectedSemaphore.countDown();
  22. }
  23. }
  24. }
  25. class IStringCallback implements AsyncCallback.StringCallback{
  26. @Override
  27. public void processResult(int rc, String path, Object ctx, String name) {
  28. // TODO Auto-generated method stub
  29. System.out.println("Create path result: [" + rc + "," + path + "," + ctx + ", real path name " + name);
  30. }
  31. }

3.删除节点

  1. zk.delete(path,version);
  2. zk.delete(path,version,cb,ctx);

参数说明:

path:节点路径

version:版本号

cb: 回调函数

ctx: 上下文

4.获取子节点

getChildren有8个重载方法

  1. zk.getChildren(path, watch);
  2. zk.getChildren(path, watcher);
  3. zk.getChildren(path, watch, stat);
  4. zk.getChildren(path, watcher, stat);
  5. zk.getChildren(path, watch, cb, ctx);
  6. zk.getChildren(path, watcher, cb, ctx);

其中 回调函数有两种  ChildrenCallback  Children2Callback

参数说明:

path:节点路径

watch: boolean类型 如果为true 表示使用默认的Watcher 为false表示不需要Watcher

watcher: 通知处理器 在本次获取子节点以后  一旦子节点有变化机会收到服务端传来的通知

stat: 指定数据节点的节点状态信息,传入一个旧的stat对象,当执行方法后 stat会被服务器响应的新stat替换

cb:回调函数 有两种类型 上面已经说过

ctx: 上下文

5.获取节点数据

获取节点数据有4个重载方法

  1. zk.getData(path, watch, stat);
  2. zk.getData(path, watcher, stat);
  3. zk.getData(path, watch, cb, ctx);
  4. zk.getData(path, watcher, cb, ctx);

参数说明:

path: 节点路径

watch: boolean类型 如果为true 表示使用默认的Watcher 为false表示不需要Watcher

stat: 指定数据节点的节点状态信息,传入一个旧的stat对象,当执行方法后 stat会被服务器响应的新stat替换

cb:回调函数 有两种类型 上面已经说过

ctx: 上下文

在获取节点数据时候 如果注册watcher 在节点数据发送变化的时候会通知客户端,当客户端收到通知以后,如果想下次数据发送变化再次收到通知,

需要重新注册watcher,获取子节点机制也如此

6.更新节点数据

更新节点数据也分为同步异步两个方法

  1. zk.setData(path, data, version);
  2. zk.setData(path, data, version, cb, ctx);

参数说明:同上

  1. public class ZookeeperSampleGetDataTest implements Watcher {
  2. public static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  3. public static Stat stat = new Stat();
  4. public static ZooKeeper zk = null;
  5. public static void main(String[] args) throws IOException, KeeperException, InterruptedException{
  6. String path = "/zk-test";
  7. zk = new ZooKeeper("192.168.1.138:2181", 5000, new ZookeeperSampleGetDataTest());
  8. connectedSemaphore.await();
  9. //获取子节点
  10. /*zk.delete(path, 0);
  11. zk.create(path, "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  12. zk.create(path+"/c1", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  13. //同步方法获取children
  14. //List<String> childs = zk.getChildren(path, true);
  15. //System.out.println(childs);
  16. //异步方法获取children
  17. zk.getChildren(path, true, new IChildren2Callback(), null);
  18. zk.create(path+"/c2", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  19. Thread.sleep(Integer.MAX_VALUE);*/
  20. //获取节点数据
  21. zk.delete(path, 0);
  22. zk.create(path, "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  23. System.out.println(new String(zk.getData(path, true, stat)));
  24. /** czxid: 创建该节点的事务ID  mzxid: 更新该节点的事务ID  version: 数据版本*/
  25. System.out.println("Czxid: " + stat.getCzxid() + "Mzxid: " + stat.getMzxid() + "Version: " + stat.getVersion());
  26. zk.setData(path, "123".getBytes(), -1);
  27. Thread.sleep(Integer.MAX_VALUE);
  28. }
  29. @Override
  30. public void process(WatchedEvent event) {
  31. // TODO Auto-generated method stub
  32. if(KeeperState.SyncConnected==event.getState()){
  33. if(EventType.None==event.getType() && null==event.getPath()){
  34. connectedSemaphore.countDown();
  35. }else if(event.getType()==EventType.NodeChildrenChanged){
  36. try {
  37. System.out.println("Get Child :" + zk.getChildren(event.getPath(), true));
  38. } catch (KeeperException | InterruptedException e) {
  39. // TODO Auto-generated catch block
  40. e.printStackTrace();
  41. }
  42. }else if(event.getType()==EventType.NodeDataChanged){
  43. try {
  44. System.out.println(new String(zk.getData(event.getPath(), true, stat)));
  45. System.out.println("Czxid: " + stat.getCzxid() + "Mzxid: " + stat.getMzxid() + "Version: " + stat.getVersion());
  46. } catch (KeeperException | InterruptedException e) {
  47. // TODO Auto-generated catch block
  48. e.printStackTrace();
  49. }
  50. }
  51. }
  52. }
  53. }
  54. class IChildren2Callback implements AsyncCallback.Children2Callback{
  55. @Override
  56. public void processResult(int rc, String path, Object ctx,
  57. List<String> childrens, Stat stat) {
  58. // TODO Auto-generated method stub
  59. System.out.println("Get Children znode result: [response code: " + rc + ", param path: " + path + ", ctx " + ctx
  60. + ", childrens :" +  childrens + ", stat: " + stat);
  61. }
  62. }

其中更新节点数据 版本version问题 -1表示基于数据的最新版本更新 这里可以作为分布式锁的一个思路 如果客户端参入的version不是数据最新版本则会更新失败

比如目前节点"/zk-test"的数据版本为 2 而某个客户端尝试 执行 setData("/zk-test","test".getBytes(),1) 由于传入version为1 < 服务器目前版本2 这样就会更新失败

7.检测节点是否存在

  1. zk.exists(path, watch);
  2. zk.exists(path, watcher);
  3. zk.exists(path, watch, cb, ctx);
  4. zk.exists(path, watcher, cb, ctx);

如果判断节点是否存在是 注册watcher 会对节点是否存在进行监听--创建节点,删除节点,节点数据更新都会通知客户端

8.权限控制

zookeeper提供了ACL的权限控制机制,简单来说就是通过控制zookeeper服务器上数据节点的ACL,来控制客户端对节点的访问权限

  1. addAuthInfo(String scheme,byte[] auth);

参数说明:

scheme: 权限控制模式 分为: world ,auth,digest,ip和super

auth: 具体的权限信息  类似于shiro的权限字符串

如下代码:

  1. <span style="white-space:pre;">     </span>ZooKeeper zk1 = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleCreateTest());
  2. zk1.addAuthInfo("digest", "test:true".getBytes());
  3. zk1.create("/zk-test-auth", "123".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.EPHEMERAL);
  4. ZooKeeper zk2 = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleCreateTest());
  5. zk2.addAuthInfo("digest", "test:true".getBytes());
  6. System.out.println(new String(zk2.getData("/zk-test-auth", false, null)));
  7. ZooKeeper zk3 = new ZooKeeper("192.168.1.138:2181",5000,new ZookeeperSampleCreateTest());
  8. zk3.addAuthInfo("digest", "test:false".getBytes());
  9. zk3.getData("/zk-test-auth", false, null);

zk2设置了正确的权限 所以可以获取到节点数据  zk3则会抛异常

org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /zk-test-auth

zookeeper的Java客户端API的更多相关文章

  1. Zookeeper的java客户端API使用方法(五)

    前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...

  2. [转载] ZooKeeper的Java客户端API

    转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...

  3. 六:ZooKeeper的java客户端api的使用

    一:客户端链接测试 package com.yeepay.sxf.createConnection; import java.io.IOException; import org.apache.zoo ...

  4. 12. ZooKeeper之Java客户端API使用—创建会话。

    转自:https://blog.csdn.net/en_joker/article/details/78686649 客户端可以通过创建一个ZooKeeper(org.apache.zookeeper ...

  5. 13.Zookeeper的java客户端API使用方法

    转自:https://blog.csdn.net/jiuqiyuliang/article/details/56012027

  6. ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用

    zkclient是zookeeper的Java客户端.它让Zookeeper API 使用起来更简单:它非常方便订阅各种事件并自动重新绑定事件(会话建立.节点修改.节点删除.子节点变更等):它提供了s ...

  7. JAVA客户端API调用memcached两种方式

    1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...

  8. 02.ZooKeeper的Java客户端使用

    1.ZooKeeper常用客户端比较 1.ZooKeeper常用客户端     zookeeper的常用客户端有3种,分别是:zookeeper原生的.Apache Curator.开源的zkclie ...

  9. Java客户端API

    添加依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookee ...

随机推荐

  1. Docker(二):Registry 镜像仓库

  2. Eclipse插件的安装(手动安装),以安装SVN插件和中文语言包为例

    Eclipse 插件的手动配置 今天自己亲自手动安装了Eclipse插件,参考了网络上的一些文章,总结一下安装的方法.下面通过两个例子来分享一下自己的收获. 例1:SVN插件安装 1.在Eclipse ...

  3. Linux下ip地址查询

    [时间:2016-12] [状态:Open] [关键词:linux,ip地址,ifconfig,ip addr] 0 引用 说起来比较搞笑,我在windows下知道可以使用ipconfig命令查询本机 ...

  4. 1. Tensorflow高效流水线Pipeline

    1. Tensorflow高效流水线Pipeline 2. Tensorflow的数据处理中的Dataset和Iterator 3. Tensorflow生成TFRecord 4. Tensorflo ...

  5. 【iCore4 双核心板_FPGA】例程十一:FSMC总线通信实验——独立地址模式

    实验原理: STM32F767上自带FMC控制器,本实验将通过FMC总线的地址独立模式实现STM32与FPGA 之间通信,FPGA内部建立RAM块,FPGA桥接STM32和RAM块,本实验通过FSMC ...

  6. Docker镜像中的base镜像理解

    base 镜像有两层含义: 不依赖其他镜像,从 scratch 构建. 其他镜像可以之为基础进行扩展. 所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ub ...

  7. JVM 内部原理(三)— 基本概念之类文件格式

    JVM 内部原理(三)- 基本概念之类文件格式 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime Envi ...

  8. 教你一招:[转载]使用 Easy Sysprep v4 封装 Windows 7 精品

    (一) 安装与备份系统 1. 安装 Windows 7 先使用第三方分区工具(DiskGenius分区)在虚拟机中分区,然后将封装的母盘文件安装写入指定的安装盘,写入完成后重启系统开始部署. 2. 进 ...

  9. Ubuntu下搜狗输入法只显示黑框,不显示输入的汉字选项

    1. cd ~/.config 2.删除三个文件夹: SogouPY, SogouPY.users, sogou-qimpanel 然后重启输入法

  10. Java8学习笔记(九)--日期/时间(Date Time)API指南

    Java 8日期/时间( Date/Time)API是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容 ...