【ZooKeeper Notes 3】ZooKeeper Java API 使用样例

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务框架,包含一组简单的原语集合。通过这些原语言的组合使用,能够帮助我们解决更高层次的分布式问题,关于ZooKeeper的典型使用场景,请查看这个文章《ZooKeeper典型使用场景一览

本文主要针对ZooKeeper提供的Java API,通过实际代码讲述如何使用API。

 
  1. package com.taobao.taokeeper.research.sample; 
  2.  
  3. import java.io.IOException; 
  4. import java.util.concurrent.CountDownLatch; 
  5.  
  6. import org.apache.zookeeper.CreateMode; 
  7. import org.apache.zookeeper.KeeperException; 
  8. import org.apache.zookeeper.WatchedEvent; 
  9. import org.apache.zookeeper.Watcher; 
  10. import org.apache.zookeeper.Watcher.Event.KeeperState; 
  11. import org.apache.zookeeper.ZooDefs.Ids; 
  12. import org.apache.zookeeper.ZooKeeper; 
  13.  
  14. import common.toolkit.java.util.ObjectUtil; 
  15.  
  16. /** 
  17.  * ZooKeeper Java Api 使用样例<br> 
  18.  * ZK Api Version: 3.4.3 
  19.  *  
  20.  * @author nileader/nileader@gmail.com 
  21.  */ 
  22. public class JavaApiSample implements Watcher { 
  23.  
  24.     private static final int SESSION_TIMEOUT = 10000
  25.     private static final String CONNECTION_STRING = "test.zookeeper.connection_string:2181"
  26.     private static final String ZK_PATH = "/nileader"
  27.     private ZooKeeper zk = null
  28.      
  29.     private CountDownLatch connectedSemaphore = new CountDownLatch( 1 ); 
  30.  
  31.     /** 
  32.      * 创建ZK连接 
  33.      * @param connectString  ZK服务器地址列表 
  34.      * @param sessionTimeout   Session超时时间 
  35.      */ 
  36.     public void createConnection( String connectString, int sessionTimeout ) { 
  37.         this.releaseConnection(); 
  38.         try { 
  39.             zk = new ZooKeeper( connectString, sessionTimeout, this ); 
  40.             connectedSemaphore.await(); 
  41.         } catch ( InterruptedException e ) { 
  42.             System.out.println( "连接创建失败,发生 InterruptedException" ); 
  43.             e.printStackTrace(); 
  44.         } catch ( IOException e ) { 
  45.             System.out.println( "连接创建失败,发生 IOException" ); 
  46.             e.printStackTrace(); 
  47.         } 
  48.     } 
  49.  
  50.     /** 
  51.      * 关闭ZK连接 
  52.      */ 
  53.     public void releaseConnection() { 
  54.         if ( !ObjectUtil.isBlank( this.zk ) ) { 
  55.             try { 
  56.                 this.zk.close(); 
  57.             } catch ( InterruptedException e ) { 
  58.                 // ignore 
  59.                 e.printStackTrace(); 
  60.             } 
  61.         } 
  62.     } 
  63.  
  64.     /** 
  65.      *  创建节点 
  66.      * @param path 节点path 
  67.      * @param data 初始数据内容 
  68.      * @return 
  69.      */ 
  70.     public boolean createPath( String path, String data ) { 
  71.         try { 
  72.             System.out.println( "节点创建成功, Path: " 
  73.                     + this.zk.create( path, // 
  74.                                               data.getBytes(), // 
  75.                                               Ids.OPEN_ACL_UNSAFE, // 
  76.                                               CreateMode.EPHEMERAL ) 
  77.                     + ", content: " + data ); 
  78.         } catch ( KeeperException e ) { 
  79.             System.out.println( "节点创建失败,发生KeeperException" ); 
  80.             e.printStackTrace(); 
  81.         } catch ( InterruptedException e ) { 
  82.             System.out.println( "节点创建失败,发生 InterruptedException" ); 
  83.             e.printStackTrace(); 
  84.         } 
  85.         return true
  86.     } 
  87.  
  88.     /** 
  89.      * 读取指定节点数据内容 
  90.      * @param path 节点path 
  91.      * @return 
  92.      */ 
  93.     public String readData( String path ) { 
  94.         try { 
  95.             System.out.println( "获取数据成功,path:" + path ); 
  96.             return new String( this.zk.getData( path, falsenull ) ); 
  97.         } catch ( KeeperException e ) { 
  98.             System.out.println( "读取数据失败,发生KeeperException,path: " + path  ); 
  99.             e.printStackTrace(); 
  100.             return ""
  101.         } catch ( InterruptedException e ) { 
  102.             System.out.println( "读取数据失败,发生 InterruptedException,path: " + path  ); 
  103.             e.printStackTrace(); 
  104.             return ""
  105.         } 
  106.     } 
  107.  
  108.     /** 
  109.      * 更新指定节点数据内容 
  110.      * @param path 节点path 
  111.      * @param data  数据内容 
  112.      * @return 
  113.      */ 
  114.     public boolean writeData( String path, String data ) { 
  115.         try { 
  116.             System.out.println( "更新数据成功,path:" + path + ", stat: " + 
  117.                                                         this.zk.setData( path, data.getBytes(), -1 ) ); 
  118.         } catch ( KeeperException e ) { 
  119.             System.out.println( "更新数据失败,发生KeeperException,path: " + path  ); 
  120.             e.printStackTrace(); 
  121.         } catch ( InterruptedException e ) { 
  122.             System.out.println( "更新数据失败,发生 InterruptedException,path: " + path  ); 
  123.             e.printStackTrace(); 
  124.         } 
  125.         return false
  126.     } 
  127.  
  128.     /** 
  129.      * 删除指定节点 
  130.      * @param path 节点path 
  131.      */ 
  132.     public void deleteNode( String path ) { 
  133.         try { 
  134.             this.zk.delete( path, -1 ); 
  135.             System.out.println( "删除节点成功,path:" + path ); 
  136.         } catch ( KeeperException e ) { 
  137.             System.out.println( "删除节点失败,发生KeeperException,path: " + path  ); 
  138.             e.printStackTrace(); 
  139.         } catch ( InterruptedException e ) { 
  140.             System.out.println( "删除节点失败,发生 InterruptedException,path: " + path  ); 
  141.             e.printStackTrace(); 
  142.         } 
  143.     } 
  144.  
  145.     public static void main( String[] args ) { 
  146.  
  147.         JavaApiSample sample = new JavaApiSample(); 
  148.         sample.createConnection( CONNECTION_STRING, SESSION_TIMEOUT ); 
  149.         if ( sample.createPath( ZK_PATH, "我是节点初始内容" ) ) { 
  150.             System.out.println(); 
  151.             System.out.println( "数据内容: " + sample.readData( ZK_PATH ) + "\n" ); 
  152.             sample.writeData( ZK_PATH, "更新后的数据" ); 
  153.             System.out.println( "数据内容: " + sample.readData( ZK_PATH ) + "\n" ); 
  154.             sample.deleteNode( ZK_PATH ); 
  155.         } 
  156.  
  157.         sample.releaseConnection(); 
  158.     } 
  159.  
  160.     /** 
  161.      * 收到来自Server的Watcher通知后的处理。 
  162.      */ 
  163.     @Override 
  164.     public void process( WatchedEvent event ) { 
  165.         System.out.println( "收到事件通知:" + event.getState() +"\n"  ); 
  166.         if ( KeeperState.SyncConnected == event.getState() ) { 
  167.             connectedSemaphore.countDown(); 
  168.         } 
  169.  
  170.     } 
  171.  

输出结果:

 
  1. 收到事件通知:SyncConnected 
  2.  
  3. 节点创建成功, Path: /nileader, content: 我是节点初始内容 
  4.  
  5. 获取数据成功,path:/nileader 
  6. 数据内容: 我是节点初始内容 
  7.  
  8. 更新数据成功,path:/nileader, stat: 42950186407,42950186408,1350820182392,1350820182406,1,0,0,232029990722229433,18,0,42950186407 
  9.  
  10. 获取数据成功,path:/nileader 
  11. 数据内容: 更新后的数据 
  12.  
  13. 删除节点成功,path:/nileader 

 本文转自 nileader 51CTO博客,原文链接:http://blog.51cto.com/nileader/795265,如需转载请自行联系原作者

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
13天前
|
Java API Spring
打造未来电商新引擎:揭秘Java可扩展API设计,让支付与物流灵活如丝,引领电商时代潮流!
【8月更文挑战第30天】本文通过电商平台案例,探讨了如何设计可扩展的Java API。首先定义支付和物流服务的接口与抽象类,然后实现具体服务,接着引入工厂模式或依赖注入管理服务实例,最后通过配置实现灵活扩展。这种设计确保了应用架构的灵活性和长期稳定性。
33 3
|
14天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
44 0
|
6天前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
29 11
|
2天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 云原生 API 网关 2024 年 08 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
3天前
|
监控 Java 大数据
【Java内存管理新突破】JDK 22:细粒度内存管理API,精准控制每一块内存!
【9月更文挑战第9天】虽然目前JDK 22的确切内容尚未公布,但我们可以根据Java语言的发展趋势和社区的需求,预测细粒度内存管理API可能成为未来Java内存管理领域的新突破。这套API将为开发者提供前所未有的内存控制能力,助力Java应用在更多领域发挥更大作用。我们期待JDK 22的发布,期待Java语言在内存管理领域的持续创新和发展。
|
5天前
|
Java API 数据处理
【Java的SIMD革命】JDK 22向量API:释放硬件潜能,让Java应用性能飙升!
【9月更文挑战第7天】 JDK 22向量API的发布标志着Java编程语言在SIMD技术领域的重大突破。这一新特性不仅释放了现代硬件的潜能,更让Java应用性能实现了飙升。我们有理由相信,在未来的发展中,Java将继续引领编程语言的潮流,为开发者们带来更加高效、更加强大的编程体验。让我们共同期待Java在SIMD技术的推动下开启一个全新的性能提升时代!
|
6天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
4天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
13天前
|
Java API
Java 8新特性:Lambda表达式与Stream API的深度解析
【7月更文挑战第61天】本文将深入探讨Java 8中的两个重要特性:Lambda表达式和Stream API。我们将首先介绍Lambda表达式的基本概念和语法,然后详细解析Stream API的使用和优势。最后,我们将通过实例代码演示如何结合使用Lambda表达式和Stream API,以提高Java编程的效率和可读性。
|
11天前
|
Java 数据库连接 缓存
Hibernate性能调优:五大秘籍,让应用效能飙升,告别慢如蜗牛的加载,体验丝滑般流畅!
【8月更文挑战第31天】本文深入探讨了提升Hibernate应用性能的五大技巧,包括选择合适的缓存策略、优化查询语句、合理使用Eager与Lazy加载、批量操作与事务管理以及利用索引和数据库优化。通过正确配置多级缓存、分页查询、延迟加载、批量处理及合理创建索引,能够显著提高应用响应速度与吞吐量,改善用户体验。这些技巧需根据具体应用场景灵活调整,以实现最佳性能优化效果。
26 0