Spring Boot进阶(90):使用Spring Boot整合Curator,实现分布式锁,确保多个节点对同一资源的访问不会出现冲突

本文主要是介绍Spring Boot进阶(90):使用Spring Boot整合Curator,实现分布式锁,确保多个节点对同一资源的访问不会出现冲突,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

📣前言


  随着分布式系统的普及,有时会遇到一些问题,比如分布式锁、分布式队列等。在这些问题中,Zookeeper已经成为了一个不可忽略的重要角色。Curator是一个专门为Zookeeper和分布式系统提供支持的高级客户端库,它简化了对于Zookeeper客户端的使用及开发,同时也提供了很多高级特性比如选举、分布式锁等。那么如何在Spring Boot中整合Curator呢?
  这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!!

🌊环境说明

开发工具:IDEA 2021.3
JDK版本: JDK 1.8
Spring Boot版本:2.3.1 RELEASE
Maven版本:3.8.2


  🏆本文收录于《Spring Boot从入门到精通》,专门攻坚指数提升,2023 年国内最系统+最强(更新中)。

  本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。


摘要

  本文将介绍如何在Spring Boot中整合Curator,包括Curator的安装及使用方法,应用场景案例,实战教学,优缺点分析以及测试用例。

🌊正文

🌿搭建Spring Boot应用

  首先,我们先创建个基础的Spring Boot项目,如果还不会点这里,此处就不详细赘述啦。

概述

  Curator是Netflix开源的一个Zookeeper客户端库,其目的是通过封装Zookeeper的连接和异常处理来简化Zookeeper开发。Curator提供了很多高级特性比如分布式锁、选举、分布式队列、集群等。Curator的主要API分为四个部分:

  • Framework:提供基本操作。
  • Recipes:提供一些常用的组件,如分布式锁、分布式对象等。
  • Services:提供了一些常用的服务,如Leader选举等。
  • Utilities:一些实用工具。

Spring Boot集成教学

1. Curator的安装

pom.xml中添加以下依赖:

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

2. Curator的基本操作

2.1 创建连接
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new RetryUntilElapsed(5000, 1000));
client.start();
2.2 创建节点
client.create().forPath("/path", "data".getBytes());
2.3 删除节点
client.delete().forPath("/path");
2.4 更新节点
client.setData().forPath("/path", "new data".getBytes());
2.5 读取节点
byte[] data = client.getData().forPath("/path");
System.out.println(new String(data));
2.6 检查节点是否存在
Stat stat = client.checkExists().forPath("/path");
if (stat == null) {System.out.println("节点不存在");
} else {System.out.println("节点存在");
}

3. Curator的高级特性

3.1 分布式锁
InterProcessMutex lock = new InterProcessMutex(client, "/lock");
try {if (lock.acquire(10, TimeUnit.SECONDS)) {// 获得锁后执行操作}
} catch (Exception e) {e.printStackTrace();
} finally {try {lock.release();} catch (Exception e) {e.printStackTrace();}
}
3.2 选举
LeaderSelector selector = new LeaderSelector(client, "/leader", new LeaderSelectorListenerAdapter() {@Overridepublic void takeLeadership(CuratorFramework client) throws Exception {// 成为Leader后执行操作}
});
selector.autoRequeue();
selector.start();
3.3 分布式缓存
DistributedAtomicLong count = new DistributedAtomicLong(client, "/count", new RetryNTimes(10, 1000));
count.initialize(new Long(0));
count.increment();

应用场景案例

1. 分布式锁

  在分布式系统中,有一些操作只允许一个节点进行,此时就需要使用分布式锁。在Curator中,可以使用InterProcessMutex实现分布式锁。

2. 选举

  在分布式系统中,有一些服务只允许一个节点提供。在Curator中,可以使用LeaderSelector实现选举。

3. 分布式缓存

  在分布式系统中,有一些数据需要在多个节点共享,此时可以使用分布式缓存。在Curator中,可以使用DistributedAtomicLong实现分布式缓存。

实战教学

1. 基于Curator的分布式锁

1.1 项目依赖

pom.xml中添加以下依赖:

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.1</version>
</dependency>
1.2 创建分布式锁
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new RetryUntilElapsed(5000, 1000));
client.start();InterProcessMutex lock = new InterProcessMutex(client, "/lock");try {if (lock.acquire(10, TimeUnit.SECONDS)) {// 获得锁后执行操作}
} catch (Exception e) {e.printStackTrace();
} finally {try {lock.release();} catch (Exception e) {e.printStackTrace();}
}

2. 基于Curator的选举

2.1 项目依赖

pom.xml中添加以下依赖:

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.1</version>
</dependency>
2.2 创建选举
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new RetryUntilElapsed(5000, 1000));
client.start();LeaderSelector selector = new LeaderSelector(client, "/leader", new LeaderSelectorListenerAdapter() {@Overridepublic void takeLeadership(CuratorFramework client) throws Exception {// 成为Leader后执行操作}
});
selector.autoRequeue();
selector.start();

3. 基于Curator的分布式缓存

3.1 项目依赖

pom.xml中添加以下依赖:

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.1</version>
</dependency>
3.2 创建分布式缓存
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new RetryUntilElapsed(5000, 1000));
client.start();DistributedAtomicLong count = new DistributedAtomicLong(client, "/count", new RetryNTimes(10, 1000));
count.initialize(new Long(0));
count.increment();

优缺点分析

1. 优点

  • 提供了高级特性,如分布式锁、选举、分布式缓存等,方便开发。
  • 封装了Zookeeper的连接和异常处理,简化了开发。

2. 缺点

  • 依赖Zookeeper,安装和配置较为繁琐。
  • 在高并发情况下,可能会出现吞吐量不高的情况。

测试用例

详见上文实战教学部分。

全文小结

  本文介绍了如何在Spring Boot中整合Curator,包括Curator的安装及使用方法,应用场景案例,实战教学,优缺点分析以及测试用例。Curator是Netflix开源的一个Zookeeper客户端库,其主要作用是通过封装Zookeeper的连接和异常处理来简化Zookeeper开发。Curator提供了很多高级特性比如分布式锁、选举、分布式队列、集群等,方便了分布式系统的开发及调试。

总结

  Curator 是一个非常方便的Zookeeper客户端库,提供了很多高级特性,如分布式锁、选举、分布式缓存等,方便了分布式系统的开发及调试。本文从 Curator 的安装入手,详细讲解了如何在 Spring Boot 中整合 Curator,以及如何实现分布式锁、选举、分布式缓存等。同时,本文还分析了 Curator 的优缺点,并提供了相应的测试用例。对于正在学习分布式系统的同学,本文是一个很好的参考资料。

… …

  ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。

「赠人玫瑰,手留余香」,咱们下期拜拜~~

🌊热文推荐

滴~如下推荐【Spring Boot 进阶篇】的学习大纲,请小伙伴们注意查收。

Spring Boot进阶(01):Spring Boot 集成 Redis,实现缓存自由

Spring Boot进阶(02):使用Validation进行参数校验

Spring Boot进阶(03):如何使用MyBatis-Plus实现字段的自动填充

Spring Boot进阶(04):如何使用MyBatis-Plus快速实现自定义sql分页

Spring Boot进阶(05):Spring Boot 整合RabbitMq,实现消息队列服务

Spring Boot进阶(06):Windows10系统搭建 RabbitMq Server 服务端

Spring Boot进阶(07):集成EasyPoi,实现Excel/Word的导入导出

Spring Boot进阶(08):集成EasyPoi,实现Excel/Word携带图片导出

Spring Boot进阶(09):集成EasyPoi,实现Excel文件多sheet导入导出

Spring Boot进阶(10):集成EasyPoi,实现Excel模板导出成PDF文件

Spring Boot进阶(11):Spring Boot 如何实现纯文本转成.csv格式文件?

Spring Boot进阶(12):Spring Boot 如何获取Excel sheet页的数量?

Spring Boot进阶(13):Spring Boot 如何获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值name值?

Spring Boot进阶(14):Spring Boot 如何手动连接库并获取指定表结构?一文教会你

Spring Boot进阶(15):根据数据库连接信息指定分页查询表结构信息

Spring Boot进阶(16):Spring Boot 如何通过Redis实现手机号验证码功能?

Spring Boot进阶(17):Spring Boot如何在swagger2中配置header请求头等参数信息

Spring Boot进阶(18):SpringBoot如何使用@Scheduled创建定时任务?

Spring Boot进阶(19):Spring Boot 整合ElasticSearch

Spring Boot进阶(20):配置Jetty容器

Spring Boot进阶(21):配置Undertow容器

Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析

Spring Boot进阶(23):实现文件上传

Spring Boot进阶(24):如何快速实现多文件上传?

Spring Boot进阶(25):文件上传的单元测试怎么写?

Spring Boot进阶(26):Mybatis 中 resultType、resultMap详解及实战教学

Spring Boot进阶(27):Spring Boot 整合 kafka(环境搭建+演示)

Spring Boot进阶(28):Jar包Linux后台启动部署及滚动日志查看,日志输出至实体文件保存

Spring Boot进阶(29):如何正确使用@PathVariable,@RequestParam、@RequestBody等注解?不会我教你,结合Postman演示

Spring Boot进阶(30):@RestController和@Controller 注解使用区别,实战演示

… …

  若想系统完整的从0到1的学习,可以参考这篇专栏总结《2023最新首发,全网最全 Spring Boot 学习宝典(附思维导图)》,本专栏致力打造最硬核 Spring Boot 进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中。欢迎大家订阅持续学习。

  如果想快速定位学习,可以看这篇【教程导航帖】导航目录,你想学习的都被收集在内,快速投入学习!!两不误。

  在入门及进阶之途,我必助你一臂之力,系统性学习,从入门到精通,带你不走弯路,直奔终点;投资自己,永远性价比最高,都这么说了,你还不赶紧来学??

  本文涉及所有源代码,均已上传至GitHub开源,供同学们一对一参考 GitHub传送门,同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗

📣文末

我是bug菌,CSDN | 阿里云 | 华为云 | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

这篇关于Spring Boot进阶(90):使用Spring Boot整合Curator,实现分布式锁,确保多个节点对同一资源的访问不会出现冲突的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/296606

相关文章

详解Vue如何使用xlsx库导出Excel文件

《详解Vue如何使用xlsx库导出Excel文件》第三方库xlsx提供了强大的功能来处理Excel文件,它可以简化导出Excel文件这个过程,本文将为大家详细介绍一下它的具体使用,需要的小伙伴可以了解... 目录1. 安装依赖2. 创建vue组件3. 解释代码在Vue.js项目中导出Excel文件,使用第三

Linux alias的三种使用场景方式

《Linuxalias的三种使用场景方式》文章介绍了Linux中`alias`命令的三种使用场景:临时别名、用户级别别名和系统级别别名,临时别名仅在当前终端有效,用户级别别名在当前用户下所有终端有效... 目录linux alias三种使用场景一次性适用于当前用户全局生效,所有用户都可调用删除总结Linux

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

python管理工具之conda安装部署及使用详解

《python管理工具之conda安装部署及使用详解》这篇文章详细介绍了如何安装和使用conda来管理Python环境,它涵盖了从安装部署、镜像源配置到具体的conda使用方法,包括创建、激活、安装包... 目录pytpshheraerUhon管理工具:conda部署+使用一、安装部署1、 下载2、 安装3

Mysql虚拟列的使用场景

《Mysql虚拟列的使用场景》MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧... 目录1. 介绍mysql虚拟列1.1 定义和作用1.2 虚拟列与普通列的区别2. MySQL虚拟列的类型2