当前位置: 首页 > article >正文

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电子书籍、简历模板等海量资料。


http://www.kler.cn/news/107547.html

相关文章:

  • 【鸿蒙软件开发】ArkTS基础组件之Gauge(环形图表)、LoadingProgress(动态加载)
  • webGL编程指南 第五章 MultiAttributeSize
  • Golang Struct 继承的深入讨论和细节
  • SQL group by、where和having语句用法
  • 20231027 比赛总结
  • CAx软件中若干C++日志库
  • 报错:Could not resolve host: mirrorlist.centos.org;Unknown error
  • 微信小程序设置 wx.showModal 提示框中 确定和取消按钮的颜色
  • LabVIEW开发TDS1000 和TDS2000 系列泰克示波器
  • React JSX常用语法总结
  • Python Selenium 之数据驱动测试的实现!
  • 【目标跟踪】多目标跟踪测距
  • 产品经理-关于B端与C端
  • MySQL主从复制(基于GTID--事务ID方式)
  • C51--单片机中断
  • 如何在宝塔面板安装配置MySQL数据库并实现公网访问
  • AJAX原理及介绍
  • 【计算机毕设小程序案例】基于SpringBoot的小演员招募小程序
  • 第九章 软件BUG和管理
  • HackTheBox-Starting Point--Tier 1---Crocodile
  • MySQL篇---第二篇
  • css如何将border线加到元素内部,占内边距,不占外边距
  • 【算法题】割后面积最大的蛋糕
  • JavaScript简介
  • 基于单片机的IC卡门禁系统设计
  • java中的内存分配
  • 平方根倒数快速算法
  • 源码角度分析Java 循环中删除数据为什么会报异常
  • PHP与mysql数据库交互
  • 常用字符串函数拓展