Zookeeper - 基于 Java API 的客户端连接实操开发
大家好欢迎来到我的技术博客 在这里我会分享学习笔记、实战经验与技术思考力求用简单的方式讲清楚复杂的问题。 本文将围绕Zookeeper这个话题展开希望能为你带来一些启发或实用的参考。 无论你是刚入门的新手还是正在进阶的开发者希望你都能有所收获文章目录Zookeeper - 基于 Java API 的客户端连接实操开发 引言环境准备 创建 Maven 项目可选建立 Zookeeper 客户端连接 示例代码代码说明创建节点 示例代码代码说明获取节点数据 示例代码代码说明更新节点数据 示例代码代码说明删除节点 ️示例代码代码说明节点监听机制 示例代码代码说明Zookeeper 客户端连接状态管理 示例代码代码说明使用 Curator 框架简化开发 示例代码使用 Curator代码说明总结 Zookeeper - 基于 Java API 的客户端连接实操开发 引言Apache Zookeeper 是一个分布式协调服务广泛用于分布式系统的协调与管理。它提供了诸如命名服务、分布式同步、集群管理等功能是构建高可用、可扩展的分布式系统的重要工具之一。在实际开发中Zookeeper 的 Java API 是开发者最常用的接口之一。本文将详细介绍如何使用 Java API 实现 Zookeeper 客户端的连接、节点操作、监听机制等核心功能并通过代码示例帮助读者更好地理解和实践。环境准备 在开始之前我们需要准备好以下环境Java 8 或更高版本Zookeeper 3.5 或更高版本IDE如 IntelliJ IDEA 或 EclipseMaven 项目可选你可以从 Zookeeper 官方网站 下载并安装 Zookeeper。安装完成后确保 Zookeeper 服务已经启动。创建 Maven 项目可选如果你使用 Maven 来管理项目依赖可以在pom.xml文件中添加以下依赖项dependenciesdependencygroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactIdversion3.7.1/version/dependency/dependencies⚠️ 注意请根据你使用的 Zookeeper 版本选择合适的依赖版本。建立 Zookeeper 客户端连接 Zookeeper 客户端的连接是通过ZooKeeper类来实现的。我们可以通过构造函数创建一个客户端实例并连接到 Zookeeper 服务器。示例代码importorg.apache.zookeeper.WatchedEvent;importorg.apache.zookeeper.Watcher;importorg.apache.zookeeper.ZooKeeper;importjava.io.IOException;publicclassZookeeperClientExample{publicstaticvoidmain(String[]args){StringhostPortlocalhost:2181;// Zookeeper 服务器地址intsessionTimeout3000;// 会话超时时间try{ZooKeeperzooKeepernewZooKeeper(hostPort,sessionTimeout,newWatcher(){Overridepublicvoidprocess(WatchedEventevent){// 监听事件回调System.out.println(Received event: event.getType());}});System.out.println(Connected to Zookeeper server);// 阻止主线程退出保持连接Thread.sleep(Long.MAX_VALUE);zooKeeper.close();}catch(IOException|InterruptedExceptione){e.printStackTrace();}}}代码说明ZooKeeper构造函数的参数说明hostPortZookeeper 服务器地址格式为host:port。sessionTimeout会话超时时间单位为毫秒。watcher监听器用于监听 Zookeeper 事件。process方法是Watcher接口的实现用于处理 Zookeeper 事件。Thread.sleep(Long.MAX_VALUE)用于保持主线程不退出从而保持与 Zookeeper 的连接。创建节点 在 Zookeeper 中节点ZNode是数据存储的基本单位。我们可以通过create方法创建节点。示例代码importorg.apache.zookeeper.CreateMode;importorg.apache.zookeeper.ZooDefs;importorg.apache.zookeeper.ZooKeeper;importorg.apache.zookeeper.data.Stat;importjava.io.IOException;importjava.util.concurrent.CountDownLatch;publicclassCreateZNodeExample{publicstaticvoidmain(String[]args)throwsIOException,InterruptedException{StringhostPortlocalhost:2181;intsessionTimeout3000;CountDownLatchconnectedSignalnewCountDownLatch(1);ZooKeeperzooKeepernewZooKeeper(hostPort,sessionTimeout,event-{if(event.getState()Event.KeeperState.SyncConnected){connectedSignal.countDown();}});connectedSignal.await();Stringpath/exampleNode;byte[]dataHello Zookeeper.getBytes();// 创建持久节点StringcreatedPathzooKeeper.create(path,data,ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);System.out.println(Created node at path: createdPath);zooKeeper.close();}}代码说明CreateMode.PERSISTENT创建一个持久节点。ZooDefs.Ids.OPEN_ACL_UNSAFE设置节点的 ACL访问控制列表这里使用的是开放权限。create方法返回新创建节点的路径。获取节点数据 我们可以使用getData方法获取节点的数据。示例代码importorg.apache.zookeeper.ZooKeeper;importorg.apache.zookeeper.data.Stat;importjava.io.IOException;importjava.util.concurrent.CountDownLatch;publicclassGetZNodeDataExample{publicstaticvoidmain(String[]args)throwsIOException,InterruptedException{StringhostPortlocalhost:2181;intsessionTimeout3000;CountDownLatchconnectedSignalnewCountDownLatch(1);ZooKeeperzooKeepernewZooKeeper(hostPort,sessionTimeout,event-{if(event.getState()Event.KeeperState.SyncConnected){connectedSignal.countDown();}});connectedSignal.await();Stringpath/exampleNode;StatstatnewStat();byte[]datazooKeeper.getData(path,false,stat);System.out.println(Node data: newString(data));zooKeeper.close();}}代码说明getData方法的参数说明path节点路径。watch是否设置监听器。stat用于存储节点的元数据。更新节点数据 我们可以使用setData方法更新节点的数据。示例代码importorg.apache.zookeeper.ZooKeeper;importorg.apache.zookeeper.data.Stat;importjava.io.IOException;importjava.util.concurrent.CountDownLatch;publicclassUpdateZNodeDataExample{publicstaticvoidmain(String[]args)throwsIOException,InterruptedException{StringhostPortlocalhost:2181;intsessionTimeout3000;CountDownLatchconnectedSignalnewCountDownLatch(1);ZooKeeperzooKeepernewZooKeeper(hostPort,sessionTimeout,event-{if(event.getState()Event.KeeperState.SyncConnected){connectedSignal.countDown();}});connectedSignal.await();Stringpath/exampleNode;byte[]newDataUpdated Data.getBytes();// 更新节点数据StatstatzooKeeper.setData(path,newData,-1);// -1 表示忽略版本号System.out.println(Node updated with version: stat.getVersion());zooKeeper.close();}}代码说明setData方法的参数说明path节点路径。data新的数据。version节点的版本号-1 表示忽略版本号。删除节点 ️我们可以使用delete方法删除节点。示例代码importorg.apache.zookeeper.ZooKeeper;importorg.apache.zookeeper.KeeperException;importjava.io.IOException;importjava.util.concurrent.CountDownLatch;publicclassDeleteZNodeExample{publicstaticvoidmain(String[]args)throwsIOException,InterruptedException,KeeperException{StringhostPortlocalhost:2181;intsessionTimeout3000;CountDownLatchconnectedSignalnewCountDownLatch(1);ZooKeeperzooKeepernewZooKeeper(hostPort,sessionTimeout,event-{if(event.getState()Event.KeeperState.SyncConnected){connectedSignal.countDown();}});connectedSignal.await();Stringpath/exampleNode;// 删除节点zooKeeper.delete(path,-1);// -1 表示忽略版本号System.out.println(Node deleted);zooKeeper.close();}}代码说明delete方法的参数说明path节点路径。version节点的版本号-1 表示忽略版本号。节点监听机制 Zookeeper 提供了强大的监听机制允许客户端监听节点的变化。我们可以通过exists、getData、getChildren等方法设置监听器。示例代码importorg.apache.zookeeper.WatchedEvent;importorg.apache.zookeeper.Watcher;importorg.apache.zookeeper.ZooKeeper;importorg.apache.zookeeper.data.Stat;importjava.io.IOException;importjava.util.concurrent.CountDownLatch;publicclassWatcherExample{publicstaticvoidmain(String[]args)throwsIOException,InterruptedException{StringhostPortlocalhost:2181;intsessionTimeout3000;CountDownLatchconnectedSignalnewCountDownLatch(1);ZooKeeperzooKeepernewZooKeeper(hostPort,sessionTimeout,newWatcher(){Overridepublicvoidprocess(WatchedEventevent){System.out.println(Received event: event.getType());if(event.getType()Event.EventType.Noneevent.getState()Event.KeeperState.SyncConnected){connectedSignal.countDown();}elseif(event.getType()Event.EventType.NodeDataChanged){System.out.println(Node data changed);}}});connectedSignal.await();Stringpath/exampleNode;// 设置监听器StatstatzooKeeper.exists(path,true);if(stat!null){System.out.println(Node exists);}else{System.out.println(Node does not exist);}// 阻止主线程退出保持连接Thread.sleep(Long.MAX_VALUE);zooKeeper.close();}}代码说明exists方法的参数说明path节点路径。watch是否设置监听器。当节点数据发生变化时监听器会收到NodeDataChanged事件。Zookeeper 客户端连接状态管理 在实际应用中Zookeeper 客户端可能会因为网络问题或服务器故障而断开连接。我们需要处理这些情况并实现自动重连机制。示例代码importorg.apache.zookeeper.WatchedEvent;importorg.apache.zookeeper.Watcher;importorg.apache.zookeeper.ZooKeeper;importorg.apache.zookeeper.KeeperException;importjava.io.IOException;importjava.util.concurrent.CountDownLatch;publicclassReconnectExample{privatestaticZooKeeperzooKeeper;publicstaticvoidmain(String[]args){StringhostPortlocalhost:2181;intsessionTimeout3000;connectToZookeeper(hostPort,sessionTimeout);// 模拟断开连接try{Thread.sleep(5000);System.out.println(Simulating connection loss...);zooKeeper.close();Thread.sleep(5000);connectToZookeeper(hostPort,sessionTimeout);}catch(InterruptedException|IOExceptione){e.printStackTrace();}}privatestaticvoidconnectToZookeeper(StringhostPort,intsessionTimeout){CountDownLatchconnectedSignalnewCountDownLatch(1);try{zooKeepernewZooKeeper(hostPort,sessionTimeout,event-{if(event.getState()Watcher.Event.KeeperState.SyncConnected){connectedSignal.countDown();}elseif(event.getState()Watcher.Event.KeeperState.Disconnected){System.out.println(Disconnected from Zookeeper);}elseif(event.getState()Watcher.Event.KeeperState.Expired){System.out.println(Session expired);try{connectToZookeeper(hostPort,sessionTimeout);}catch(IOException|InterruptedExceptione){e.printStackTrace();}}});connectedSignal.await();System.out.println(Connected to Zookeeper);}catch(IOException|InterruptedExceptione){e.printStackTrace();}}}代码说明当客户端断开连接或会话过期时监听器会收到相应的事件。在会话过期的情况下我们尝试重新连接到 Zookeeper 服务器。使用 Curator 框架简化开发 虽然 Zookeeper 提供了原生的 Java API但在实际开发中我们通常会使用 Curator 框架来简化开发。Curator 是 Apache 提供的一个 Zookeeper 客户端框架它封装了原生 API并提供了更高级的功能。示例代码使用 Curatorimportorg.apache.curator.framework.CuratorFramework;importorg.apache.curator.framework.CuratorFrameworkFactory;importorg.apache.curator.retry.ExponentialBackoffRetry;publicclassCuratorExample{publicstaticvoidmain(String[]args)throwsException{StringhostPortlocalhost:2181;// 创建 Curator 客户端CuratorFrameworkclientCuratorFrameworkFactory.newClient(hostPort,newExponentialBackoffRetry(1000,3));client.start();Stringpath/curatorNode;byte[]dataHello Curator.getBytes();// 创建节点client.create().forPath(path,data);System.out.println(Node created);// 获取节点数据byte[]retrievedDataclient.getData().forPath(path);System.out.println(Node data: newString(retrievedData));// 更新节点数据byte[]newDataUpdated with Curator.getBytes();client.setData().forPath(path,newData);System.out.println(Node updated);// 删除节点client.delete().forPath(path);System.out.println(Node deleted);client.close();}}代码说明CuratorFrameworkFactory.newClient创建 Curator 客户端。ExponentialBackoffRetry设置重试策略。create()、getData()、setData()、delete()Curator 提供的简化 API。总结 通过本文的学习我们了解了如何使用 Zookeeper 的 Java API 实现客户端连接、节点操作、监听机制等功能。我们还介绍了如何使用 Curator 框架简化开发并提供了相应的代码示例。希望本文能帮助读者更好地理解和实践 Zookeeper 的 Java 客户端开发。如果你对 Zookeeper 感兴趣可以进一步阅读 Zookeeper 官方文档了解更多高级功能和最佳实践。同时Curator 官方文档 也是学习 Curator 框架的好资源。Happy coding! 感谢你读到这里 技术之路没有捷径但每一次阅读、思考和实践都在悄悄拉近你与目标的距离。 如果本文对你有帮助不妨 点赞、收藏、分享给更多需要的朋友 欢迎在评论区留下你的想法、疑问或建议我会一一回复我们一起交流、共同成长 关注我不错过下一篇干货我们下期再见✨

相关新闻

C++ vector O(1)删除技巧:交换-弹出法原理与实战

C++ vector O(1)删除技巧:交换-弹出法原理与实战

1. 项目概述:为什么我们需要O(1)的vector删除? 在C的日常开发里, std::vector 绝对是出场率最高的容器,没有之一。它简单、高效,提供了连续的存储空间,随机访问速度快如闪电。但凡是用过 vector 的开发…

2026/8/13 14:16:48 阅读更多 →
Zookeeper - 事务 ID 的生成规则与集群一致性关联

Zookeeper - 事务 ID 的生成规则与集群一致性关联

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕Zookeeper这个话题展开,希望能为你带来一些启…

2026/8/13 14:16:47 阅读更多 →
Tomcat安全加固与运维管理实战指南

Tomcat安全加固与运维管理实战指南

1. Tomcat安全加固与运维管理概述作为Java生态中最广泛使用的Web容器之一,Tomcat在各类企业应用中承担着关键角色。我在金融行业的生产环境运维中,曾处理过因配置不当导致的安全事件,深刻体会到"安全不是功能,而是底线"…

2026/8/13 14:16:47 阅读更多 →

最新新闻

华为荣耀手机解锁全解析:从锁屏密码到账号激活锁的应对策略

华为荣耀手机解锁全解析:从锁屏密码到账号激活锁的应对策略

1. 从“锁”到“机”:理解手机锁定的本质与解锁的边界 手机被锁,大概是每个数码爱好者或普通用户都可能遇到的糟心事。尤其是当你面对一台华为或荣耀手机,屏幕上赫然显示着“请输入密码”、“账号已锁定”或“设备已关联华为账号”时&#xf…

2026/8/13 16:22:46 阅读更多 →
3个关键步骤,让你从零开始掌握OBS Studio专业直播录制

3个关键步骤,让你从零开始掌握OBS Studio专业直播录制

3个关键步骤,让你从零开始掌握OBS Studio专业直播录制 【免费下载链接】obs-studio OBS Studio - Free and open source software for live streaming and screen recording 项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio 想象一下&#xff…

2026/8/13 16:21:46 阅读更多 →
3分钟快速掌握:I.Ming传承字形字体完整使用指南

3分钟快速掌握:I.Ming传承字形字体完整使用指南

3分钟快速掌握:I.Ming传承字形字体完整使用指南 【免费下载链接】I.Ming I.Ming ( I.明體 / 一点明朝体 / 一點明體 ) 项目地址: https://gitcode.com/gh_mirrors/im/I.Ming I.Ming(一点明体)是一款基于《传承字形部件检校表》推荐字形…

2026/8/13 16:21:46 阅读更多 →
C语言转义字符详解:从原理到实战避坑指南

C语言转义字符详解:从原理到实战避坑指南

1. 转义字符:C语言中那些“看不见”的字符 写C语言代码,我们每天都在和字符打交道。 printf("Hello, World!"); ,屏幕上就出现了我们熟悉的问候。但有些字符,你想直接写在双引号里,编译器却不认识&#xf…

2026/8/13 16:21:46 阅读更多 →
泛程序批量绑定泛域名实操:一键配置多域名解析流程

泛程序批量绑定泛域名实操:一键配置多域名解析流程

在互联网的世界里,jtaseo泛程序批量绑定泛域名以及一键配置多域名解析流程是很多站长和技术人员关心的重点。今天就来详细介绍下这些核心操作。 首先,什么是泛程序批量绑定泛域名呢?简单来说,就是可以让一个程序同时适配多个域名&…

2026/8/13 16:21:46 阅读更多 →
泛程序站点风控预警设置,提前规避百度平台处罚风险

泛程序站点风控预警设置,提前规避百度平台处罚风险

在互联网的广阔天地中,泛程序站点犹如繁星点点。jtaseo然而,要想在百度平台这片“天空”中长久闪耀,泛程序站点的风控预警设置就显得尤为重要。合理的风控预警设置,能够帮助我们提前规避百度平台的处罚风险,让站点运营…

2026/8/13 16:21:46 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →