JAVA:使用 Curator 进行 ZooKeeper 操作的技术指南

1、简述

Apache Curator 是一个基于 ZooKeeper 的 Java 客户端库,它极大地简化了使用 ZooKeeper 的开发工作。Curator 提供了高层次的 API,封装了很多复杂的 ZooKeeper 操作,例如连接管理、分布式锁、Leader 选举等。

在分布式系统中,ZooKeeper 通常被用来作为协调服务,而 Curator 则为我们提供了更简洁易用的接口,减少了开发的复杂性。本文将介绍 Curator 的核心功能及实践样例。

在这里插入图片描述


2、核心功能

Apache Curator是一个比较完善的ZooKeeper客户端框架,通过封装的一套高级API 简化了ZooKeeper的操作。Curator主要解决了三类问题:

  • 封装ZooKeeper client与ZooKeeper server之间的连接处理
  • 提供了一套Fluent风格的操作API
  • 提供ZooKeeper各种应用场景(recipe, 比如:分布式锁服务、集群领导选举、共享计数器、缓存机制、分布式队列等)的抽象封装

Curator 提供了以下核心组件:

2.1 CuratorFramework

CuratorFramework 是 Curator 的核心类,用于与 ZooKeeper 服务交互。

2.2 Recipes

Curator 提供了多种常见分布式模式的实现,包括:

  • 分布式锁 (InterProcessMutex)
  • 分布式队列 (DistributedQueue)
  • Leader 选举 (LeaderSelector)
  • 节点缓存 (NodeCache)
  • 路径缓存 (PathChildrenCache)
  • 树缓存 (TreeCache)

3、示例实践

Curator中提供了Zookeeper各种应用场景(Recipe,如共享锁服务、Master选举机制和分布式计算器等)的抽象封装。

3.1 依赖引入

在使用 Curator 前,需要在项目中引入相关的依赖:

<!-- zookeeper支持 -->
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.6.4</version>
</dependency>
<!-- curator-recipes -->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.5.0</version>
</dependency>
<!-- curator-framework -->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.5.0</version>
</dependency>

3.2 初始化 CuratorFramework

以下代码展示了如何初始化 CuratorFramework:

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;public class CuratorExample {public static void main(String[] args) {// 创建 CuratorFramework 实例CuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") // ZooKeeper 地址.sessionTimeoutMs(5000).connectionTimeoutMs(3000).retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();// 启动客户端client.start();System.out.println("CuratorFramework 已启动");// 关闭客户端client.close();}
}

3.3 分布式锁

分布式锁是分布式系统中的一个重要功能,用于协调多进程/线程间的访问。

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;import java.util.concurrent.TimeUnit;public class DistributedLockExample {public static void main(String[] args) throws Exception {// 初始化 CuratorFrameworkCuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();client.start();// 创建分布式锁InterProcessMutex lock = new InterProcessMutex(client, "/distributed-lock");// 尝试获取锁if (lock.acquire(10, TimeUnit.SECONDS)) {try {System.out.println("成功获取锁,执行任务...");Thread.sleep(5000); // 模拟任务} finally {lock.release();System.out.println("锁已释放");}} else {System.out.println("未能获取锁");}client.close();}
}

3.4 Leader 选举

Curator 的 LeaderSelector 提供了简单易用的 Leader 选举功能。

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.framework.recipes.leader.LeaderSelector;
import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter;public class LeaderElectionExample {public static void main(String[] args) throws InterruptedException {CuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();client.start();// 创建 LeaderSelectorLeaderSelector leaderSelector = new LeaderSelector(client, "/leader-election", new LeaderSelectorListenerAdapter() {@Overridepublic void takeLeadership(CuratorFramework client) throws Exception {System.out.println("成为 Leader,执行任务...");Thread.sleep(3000); // 模拟任务System.out.println("任务完成,释放 Leader 权限");}});leaderSelector.autoRequeue(); // 自动重新排队参与选举leaderSelector.start();Thread.sleep(Integer.MAX_VALUE); // 保持主线程运行client.close();}
}

3.5 节点缓存

NodeCache 用于监听特定节点的数据变更。

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.retry.ExponentialBackoffRetry;public class NodeCacheExample {public static void main(String[] args) throws Exception {CuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();client.start();// 创建 NodeCacheNodeCache nodeCache = new NodeCache(client, "/test-node");nodeCache.getListenable().addListener(() -> {System.out.println("节点数据变更,新的数据为:" + new String(nodeCache.getCurrentData().getData()));});nodeCache.start();// 创建节点并修改数据client.create().orSetData().forPath("/test-node", "initial-data".getBytes());Thread.sleep(1000);client.setData().forPath("/test-node", "updated-data".getBytes());Thread.sleep(5000); // 保持运行观察结果client.close();}
}

4、总结

Curator 提供了强大的 ZooKeeper 封装功能,极大地简化了开发流程。在分布式系统中,通过 Curator 可以实现诸如分布式锁、Leader 选举和节点监听等功能,帮助开发者快速构建稳定的分布式服务。

本文通过示例展示了常见的使用场景,希望能够帮助您更好地理解和使用 Curator。如果有任何问题或建议,欢迎留言讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/76738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Julia语言的测试覆盖率

Julia语言的测试覆盖率探讨 引言 在现代软件开发中&#xff0c;测试是确保软件质量的重要环节。随着软件的复杂度不断增加&#xff0c;测试覆盖率作为衡量测试质量的一个重要指标&#xff0c;受到了越来越多开发者的关注。Julia语言作为一种高性能的动态编程语言&#xff0c;…

【万字总结】前端全方位性能优化指南(八)——Webpack 6调优、模块联邦升级、Tree Shaking突破

构建工具深度优化——从机械配置到智能工程革命 当Webpack配置项突破2000行、Node进程内存耗尽告警时,传统构建优化已触及工具链的物理极限:Babel转译耗时占比超60%、跨项目模块复用催生冗余构建、Tree Shaking误删关键代码引发线上事故……构建流程正从「工程问题」演变为「…

使用MCP服务器实现AI任务完成通知:让Cursor更智能

0. 简介 在使用AI工具进行长时间任务时&#xff0c;常常需要等待结果。MCP&#xff08;Model Context Protocol&#xff09;服务器"mcp_server_notify"提供了一个优雅的解决方案&#xff0c;让AI在完成任务后通过系统通知提醒你。本文将介绍如何在Cursor中配置和使用…

Java面试黄金宝典33

1. 什么是存取控制、 触发器、 存储过程 、 游标 存取控制 定义&#xff1a;存取控制是数据库管理系统&#xff08;DBMS&#xff09;为保障数据安全性与完整性&#xff0c;对不同用户访问数据库对象&#xff08;如表、视图等&#xff09;的权限加以管理的机制。它借助定义用户…

DataX实战教程

需求&#xff1a; 用datax同步mysql&#xff1a; 192.168.236.134中test1库的user表到192.168.236.136中test1库的user表 步骤&#xff1a; 下载安装包 https://github.com/alibaba/DataX/blob/master/userGuid.md 进入引导页 https://github.com/alibaba/DataX/blob/ma…

C#/.NET/.NET Core技术前沿周刊 | 第 32 期(2025年3.24-3.31)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

c++基础-----c++ 成员变量初始化顺序

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 在C中&#xff0c;类的成员变量初始化的顺序是由它们在类中声明的顺序决定的&#xff0c;而不是由它们在构造函数初始化列表中的顺序决定的。这意味着无论你在构造函数初始化列表中如何…

Pascal语言的贪心算法

贪心算法与Pascal语言 引言 在算法设计与分析中&#xff0c;贪心算法是一类重要的算法策略。它以一种直接而高效的方式解决问题&#xff0c;尤其适合那些可以通过局部最优解推导出全局最优解的问题。在本文中&#xff0c;我们将探讨贪心算法的基本概念、工作原理及其在Pascal…

Sensodrive力控关节模组SensoJoint:TÜV安全认证助力机器人开发

在机器人技术领域&#xff0c;安全性和开发效率是行业关注的重点。SensoDrive的SensoJoint 机器人力控关节模组&#xff0c;凭借其可靠的安全性能和高效的开发优势&#xff0c;正在为机器人开发提供有力支持。 2025年3月31日&#xff0c;SensoDrive的 SensoJoint 力控关节模组获…

自动驾驶04:点云预处理03

点云组帧 感知算法人员在完成点云的运动畸变补偿后&#xff0c;会发现一个问题&#xff1a;激光雷达发送的点云数据包中的点云数量其实非常少&#xff0c;完全无法用来进行后续感知和定位层面的处理工作。 此时&#xff0c;感知算法人员就需要对这些数据包进行点云组帧的处理…

栈回溯和离线断点

栈回溯和离线断点 栈回溯&#xff08;Stack Backtrace&#xff09; 栈回溯是一种重建函数调用链的技术&#xff0c;对于分析栈溢出的根本原因非常有价值。 实现方式 // 简单的栈回溯实现示例&#xff08;ARM Cortex-M架构&#xff09; void stack_backtrace(void) {uint32_…

Vue3学习二

认识组件的嵌套 还可以将Main中内容再划分 scoped防止组件与组件之间的样式相互污染 组件的通信 父子组件之间通信的方式 父组件传递给子组件 给传过来的内容做限制 type为传的内容的属性类型&#xff0c;required为true表示该内容是必须传的&#xff0c;default为&#xff0c…

配置文件 yaml

文章目录 一、yaml简介二、YAML 文件基本语法1.缩进2.键值对3.注释4.支持多种数据类型5.示例 YML 文件 三、YAML 文件的基本元素&#xff1a;纯量、对象、数组1.纯量(scalars)(1)布尔值(Booleans)(2)Null 值 2.对象(Object) / 映射(Mapping) / 字典(Dictionaries) / 键值对(Key…

antvX6自定义 HTML 节点创建与更新教程

自定义 HTML 节点创建与更新教程 本文详细介绍如何利用 HTML、CSS 和 JavaScript 创建自定义节点&#xff0c;并通过动态更新节点数据来改变节点显示效果。无论你是否有前端基础&#xff0c;都能轻松跟着本教程一步步实现。 1. 基础样式设置 首先&#xff0c;使用 CSS 定义基…

前端开发工厂模式的优缺点是什么?

一、什么是工厂模式&#xff1f; 工厂模式属于创建型设计模式&#xff0c;核心思想是将对象的实例化过程封装到特定方法或类中&#xff0c;让客户端不需要直接通过new关键字创建对象。 举个例子&#xff1a;就像奶茶店不需要顾客自己调配饮品&#xff0c;而是通过"点单-…

Element-plus弹出框popover,使用自定义的图标选择组件

自定义的图标选择组件是若依的项目的 1. 若依的图标选择组件 js文件&#xff0c;引入所有的svg图片 let icons [] // 注意这里的路径&#xff0c;一定要是自己svg图片的路径 const modules import.meta.glob(./../../assets/icons/svg/*.svg); for (const path in modules)…

openmv用了4个了,烧了2个,质量堪忧啊

都是原装货&#xff0c;主板出现过存储不完全、图像存不上、主板代码保存乱码、意外出现乱码的现象。 希望要用的童鞋谨慎使用。

基于DrissionPage的Taptap热门游戏数据爬虫实战:从Requests到现代爬虫框架的迁移指南(含完整代码复制)

目录 ​编辑 一、项目重构背景与技术选型 1.1 原代码问题分析 1.2 DrissionPage框架优势 二、环境配置与基础改造 2.1 依赖库安装 2.2 基础类改造 三、核心功能模块重构 3.1 请求参数自动化生成 3.2 智能页面渲染 3.3 数据解析优化 四、数据库操作增强 4.1 批量插入…

解析K8S四层网络设计

模仿七层网络模型&#xff0c;抽象出四层模型 POD网络 同一节点上的pod网络 依赖于虚拟网桥/网卡&#xff08;linux虚拟设备&#xff09;pod内容器共享网络栈&#xff08;pause容器创建&#xff09; 不同节点上的pod网络 路由方案&#xff1a;依赖于底层网络设备&#x…

FPGA实现数码管显示分秒时间

目录 一. verilog实现 二. 烧录验证 三. 结果验证 使用开发板&#xff1a;DE2-115开发板 一. verilog实现 要实现分和秒&#xff0c;需要知道定时器的频率&#xff0c;通过查手册可知&#xff0c;我使用的开发板时钟为50hz&#xff0c;也就是时钟一个周期是2微秒。 5000000…