目录

一、常用客户端

1.1 原生API

1.1.1 增删改查

1.1.2 监听机制

1.2 zkClient

1.2.1 增删改查

1.2.2 监听机制


一、常用客户端

zk目前有三种客户端:原生API、zkClient、Curator

主要学习原生API、zkClient

1.1 原生API

1.1.1 增删改查

//客户端的基本操作
public class TestJavaApi implements Watcher{ private static final int SESSION_TIMEOUT = 10000;private static final String CONNECTION_STRING = "127.0.0.1:2181";private static final String ZK_PATH = "/zc";private ZooKeeper zk = null;private CountDownLatch connectedSemaphore = new CountDownLatch(1);//创建zc连接public void createConnecting(String connectString,int sessionTimeout) {System.out.println("createConnecting,1,正在连接");this.releaseConnection();try {System.out.println("createConnecting,2,正在连接");zk = new ZooKeeper(connectString, sessionTimeout, this);System.out.println("createConnecting,3,await()");connectedSemaphore.await();System.out.println("createConnecting,4,连接成功");}catch (Exception e) {System.out.println("连接失败:" + e.getMessage());}}//关闭连接public void releaseConnection() {if(null != this.zk) {try {this.zk.close();} catch (Exception e) {System.out.println("关闭失败:" + e.getMessage());}         }}//创建节点public boolean createPath(String path,String data) {try {System.out.println("节点创建成功:" + this.zk.create(path,data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL));} catch (Exception e) {System.out.println("节点创建失败");}return true;}//读取指定节点的内容public String readData(String path) {try {String resultStr = new String(this.zk.getData(path, false, null));System.out.println("节点内容:" + resultStr);return resultStr;} catch (Exception e) {return "";}}//更新指定节点的内容public boolean writeData(String path,String data) {try {this.zk.setData(path, data.getBytes(), -1);} catch (Exception e) {// TODO: handle exception}return false;}//删除指定节点public void deleteNodes(String path) {try {//-1 表示不需要版本验证this.zk.delete(path, -1);} catch (Exception e) {// TODO: handle exception}}//实现了watcher机制,可理解为事件监听@Overridepublic void process(WatchedEvent event) {System.out.println("收到事件通知");//当已经连接上服务端,再继续执行操作if(Event.KeeperState.SyncConnected == event.getState()) {System.out.println(event.getState());connectedSemaphore.countDown();}}public static void main(String[] args) {TestJavaApi sample = new TestJavaApi();System.out.println("准备连接");sample.createConnecting(CONNECTION_STRING, SESSION_TIMEOUT);if(sample.createPath(ZK_PATH, "我是节点内容")) {sample.readData(ZK_PATH);sample.writeData(ZK_PATH, "更新");sample.readData(ZK_PATH);sample.deleteNodes(ZK_PATH);}sample.releaseConnection();}}

1.1.2 监听机制

zookeeper提供一个异步事件watch,特点如下:

1、一次性,watch事件只会在调用时发生,不保持监听,意味着只有触发watch事件时监听
2、注册watch事件首先需要继承Watch类,并重写process方法,为该事件的回调方法
3、process返回了一个WatchEvent对象,可以返回监听的内容,如:
     zookeeper的连接状态:连接,超时等
     事件类型:节点创建,节点数据改变,子节点改变,以及无改变等等
     监听的节点路径

上述代码中就注册了一个watch,当zookeeper的连接状态为已连接时,才会结束同步,执行接下来的指令

1.2 zkClient

原生客户端存在一定的缺点:

1、会话的连接是异步的,所以需要并发工具类CountDownLatch来控制,以防还没连接上服务器,就执行其他命令

2、Watch机制需要重复注册

3、开发的复杂度比较高

因此,看下zkClient是如何操作的

1.2.1 增删改查

public class ZkClientOperator {//zookeeper地址 static final String CONNECT_ADDR = "127.0.0.1:2181";//session超时时间,单位毫秒 static final int SESSION_OUTTIME = 10000;public static void main(String[] args) throws Exception {ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), SESSION_OUTTIME);//1、提供创建不同类型节点的15种方法,简单列举几种zkc.createEphemeral("/zode1");//创建临时节点zkc.createPersistent("/zode2");//创建持久节点zkc.createPersistent("/zode2/z2", true);//创建持久化节点,true表示如果父节点不存在则创建父节点zkc.createPersistentSequential("/zode3","zode_value");//创建持久有序节点Thread.sleep(10000);//2、删除zkc.delete("/zode1");//删除节点zkc.deleteRecursive("/zode2/z2");//递归删除,在原生API中,如果一个节点存在子节点,那么它将无法直接删除,必须一层层遍历先删除全部子节点,然后才能将目标节点删除。//3、设置path和data 并且读取子节点和每个节点的内容zkc.createPersistent("/zode3", "zc");zkc.createPersistent("/zode3/zc3", "zc3");zkc.createPersistent("/zode3/zc4", "zc4");List<String> list = zkc.getChildren("/zode3");for(String p : list){System.out.println(p);String rp = "/zode3/" + p;String data = zkc.readData(rp);System.out.println("节点为:" + rp + ",内容为: " + data);}//4、更新和判断节点是否存在zkc.writeData("/zode3/zc3", "新内容");System.out.println(zkc.readData("/zode3/zc3").toString());System.out.println(zkc.exists("/zode3/zc3"));}
}

1.2.2 监听机制

zkClinet的监听分为两种:对节点本身的监听,对子节点的监听,对服务状态的监听

分别对应3种监听器接口:IZKChildListener,IZKDataListener,IZKStateListener;

public class TestZkClientWatcher {//zookeeper地址 static final String CONNECT_ADDR = "127.0.0.1:2181";//session超时时间,单位毫秒 static final int SESSION_OUTTIME = 10000;@Test//监听子节点变化public  void testZkClientWatcher1() throws Exception {ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), SESSION_OUTTIME);//对父节点添加监听子节点变化。zkc.subscribeChildChanges("/super", new IZkChildListener() {@Overridepublic void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {System.out.println("parentPath: " + parentPath);System.out.println("currentChilds: " + currentChilds);}});Thread.sleep(3000);zkc.createPersistent("/super");Thread.sleep(1000);zkc.createPersistent("/super" + "/" + "c1", "c1内容");Thread.sleep(1000);zkc.delete("/super/c1");Thread.sleep(1000);zkc.deleteRecursive("/super");Thread.sleep(Integer.MAX_VALUE);}@Test//监听节点本身public void testZkClientWatcher2() throws Exception {ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), SESSION_OUTTIME);zkc.createPersistent("/super", "1234");//添加监听zkc.subscribeDataChanges("/super", new IZkDataListener() {@Overridepublic void handleDataDeleted(String path) throws Exception {System.out.println("删除的节点为:" + path);}@Overridepublic void handleDataChange(String path, Object data) throws Exception {System.out.println("变更的节点为:" + path + ", 变更内容为:" + data);}});Thread.sleep(3000);zkc.writeData("/super", "456", -1);Thread.sleep(1000);zkc.delete("/super");Thread.sleep(Integer.MAX_VALUE);}@Test//监听服务状态public void testZkClientWatcher3() throws Exception {ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR),SESSION_OUTTIME);zkc.subscribeStateChanges(new IZkStateListener() {@Overridepublic void handleStateChanged(KeeperState state) throws Exception {if(state==KeeperState.SyncConnected){//当我重新启动后start,监听触发System.out.println("连接成功");}else if(state==KeeperState.Disconnected){System.out.println("连接断开");//当我在服务端将zk服务stop时,监听触发}elseSystem.out.println("其他状态"+state);}@Overridepublic void handleNewSession() throws Exception {System.out.println("---->重建session");}@Overridepublic void handleSessionEstablishmentError(Throwable error) throws Exception {}});Thread.sleep(Integer.MAX_VALUE);}
}

zookeeper(3)—— zk客户端的使用相关推荐

  1. linux怎么看zk的版本号,zookeeper基本特性与基于Linux的ZK客户端命令行学习

    zookeeper常用命令行操作 通过 zkCli.sh 来打开zk客户端: [root@study-01 ~]# zkCli.sh [zk: localhost:2181(CONNECTED) 0] ...

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

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

  3. 分布式架构-ZK客户端工具Curator框架分布式锁及基本使用

    分布式架构-基于Curator分布式锁及基本使用 一.Curator Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作 ...

  4. 2. ZK客户端与服务端建立连接的过程(基于NIO)

    ZK客户端与服务端建立连接的过程 引例 1. 启动SendThread 2. 状态初始化 3. 开始连接 4. 处理服务端连接响应 5. 流程图 在上一篇<客户端启动源码分析>文章中讲到了 ...

  5. ZooKeeper进阶之客户端命令行操作

    一 Znode数据结构 ZK有一个最开始的节点 / ZK的节点叫做znode节点 每个znode节点都可存储数据 每个znode节点(临时节点除外)都可创建自己的子节点 多个znode节点共同形成了z ...

  6. ZooKeeper :Java客户端Watcher API介绍

    ZooKeeper :Java客户端Watcher API介绍 在上一篇博客中,博主给大家介绍了Java客户端的Session.ACL以及Znode API: ZooKeeper :Java客户端Se ...

  7. mvvm 后端_ZK实际应用:MVVM –与ZK客户端API一起使用

    mvvm 后端 在以前的文章中,我们已经使用ZK的MVVM实现了以下功能: 将数据加载到表中 使用表单绑定保存数据 删除条目并以编程方式更新视图 ZK MVVM和ZK MVC实现方式之间的主要区别是, ...

  8. ZK实际应用:MVVM –与ZK客户端API一起使用

    在之前的文章中,我们使用ZK的MVVM实现了以下功能: 将数据加载到表中 使用表单绑定保存数据 删除条目并以编程方式更新视图 ZK MVVM和ZK MVC实现方式之间的主要区别是,我们不直接在cont ...

  9. ZooKeeper原生java客户端使用

    2019独角兽企业重金招聘Python工程师标准>>> 准备: 要么使用maven,要么手动引入zookeeper-3.4.6.jar和zk包lib文件夹下的jar包,slf4j-a ...

  10. Zookeeper实战之客户端Curator vs zkClient

    1. zookeeper应用开发 Zookeeper应用开发,需要使用Zookeeper的java 客户端API ,去连接和操作Zookeeper 集群. 可以供选择的java 客户端API 有:Zo ...

最新文章

  1. RepVGG:极简架构,SOTA性能,论文解读
  2. 【机器学习】基于蚁群算法的多元非线性函数极值寻优
  3. ISR:中断服务程序需要满足的要求
  4. leetcode 638. Shopping Offers | 638. 大礼包(动态规划,多约束背包问题)
  5. font-size用VW来写的方法
  6. R开发(part9)--文件系统管理
  7. OP AMP - 反馈理论在运放中的应用
  8. 贪心策略取得最优解的条件_什么是贪心算法?
  9. java mysql geo_GEO数据库简介
  10. java web使用jquery,JAVA_Web_JQuery
  11. 使用 jQuery Mobile 与 HTML5 开发 Web App (十九) —— HTML5 对 Web App 的影响
  12. python连接数据库设置编码_Python学习18-连接数据库
  13. Moodle 安装出现访问空白和open_basedir问题
  14. Java字符串中数据排序
  15. 全网最全的Java岗集合面试题(含答案)
  16. 计算机一直进入安全模式开机,电脑启动时自动进入安全模式怎么办
  17. 5. Django templates模板 (一)
  18. php表格制作底纹怎么做,HTML表格标记教程(36):表头的背景色属性BGCOLOR
  19. 小程序如何实现获客拉新提升复购率双营收?优惠券策略了解一下
  20. flash php mysql_求 Flash + PHP + MYSQL 简单的留言本~

热门文章

  1. Swift和正则表达式:语法
  2. 2014秋季新款韩版潮流女装黑白拼色气质一字领打底收腰显瘦连衣裙F506
  3. js的window.print打印页面 不打印网页中的“打印”按钮
  4. 将本地镜像发布到阿里云仓库
  5. 树的数据结构代码_如何以无代码方式学习树数据结构
  6. PyTorch Python API详解大全(持续更新ing...)
  7. 弹性云服务器由虚拟私有云组成,弹性云服务器组成
  8. Java 多线程学习笔记(狂神)
  9. 基于SigmaStudio DSP车载音频功放开发流程
  10. 运维人员必会的系统安全