• 为什么使用Curator?
  1. Curator本身是Netflix公司开源的zookeeper客户端;
  2. Curator 提供了各种应用场景的实现封装;
  3. curator-framework 提供了fluent风格api;
  4. curator-replice 提供了实现封装;
  • 引入依赖:
  1. <dependency>
  2. <groupId>org.apache.curator</groupId>
  3. <artifactId>curator-framework</artifactId>
  4. <version>2.11.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.curator</groupId>
  8. <artifactId>curator-recipes</artifactId>
  9. <version>2.11.0</version>
  10. </dependency>
  • 创建会话连接
  1. package com.karat.cn.zookeeper.curator;
  2.  
  3. import org.apache.curator.framework.CuratorFramework;
  4. import org.apache.curator.framework.CuratorFrameworkFactory;
  5. import org.apache.curator.retry.ExponentialBackoffRetry;
  6.  
  7. /**
  8. * 创建会话连接
  9. * @author Administrator
  10. *
  11. */
  12. public class CuratorCreateSessionDemo {
  13. private final static String CONNECTSTRING="47.107.121.215:2181";
  14.  
  15. public static void main(String args[]) {
  16. //创建会话连接的2种方式
  17. //正常的风格
  18. CuratorFramework curatorFramework1=CuratorFrameworkFactory.
  19. newClient(CONNECTSTRING,5000,5000,
  20. new ExponentialBackoffRetry(1000, 3));//重试机制
  21. curatorFramework1.start();
  22. //fluent风格
  23. CuratorFramework curatorFramework2=CuratorFrameworkFactory.builder().
  24. connectString(CONNECTSTRING).
  25. sessionTimeoutMs(5000).
  26. retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();
  27. curatorFramework2.start();
  28. System.out.println("success");
  29.  
  30. }
  31. }
  • curator连接的重试策略
  1. ExponentialBackoffRetry() 衰减重试
  2. RetryNTimes 指定最大重试次数
  3. RetryOneTime 仅重试一次
  4. RetryUnitilElapsed 一直重试知道规定的时间
  • 节点操作
  1. package com.karat.cn.zookeeper.curator;
  2.  
  3. import org.apache.curator.framework.CuratorFramework;
  4. import org.apache.curator.framework.CuratorFrameworkFactory;
  5. import org.apache.curator.framework.api.BackgroundCallback;
  6. import org.apache.curator.framework.api.CuratorEvent;
  7. import org.apache.curator.framework.api.transaction.CuratorTransactionResult;
  8. import org.apache.curator.retry.ExponentialBackoffRetry;
  9. import org.apache.zookeeper.CreateMode;
  10. import org.apache.zookeeper.data.Stat;
  11.  
  12. import java.util.Collection;
  13. import java.util.Collections;
  14. import java.util.concurrent.CountDownLatch;
  15. import java.util.concurrent.Executor;
  16. import java.util.concurrent.ExecutorService;
  17. import java.util.concurrent.Executors;
  18.  
  19. /**
  20. * curator对节点的增删改查
  21. * @author Administrator
  22. *
  23. */
  24. public class CuratorOperatorDemo {
  25.  
  26. public static void main(String[] args) throws InterruptedException {
  27. CuratorFramework curatorFramework=CuratorClientUtils.getInstance();
  28. System.out.println("连接成功.........");
  29.  
  30. //fluent风格api增删改查操作
  31. /**
  32. * 创建节点
  33. */
  34. /*try {
  35. String result=curatorFramework.create()
  36. .creatingParentsIfNeeded()//创建父节点
  37. .withMode(CreateMode.PERSISTENT)//持久节点:节点创建后,会一直存在,不会因客户端会话失效而删除;
  38. .forPath("/curator/curator1/curator11","123".getBytes());
  39. System.out.println(result);
  40. } catch (Exception e) {
  41. e.printStackTrace();
  42. }*/
  43. /**
  44. * 删除节点
  45. */
  46. /*try {
  47. //默认情况下,version为-1
  48. curatorFramework.delete()//删除操作
  49. .deletingChildrenIfNeeded()//删除子节点
  50. .forPath("/node");
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. }*/
  54.  
  55. /**
  56. * 查询
  57. */
  58. /*Stat stat=new Stat();
  59. try {
  60. byte[] bytes=curatorFramework
  61. .getData()
  62. .storingStatIn(stat)
  63. .forPath("/curator/curator1/curator11");
  64. System.out.println(new String(bytes)+"-->stat:"+stat);
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. }*/
  68. /**
  69. * 更新
  70. */
  71. /*try {
  72. Stat stat=curatorFramework
  73. .setData()
  74. .forPath("/curator","lijing".getBytes());
  75. System.out.println(stat);
  76. } catch (Exception e) {
  77. e.printStackTrace();
  78. }*/
  79.  
  80. /**
  81. * 异步操作
  82. */
  83. /*ExecutorService service= Executors.newFixedThreadPool(1);//线程池(创建节点的事件由线程池处理)
  84. CountDownLatch countDownLatch=new CountDownLatch(1);//计数器
  85. try {
  86. curatorFramework
  87. .create()
  88. .creatingParentsIfNeeded()
  89. .withMode(CreateMode.EPHEMERAL)
  90. .inBackground(new BackgroundCallback() {
  91. @Override
  92. public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {
  93. System.out.println(Thread.currentThread().getName()
  94. +"->resultCode:"
  95. +curatorEvent.getResultCode()+"->"//响应结果
  96. +curatorEvent.getType());//当前节点操作类型
  97. countDownLatch.countDown();
  98. }
  99. },service)
  100. .forPath("/mic","123".getBytes());
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. }
  104. countDownLatch.await();//等待(让当前线程等待)
  105. service.shutdown();//关闭线程*/
  106. /**
  107. * 事务操作(curator独有的)
  108. */
  109. try {
  110. Collection<CuratorTransactionResult> resultCollections=curatorFramework
  111. .inTransaction()//开启一个事务
  112. .create()
  113. .forPath("/trans","111".getBytes())//创建一个节点
  114. .and()//通过and去修改一个节点
  115. .setData()
  116. .forPath("/curator","111".getBytes())//当修改节点不存在,则一成功一失败,事务不会提交成功
  117. .and()
  118. .commit();//提交事务
  119. for (CuratorTransactionResult result:resultCollections){
  120. System.out.println(result.getForPath()+"->"+result.getType());
  121. }
  122. } catch (Exception e) {
  123. e.printStackTrace();
  124. }
  125. }
  126. }
  • 将会话连接做成工具类
  1. package com.karat.cn.zookeeper.curator;
  2.  
  3. import org.apache.curator.framework.CuratorFramework;
  4. import org.apache.curator.framework.CuratorFrameworkFactory;
  5. import org.apache.curator.retry.ExponentialBackoffRetry;
  6.  
  7. /**
  8. * 会话连接工具类
  9. * @author Administrator
  10. *
  11. */
  12. public class CuratorClientUtils {
  13.  
  14. private static CuratorFramework curatorFramework;
  15.  
  16. private final static String CONNECTSTRING="47.107.121.215:2181";
  17.  
  18. public static CuratorFramework getInstance(){
  19. curatorFramework= CuratorFrameworkFactory.
  20. newClient(CONNECTSTRING,5000,5000,
  21. new ExponentialBackoffRetry(1000,3));
  22. curatorFramework.start();
  23. return curatorFramework;
  24. }
  25. }
  • 监听
  1. package com.karat.cn.zookeeper.curator;
  2.  
  3. import org.apache.curator.framework.CuratorFramework;
  4. import org.apache.curator.framework.recipes.cache.NodeCache;
  5. import org.apache.curator.framework.recipes.cache.PathChildrenCache;
  6. import org.apache.zookeeper.CreateMode;
  7.  
  8. import java.util.concurrent.TimeUnit;
  9.  
  10. /**
  11. * 监听
  12. * @author Administrator
  13. *
  14. */
  15. public class CuratorEventDemo {
  16.  
  17. /**
  18. * 三种watcher来做节点的监听
  19. * pathcache 监视一个路径下子节点的创建、删除、节点数据更新
  20. * NodeCache 监视一个节点的创建、更新、删除
  21. * TreeCache pathcaceh+nodecache 的合体(监视路径下的创建、更新、删除事件),
  22. * 缓存路径下的所有子节点的数据
  23. */
  24.  
  25. public static void main(String[] args) throws Exception {
  26. CuratorFramework curatorFramework=CuratorClientUtils.getInstance();
  27. /**
  28. * 节点变化NodeCache
  29. */
  30. //监听
  31. /*NodeCache cache=new NodeCache(curatorFramework,"/curator",false);
  32. cache.start(true);
  33. //监听事件
  34. cache.getListenable().addListener(()-> System.out.println("节点数据发生变化,变化后的结果" +
  35. ":"+new String(cache.getCurrentData().getData())));
  36. //修改节点
  37. curatorFramework.setData().forPath("/curator","666".getBytes());*/
  38.  
  39. /**
  40. * PatchChildrenCache
  41. */
  42.  
  43. PathChildrenCache cache=new PathChildrenCache(curatorFramework,"/event",true);//参数2监听的节点,参数3是否缓存
  44. cache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
  45. // Normal/ BUILD_INITIAL_CACHE /POST_INITIALIZED_EVENT
  46.  
  47. cache.getListenable().addListener((curatorFramework1,pathChildrenCacheEvent)->{
  48. switch (pathChildrenCacheEvent.getType()){
  49. case CHILD_ADDED:
  50. System.out.println("增加子节点");
  51. break;
  52. case CHILD_REMOVED:
  53. System.out.println("删除子节点");
  54. break;
  55. case CHILD_UPDATED:
  56. System.out.println("更新子节点");
  57. break;
  58. default:break;
  59. }
  60. });
  61. //创建节点
  62. curatorFramework.create().withMode(CreateMode.PERSISTENT).forPath("/event","event".getBytes());
  63. TimeUnit.SECONDS.sleep(1);
  64. System.out.println("1");
  65. //创建子节点
  66. curatorFramework.create().withMode(CreateMode.EPHEMERAL).forPath("/event/event1","1".getBytes());
  67. TimeUnit.SECONDS.sleep(1);
  68. System.out.println("2");
  69. //修改节点
  70. curatorFramework.setData().forPath("/event/event1","222".getBytes());
  71. TimeUnit.SECONDS.sleep(1);
  72. System.out.println("3");
  73. //删除节点
  74. curatorFramework.delete().forPath("/event/event1");
  75. System.out.println("4");
  76.  
  77. System.in.read();
  78. }
  79. }

zookeeper客户端使用第三方(Curator)封装的Api操作节点的更多相关文章

  1. zookeeper客户端使用第三方(zkclient)封装的Api操作节点

    1.引入依赖 <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</a ...

  2. Java 封装 HDFS API 操作

    代码下载地址:点击下载 一:环境介绍 hadoop:2.6 Ubuntu:15.10 eclipse:3.8.1 二:操作包含 推断某个目录是否存在              isExist(fold ...

  3. Zookeeper客户端使用(使用Curator)

    Zookeeper客户端(使用Curator) 三.使用curator客户端 在pom.xml中加入依赖 <dependency> <groupId>org.apache.cu ...

  4. Zookeeper客户端Curator基本API

    在使用zookeper的时候一般不使用原生的API,Curator,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsExceptio ...

  5. zookeeper(六):Zookeeper客户端Curator的API使用详解

    简介 Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsEx ...

  6. ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用

    这两部分内容的介绍主要讲的是节点及节点内容和子节点的操作,并且讲解的节点的事件监听以及ACL授权 ZooKeeper客户端原生API的使用 百度网盘地址: http://pan.baidu.com/s ...

  7. Zookeeper系列三:Zookeeper客户端的使用(Zookeeper原生API如何进行调用、ZKClient、Curator)和Zookeeper会话

    一.Zookeeper原生API如何进行调用 准备工作: 首先在新建一个maven项目ZK-Demo,然后在pom.xml里面引入zk的依赖 <dependency> <groupI ...

  8. Zookeeper客户端Curator使用详解

    Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBoot.Curator.Bootstrap写了一个可视化的Web应用: zookeep ...

  9. 转:Zookeeper客户端Curator使用详解

    原文:https://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBo ...

随机推荐

  1. BA 新web化 问题汇总

    1. 3D堆栈图在winform端无法显示,但在web端可以正常显示,说明与浏览器版本有关,在 IE 中设置文档模式为 IE8 即报错,IE9 却正常显示,可在 <head>节点下添加如下 ...

  2. App启动原理和启动过程

        一.程序启动原理 1.1.main函数中执行了一个UIApplicationMain这个函数UIApplicationMain(int argc, char *argv[], NSString ...

  3. oracle中函数和存储过程的区别和联系

    oracle中函数和存储过程的区别和联系 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和 ...

  4. oracle -sqlplus 调用存储过程

    sp.batsqlplus user/passwd/sid  @.\sp.sql >sp.sqlexit; sp.sqlexex xxxx()quit;

  5. Ros学习topic——小海龟

    ROS Topics 1.rqt_graph:创建一个显示当前系统运行情况的动态图形 安装 $ sudo apt-get install ros-<distro>-rqt $ sudo a ...

  6. URL操作

    ThinkPHP 的 URL 操作.主要涉及到 URL 路径大小写.伪静态.生成以及模版中的 U()方法. 一.URL大小写 系统默认的规范是根据 URL 里面的模块名.控制器名来定位到具体的控制器类 ...

  7. opencv3更换图片背景

    #include <opencv2/opencv.hpp>#include <iostream> using namespace std;using namespace cv; ...

  8. opencv3.2 编译安装说明

    Create a temporary directory, which we denote as <cmake_binary_dir>, where you want to put the ...

  9. Linux 大页面使用与实现简介(转)

    引言 随着计算需求规模的不断增大,应用程序对内存的需求也越来越大.为了实现虚拟内存管理机制,操作系统对内存实行分页管理.自内存“分页机制”提出之始,内存页面的默认大小便被设置为 4096 字节(4KB ...

  10. Entity Relationships

    Entity Relationships: Here, you will learn how entity framework manages the relationships between en ...