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

目录

  • 简述
  • 1. 在idea中新建spring boot工程并引入所需依赖
  • 2. 编写相关代码实现
  • 3. 模拟实际环境验证
    • 3.1 下载idea的docker插件并配置相关镜像信息
    • 3.2 将spring boot打包的jar构建为docker镜像
    • 3.2 配置nginx
    • 3.3 下载安装Jmeter进行测试

简述 整篇文章写的比较粗糙,大佬看了轻喷。前半部分 是整合spring boot和redisson, 后半部分是验证分布式锁。在整个过程中遇见了不少的问题,在此做个记录少走弯路
redisson是官方推荐的分布式锁实现方案,采用redis自身的原子命令和lua脚本来实现

1. 在idea中新建spring boot工程并引入所需依赖 idea中直接新建一个spring boot项目即可,再在pom.xml中引入所需依赖,依赖信息如下
org.springframework.bootspring-boot-starter-data-redisorg.springframework.bootspring-boot-starter-weborg.redissonredisson-spring-data-253.16.4org.redissonredisson-spring-boot-starter3.16.4


2. 编写相关代码实现 采用一个票卷库存来进行锁的验证,需要预先在redis里面设置一个key为ticket的信息,值为100之类的数字即可 代码示例编写:
@RestController@Slf4jpublic class RedisController {// spring boot 操作redis的模板方法类@Autowiredprivate StringRedisTemplate redisTemplate; // redisson操作bean@Resourceprivate 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|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片

  • idea配置docker连接虚拟机上的docker
    开启docker远程连接
vim /usr/lib/systemd/system/docker.service

找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375
Spring|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片

重启docker
systemctl daemon-reload systemctl start docker

开放端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent

idea配置docker连接
【Spring|Spring boot 整合 Redisson实现分布式锁并验证功能】Spring|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片

配置完成后可在idea中看到连接的docker镜像、容器相关信息
Spring|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片


3.2 将spring boot打包的jar构建为docker镜像
编写Dockerfile
在工程目录中新建Dockerfile,与pom.xml文件同级
Dockerfile内容如下
FROM openjdk:8-jdk-alpine # 指定基础镜像为jdk8ADD target/spring-0.0.1-SNAPSHOT.jar app.jar #将打包的jar包放入镜像中并重命名为app.jarENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]#启动jar包

在pom.xml中添加插件信息
com.spotifydocker-maven-plugin1.0.0com.demo/${project.artifactId}/${project.build.directory}${project.build.finalName}.jar

idea添加docker构建配置
此处操作的目的是为了便于在idea中直接构建镜像启动容器
配置信息如下
Spring|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片

(1)Dockerfile文件位置
(2)镜像tag
(3)构建成功后启动的容器名称
(4)端口映射 宿主机端口:容器内端口
jar包打好之后可直接点击
Spring|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片

如果没有问题idea的docker控制台会输出容器内启动相关日志信息
Spring|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_formatmain'$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|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|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片

配置线程信息
Spring|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片

(1) 请求线程数
(2) 多少s内启动完线程 设置为0代表同时启动 设置为2代表2s内启动完20个线程,1s启动10个线程
添加请求
Spring|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片

Spring|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片

(1) ip地址
(2) 端口
(3) path信息,这里设置为jar中的地址信息
点击绿色三角箭头启动并进行验证
查看redis缓存中设置的数据是否在测试完成后符合预期值,也可查看nginx中的日志来确定请求是否平均分配到了两个节点
Spring|Spring boot 整合 Redisson实现分布式锁并验证功能
文章图片

参考文章:
juejin.cn/post/684490…
juejin.cn/post/709110…
到此这篇关于Spring boot 整合 Redisson实现分布式锁并验证的文章就介绍到这了,更多相关Spring boot 分布式锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    推荐阅读