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() {
@Override
public 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() {
@Override
public 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电子书籍、简历模板等海量资料。