服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Spring boot 整合 Redisson实现分布式锁并验证功能

Spring boot 整合 Redisson实现分布式锁并验证功能

2022-12-19 20:32幻夜星辰 Java教程

这篇文章主要介绍了Spring boot 整合 Redisson实现分布式锁并验证,redisson是官方推荐的分布式锁实现方案,采用redis自身的原子命令和lua脚本来实现,需要的朋友可以参考下

简述

整篇文章写的比较粗糙,大佬看了轻喷。前半部分 是整合spring boot和redisson, 后半部分是验证分布式锁。在整个过程中遇见了不少的问题,在此做个记录少走弯路

redisson是官方推荐的分布式锁实现方案,采用redis自身的原子命令和lua脚本来实现

1. 在idea中新建spring boot工程并引入所需依赖

idea中直接新建一个spring boot项目即可,再在pom.xml中引入所需依赖,依赖信息如下

  <!-- redis所需 -->
       <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>
      <!-- web页面访问所需 -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson-spring-data-25</artifactId>
  <version>3.16.4</version>
</dependency>
<!-- Redisson所需依赖 -->
<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson-spring-boot-starter</artifactId>
  <version>3.16.4</version>
</dependency>

2. 编写相关代码实现

采用一个票卷库存来进行锁的验证,需要预先在redis里面设置一个key为ticket的信息,值为100之类的数字即可 代码示例编写:

@RestController
@Slf4j
public class RedisController {
  // spring boot 操作redis的模板方法类
  @Autowired
  private StringRedisTemplate redisTemplate;

  // redisson操作bean
  @Resource
  private Redisson redisson;
  @RequestMapping("/lock")
  public String deductTicket(){
      String lockKey = "ticket";
      
      // 在spring boot 2.0.6版本中整合的redisson,key和锁不能一样
      // redis setnx 操作,此处的lockKey在后面追加1是为了避免redisson锁时报错, 需要和待锁住的数据的key信息不同
      RLock lock = redisson.getLock(lockKey+"1");
      try {
          lock.lock();
          int ticketCount = Integer.parseInt(redisTemplate.opsForValue().get(lockKey));
          if (ticketCount > 0) {
              int realTicketCount = ticketCount - 1;
              log.info("扣除成功:剩余票数:" + realTicketCount);
              redisTemplate.opsForValue().set(lockKey, realTicketCount + "");
              return realTicketCount + "";
          } else {
              log.error("扣除失败");
              return "error";
          }
          return "end";
      } finally {
          lock.unlock();
      }
  }
}

application.yml配置信息如下

server:
port: 8899  # web服务对外端口
redis:
  host: 192.168.0.160 #redis地址
  database: 0 #采用的库编号
  port: 6379 #redis端口
  password: 123456 #redis密码,如果redis没有设置密码直接去掉该配置不写空

3. 模拟实际环境验证

一个简单的分布式锁验证的demo完成了,比较粗糙,验证的方式有多样的,可以采用java本身的多线程进行验证,也可以类似实际环境部署多个节点来验证,这里为了技术的广度的一个应用,采用后面的方式。

3.1 下载idea的docker插件并配置相关镜像信息

  • docker插件下载

Spring boot 整合 Redisson实现分布式锁并验证功能

  • idea配置docker连接虚拟机上的docker

    开启docker远程连接

vim /usr/lib/systemd/system/docker.service

找到ExecStart,在最后面添加-H tcp://0.0.0.0:2375

Spring boot 整合 Redisson实现分布式锁并验证功能

重启docker

systemctl daemon-reload 
systemctl start docker

开放端口

firewall-cmd --zone=public --add-port=2375/tcp --permanent

idea配置docker连接

Spring boot 整合 Redisson实现分布式锁并验证功能

配置完成后可在idea中看到连接的docker镜像、容器相关信息

Spring boot 整合 Redisson实现分布式锁并验证功能

3.2 将spring boot打包的jar构建为docker镜像

编写Dockerfile

在工程目录中新建Dockerfile,与pom.xml文件同级

Dockerfile内容如下

FROM openjdk:8-jdk-alpine # 指定基础镜像为jdk8
ADD target/spring-0.0.1-SNAPSHOT.jar app.jar #将打包的jar包放入镜像中并重命名为app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]  #启动jar包

在pom.xml中添加插件信息

<plugin>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>1.0.0</version>
  <configuration>
      <imageName>com.demo/${project.artifactId}</imageName>
      <dockerDirectory></dockerDirectory>
      <resources>
          <resource>
              <targetPath>/</targetPath>
              <directory>${project.build.directory}</directory>
              <include>${project.build.finalName}.jar</include>
          </resource>
      </resources>
  </configuration>
</plugin>

idea添加docker构建配置

此处操作的目的是为了便于在idea中直接构建镜像启动容器

配置信息如下

Spring boot 整合 Redisson实现分布式锁并验证功能

(1)Dockerfile文件位置

(2)镜像tag

(3)构建成功后启动的容器名称

(4)端口映射 宿主机端口:容器内端口

jar包打好之后可直接点击

Spring boot 整合 Redisson实现分布式锁并验证功能

如果没有问题idea的docker控制台会输出容器内启动相关日志信息

Spring boot 整合 Redisson实现分布式锁并验证功能

此处为了验证分布式锁,需要两个节点以上,所以这里我手动启动了另外一个docker容器(暂时没有编写shell脚本)

启动命令如下

docker run -d --name demo2 -p 8900:8899 demo:1.1

容器名称demo2 映射到宿主机端口 8900

查看应用日志可使用 docker logs -f 容器名称

spring boot 构建docker镜像应该有更简单的方式,欢迎在评论区交流补充

3.2 配置nginx

可以更改默认的日志格式如下,为了记录代理的具体节点信息

 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" ' '"$upstream_addr"';

配置负载均衡

upstream tomcat { 
      server 192.168.0.160:8899 weight=10; # 此处设置权重为相同的即可
      server 192.168.0.160:8900 weight=10;
  }

配置代理

location  / {
         proxy_pass http://tomcat;
         proxy_redirect default;
      }

完整的代理配置如下

Spring boot 整合 Redisson实现分布式锁并验证功能

配置完成后

nginx -s reload

进行访问验证

192.168.0.160/lock

可查看nginx、容器内日志信息来验证是否访问成功

nginx如何访问出现error,可查看nginx中的错误日志。如果是权限问题(# failed (13: Permission denied) while connecting to upstream) 可用root用户启动或使用命令 setsebool -P httpd_can_network_connect 1 来解决

3.3 下载安装Jmeter进行测试

Jmeter下载地址:jmeter.apache.org/download_jm…

下载解压后在bin目录中店家jmeter.bat即可启动jmeter

新增计划

Spring boot 整合 Redisson实现分布式锁并验证功能

配置线程信息

Spring boot 整合 Redisson实现分布式锁并验证功能

(1) 请求线程数

(2) 多少s内启动完线程 设置为0代表同时启动 设置为2代表2s内启动完20个线程,1s启动10个线程

添加请求

Spring boot 整合 Redisson实现分布式锁并验证功能

Spring boot 整合 Redisson实现分布式锁并验证功能

(1) ip地址

(2) 端口

(3) path信息,这里设置为jar中的地址信息

点击绿色三角箭头启动并进行验证

查看redis缓存中设置的数据是否在测试完成后符合预期值,也可查看nginx中的日志来确定请求是否平均分配到了两个节点

Spring boot 整合 Redisson实现分布式锁并验证功能

参考文章:

juejin.cn/post/684490…

juejin.cn/post/709110…

到此这篇关于Spring boot 整合 Redisson实现分布式锁并验证的文章就介绍到这了,更多相关Spring boot 分布式锁内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7092397692902604813

延伸 · 阅读

精彩推荐
  • Java教程Java线程死锁代码详解

    Java线程死锁代码详解

    本篇文章主要介绍了Java线程死锁代码详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    这个名字想了很久~7812022-07-06
  • Java教程java旋转二维数组实例

    java旋转二维数组实例

    这篇文章主要介绍了java旋转二维数组,以实例形式较为详细的讲述了旋转二维数的原理与实现方法,需要的朋友可以参考下 ...

    shichen20145802019-12-03
  • Java教程Java开发环境配置方法

    Java开发环境配置方法

    这篇文章主要介绍了并不是每一台计算机都可以运行Java程序,要运行Java程序,计算机必须学习搭建Java开发环境,需要的朋友可以参考下 ...

    mrr2752019-12-28
  • Java教程深入浅出学习AQS组件

    深入浅出学习AQS组件

    AQS ( AbstractQueuedSynchronizer)是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,下面小编和大家来一起学习一下吧...

    凌风郎少4832021-09-16
  • Java教程java冒泡排序和快速排序代码

    java冒泡排序和快速排序代码

    本文主要介绍了java冒泡排序和快速排序的实例代码。具有很好的参考价值。下面跟着小编一起来看下吧...

    新美好时代3112020-09-06
  • Java教程Java JDK 二分法 分析demo(推荐)

    Java JDK 二分法 分析demo(推荐)

    下面小编就为大家带来一篇Java JDK 二分法 分析demo(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Java教程网3162020-12-04
  • Java教程实战干货之基于SpringBoot的RabbitMQ多种模式队列

    实战干货之基于SpringBoot的RabbitMQ多种模式队列

    RabbitMQ 是一个由Erlang语言开发的AMQP的开源实现,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗,下文...

    Acelin_H12152022-01-07
  • Java教程java环境中的JDK、JVM、JRE详细介绍

    java环境中的JDK、JVM、JRE详细介绍

    这篇文章主要介绍了java环境中的JDK、JVM、JRE详细介绍的相关资料,对于初学者还是有必要了解下,细致说明他们是什么,需要的朋友可以参考下 ...

    BigFengFeng3342020-07-08