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如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea

Java应用如何防止恶意文件上传

《Java应用如何防止恶意文件上传》恶意文件上传可能导致服务器被入侵,数据泄露甚至服务瘫痪,因此我们必须采取全面且有效的防范措施来保护Java应用的安全,下面我们就来看看具体的实现方法吧... 目录恶意文件上传的潜在风险常见的恶意文件上传手段防范恶意文件上传的关键策略严格验证文件类型检查文件内容控制文件存储

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

浅析Java如何保护敏感数据

《浅析Java如何保护敏感数据》在当今数字化时代,数据安全成为了软件开发中至关重要的课题,本文将深入探讨Java安全领域,聚焦于敏感数据保护的策略与实践,感兴趣的小伙伴可以了解下... 目录一、Java 安全的重要性二、敏感数据加密技术(一)对称加密(二)非对称加密三、敏感数据的访问控制(一)基于角色的访问

python利用backoff实现异常自动重试详解

《python利用backoff实现异常自动重试详解》backoff是一个用于实现重试机制的Python库,通过指数退避或其他策略自动重试失败的操作,下面小编就来和大家详细讲讲如何利用backoff实... 目录1. backoff 库简介2. on_exception 装饰器的原理2.1 核心逻辑2.2

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr