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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node