Curator分布式锁

Curator 是一个用于 Apache ZooKeeper 的客户端库,提供了更高级的抽象和工具,以简化 ZooKeeper 的使用。Curator 是由 Netflix 开发的,并已成为分布式应用程序中使用 ZooKeeper 的事实标准。它解决了原生 ZooKeeper API 使用复杂、易出错的问题,通过提供易于使用的高级 API 和实用工具,显著提高了开发效率和代码质量。

Curator的核心组件

  1. CuratorFramework

    • 这是 Curator 提供的主要接口,所有与 ZooKeeper 的交互都通过这个接口进行。它封装了 ZooKeeper 的底层 API,并提供了更高层次的操作,如创建、删除、更新和读取节点,处理连接状态变化等。
  2. Recipes

    • Curator 提供了一组实现常见分布式模式的库,称为“recipes”(配方),这些配方包括 Leader Election(领导选举)、Distributed Lock(分布式锁)、Barrier(屏障)等。这些配方封装了复杂的 ZooKeeper 操作,使得在分布式应用中实现这些模式变得更加简单和可靠。
  3. Framework Recipes

    • 这些是 Curator 提供的高级特性,包括缓存(Node Cache、Path Cache、Tree Cache)、事务(Transaction)、异步操作(Asynchronous Operations)等,进一步简化了分布式应用开发。

Curator的主要特性

  1. 连接管理

    • Curator 提供了更可靠的连接管理机制,包括自动重试、连接状态监听等,确保与 ZooKeeper 的连接保持稳定。
  2. 简化的 API

    • Curator 提供了一组易于使用的 API,简化了与 ZooKeeper 的交互,减少了编码量和错误率。
  3. 高级工具

    • Curator 提供了一些高级工具,如 PathChildrenCache、NodeCache、TreeCache,用于监听 ZooKeeper 中节点的数据变化和节点的增删改查操作。
  4. 事务支持

    • Curator 支持多操作事务,允许在一次调用中执行多个操作,这在需要原子性操作的场景中非常有用。
  5. 异步操作

    • Curator 支持异步操作,可以在不阻塞当前线程的情况下执行 ZooKeeper 操作,提高了应用的性能和响应速度。

示例代码

以下是一个使用 Curator 实现简单分布式锁的示例:

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;public class CuratorExample {public static void main(String[] args) {// 创建 CuratorFramework 实例CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181",new ExponentialBackoffRetry(1000, 3));client.start();// 创建分布式锁InterProcessMutex lock = new InterProcessMutex(client, "/my/lock/path");try {// 获取锁lock.acquire();System.out.println("Lock acquired!");// 执行需要同步的操作// ...} catch (Exception e) {e.printStackTrace();} finally {try {// 释放锁lock.release();System.out.println("Lock released!");} catch (Exception e) {e.printStackTrace();}}// 关闭客户端client.close();}
}

使用 Curator 的优势

  1. 减少开发复杂度

    • Curator 提供的高级 API 和工具,使得使用 ZooKeeper 变得更加简单和高效,减少了开发人员的工作量和出错概率。
  2. 提高代码的可靠性

    • Curator 的自动重试、连接管理等机制,增强了与 ZooKeeper 交互的稳定性和可靠性。
  3. 丰富的功能

    • Curator 提供了多种分布式模式的实现,满足了分布式系统开发中的各种需求,使得开发分布式应用更加方便和快捷。
  4. 社区支持

    • 作为一个广泛使用的开源项目,Curator 有活跃的社区支持和丰富的文档资源,可以帮助开发人员快速上手并解决问题。

总结来说,Curator 是一个功能强大且易于使用的 ZooKeeper 客户端库,通过提供高级抽象和工具,显著简化了分布式应用的开发,提高了系统的稳定性和可靠性。

在 Spring Boot 中集成 Curator

1. 添加依赖

pom.xml 中添加 Curator 和 ZooKeeper 的 Maven 依赖:

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.3.0</version>
</dependency>
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.3.0</version>
</dependency>

2. 配置 ZooKeeper 连接信息

application.propertiesapplication.yml 中配置 ZooKeeper 服务器的连接信息:

zookeeper.connectString=localhost:2181
zookeeper.sessionTimeout=60000
zookeeper.connectionTimeout=15000
zookeeper.retryBaseSleepTime=1000
zookeeper.retryMaxRetries=3

3. 创建 CuratorFramework 配置类

创建一个 Spring 配置类,用于初始化 CuratorFramework 客户端:

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class CuratorConfig {@Value("${zookeeper.connectString}")private String connectString;@Value("${zookeeper.sessionTimeout}")private int sessionTimeout;@Value("${zookeeper.connectionTimeout}")private int connectionTimeout;@Value("${zookeeper.retryBaseSleepTime}")private int retryBaseSleepTime;@Value("${zookeeper.retryMaxRetries}")private int retryMaxRetries;@Beanpublic CuratorFramework curatorFramework() {CuratorFramework client = CuratorFrameworkFactory.newClient(connectString,sessionTimeout,connectionTimeout,new ExponentialBackoffRetry(retryBaseSleepTime, retryMaxRetries));client.start();return client;}
}

4. 使用 CuratorFramework

在需要使用 ZooKeeper 的地方,注入 CuratorFramework 并使用:

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ZooKeeperController {@Autowiredprivate CuratorFramework curatorFramework;private InterProcessMutex lock;public ZooKeeperController() {this.lock = new InterProcessMutex(curatorFramework, "/my/lock/path");}@GetMapping("/lock")public String acquireLock() {try {lock.acquire();// 执行需要同步的操作return "Lock acquired!";} catch (Exception e) {e.printStackTrace();return "Failed to acquire lock!";} finally {try {lock.release();} catch (Exception e) {e.printStackTrace();}}}
}

5. 使用 Spring Boot 应用配置文件

application.yml 中配置 ZooKeeper 连接参数:

zookeeper:connectString: localhost:2181sessionTimeout: 60000connectionTimeout: 15000retryBaseSleepTime: 1000retryMaxRetries: 3

通过上述步骤,您可以在 Spring Boot 项目中集成 Curator,并使用它来与 ZooKeeper 进行交互。Curator 提供了许多高级功能,如分布式锁、领导选举等,可以帮助您简化分布式系统的开发。

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

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

相关文章

node js安装、配置(Windows版)

目录 node js 安装 node js 全局配置 1、全局安装路径 2、全局缓存路径 3、修改环境变量 pnpm安装、卸载 全局安装pnpm 验证pnpm版本 卸载pnpm 1、移除全局安装的包 2、移除pnpm cli 脚本直接安装 npm安装的使用命令直接卸载 node js 安装 cmd 查看是否存在&…

容器docker 架构命令案例

文章目录 前言一、docker1.1 为什么有docker1.2 docker架构1.3 docker 安装1.4 docker中央仓库1.5 docker 基本指令1.6 docker数据卷&#xff0c;挂载例&#xff1a;nginx 数据卷挂载例&#xff1a;mysql 本地持久化 1.7 镜像制作镜像结构dockerfile基础指令容器生成镜像 1.8 d…

宿主机访问docker容器中的mysql被拒绝

问题&#xff1a; 解决方案&#xff1a; 1.进入docker中的mysql容器 docker exec -it 容器名称/id /bin/bash 2.登录用户 mysql -u root -p 3.进去mysql自带的管理数据库mysql use mysql; 4.查询用户的访问权限 SELECT user, host FROM user WHERE userroot;5.发现该用…

绘画平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;讲师管理&#xff0c;课程类型管理&#xff0c;课程信息管理&#xff0c;课程购买管理&#xff0c;作业类型管理 开发系统&#xff1a;Windows 架构模式&#xff1a;SSM JDK版本&…

AURORA仿真

AURORA 仿真验证 定义&#xff1a;AURORA是一种高速串行通信协议&#xff0c;通常用于在数字信号处理系统和其他电子设备之间传输数据。它提供了一种高效的方式来传输大量数据&#xff0c;通常用于需要高带宽和低延迟的应用中。AURORA协议通常由Xilinx公司的FPGA器件支持&#…

golang 项目打包部署环境变量设置

最近将 golang 项目打包部署在不同环境&#xff0c;总结一下自己的心得体会&#xff0c;供大家参考。 1、首先要明确自己目标服务器的系统类型(例如 windows 或者Linux) &#xff0c;如果是Linux 还需要注意目标服务器的CPU架构(amd或者arm) 目标服务器的CPU架构可执行命令&…

对Mapper.xml文件进行深入的学习

1. 前言 既上次在Mapper.xml文件出现bug之后&#xff0c;痛改前非&#xff0c;决定吃透Mapper.xml映射文件。 让我们通过具体的代码段来进一步理解 MyBatis 的 Mapper XML 文件中的每个组成部分。 <?xml version"1.0" encoding"UTF-8"?> <!…

python 爬取当当网图书榜

首先查看当当网好评书单页面&#xff0c;找到翻页的URL参数 直接用requests请求页面 resp requests.get(url) 找到想要的信息&#xff0c;使用正则表达式把这些信息提取出来 patternre.compile(list_num.*?(\d).<.*?<img src"(.*?)".*?title"(.*?…

Eel入门还有一些案例

Eel入门还有一些案例 Eel 是一个 Python 库&#xff0c;它允许 Python 程序通过简单的 API 与网页进行交互。它使用 WebSocket 协议来实现 Python 后端和 JavaScript 前端之间的实时通信。下面是关于 Eel 的用法、通信原理和使用场景的一篇博客文章。 Eel的基本原理 Eel的基本原…

针对vue3的render函数添加自定义指令

话不多说 直接上代码 主要是给h函数设置自定义指令控制 import /styles/reset.css import /styles/global.scss import uno.cssimport { createApp } from vue import App from ./App.vue import { setupRouter } from ./router import { setupStore } from ./store import …

Android studio之编译提示Could not find :umeng-asms-v1.2.1

1 、问题 Could not determine the dependencies of task :app:compileDebugJavaWithJavac. > Could not resolve all task dependencies for configuration :app:debugCompileClasspath.> Could not find :umeng-asms-v1.2.1:.Required by:project :app> Could not …

FGF14:脑部疾病新潜力靶标

成纤维细胞生长因子14&#xff08;FGF14&#xff09;是FGF11亚家族成员&#xff0c;在神经元的所有基本特性&#xff08;内在放电、兴奋性和抑制性神经元的突触传递和可塑性&#xff09;中发挥作用。 &#xff08;数据来源AlphaFold&#xff09; FGF14由247个氨基酸组成&#x…

实战篇(九):解锁3D魔方的秘密:用Processing编程实现交互式魔方

解锁3D魔方的秘密:用Processing编程实现交互式魔方 使用 Processing 创建一个 3D 魔方效果展示1. 安装 Processing2. 项目结构3. 代码实现4. 代码解释4.1. 初始化魔方4.2. 绘制魔方4.3. 处理鼠标事件4.4. 检查点击的面4.5. 旋转面和最终确定旋转5. 运行和测试6. 细节解释6.1. …

【资源调度】2-如何解决资源调度问题?

导读&#xff1a;本期是全网最全【资源调度】系列推文的第2期(共50期左右)。上期我们在《何为调度&#xff1f;》中&#xff0c;对调度的定义与作用、计划与调度的关系、调度问题的拆解做了详细介绍。从本期开始&#xff0c;我们选择【客服调度】场景作为【资源调度】问题的具象…

51单片机(STC8H8K64U/STC8051U34K64)_RA8889_8080参考代码(v1.3)

硬件&#xff1a;STC8H8K64U/STC8051U34K64 RA8889开发板 硬件跳线变更为并口8080模式&#xff0c;PS00x&#xff0c;R143&#xff0c;R142不接&#xff0c;R141无关 8080接口电路连接图&#xff1a; 实物连接图&#xff1a; RA8889开发板外接MCU连接器之引脚定义&…

IMS架构中的注册与会话流程:RTPEngine集成及消息路由详解

目录 S-CSCF 调用 RTPengine 整体路由 注意 IMS 注册流程 和 IMS 会话流程 的区别 IMS注册流程 IMS会话流程(如INVITE请求) 这种设计的原因 P-CSCF 调用 RTPengine S-CSCF 调用 RTPengine 整体路由 UA a生成SDP offer&#xff0c;发送SIP INVITE请求(包含SDP offer)&…

核密度估计KDE和概率密度函数PDF(深入浅出)

目录 1. 和密度估计&#xff08;KDE&#xff09;核密度估计的基本原理核密度估计的公式核密度估计的应用Python中的KDE实现示例代码 结果解释解释结果 总结 2. 概率密度函数&#xff08;PDF&#xff09;概率密度函数&#xff08;PDF&#xff09;是怎么工作的&#xff1a;用图画…

RDNet实战:使用RDNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

ubuntu显卡驱动重启后失效的解决办法

写在前方&#xff1a;ubuntu系统&#xff0c;显卡重启后驱动失效&#xff0c;显卡不可用。网上冲浪之后得以有效解决&#xff0c;以下是解决方案 查看显卡nvidia-smi&#xff1b;驱动失效消息&#xff1a; (base) rootnode:~# nvidia-smi NVIDIA-SMI has failed because it c…

AI大模型走进汽车车机,智驾将是未来

车机里的AI大模型在汽车行业中的应用越来越广泛&#xff0c;主要体现在智能座舱和自动驾驶系统的深度融合上。通过将AI大模型应用于车机系统&#xff0c;可以实现更高智能化的人车交互体验。AI大模型作为人工智能发展的核心引擎&#xff0c;正在成为汽车智能化发展的关键之一。…