Spring?boot?整合?Redisson實現(xiàn)分布式鎖并驗證功能
簡述
整篇文章寫的比較粗糙,大佬看了輕噴。前半部分 是整合spring boot和redisson, 后半部分是驗證分布式鎖。在整個過程中遇見了不少的問題,在此做個記錄少走彎路
redisson是官方推薦的分布式鎖實現(xiàn)方案,采用redis自身的原子命令和lua腳本來實現(xiàn)
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. 編寫相關代碼實現(xiàn)
采用一個票卷庫存來進行鎖的驗證,需要預先在redis里面設置一個key為ticket的信息,值為100之類的數(shù)字即可 代碼示例編寫:
@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鎖時報錯, 需要和待鎖住的數(shù)據的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("扣除成功:剩余票數(shù):" + 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. 模擬實際環(huán)境驗證
一個簡單的分布式鎖驗證的demo完成了,比較粗糙,驗證的方式有多樣的,可以采用java本身的多線程進行驗證,也可以類似實際環(huán)境部署多個節(jié)點來驗證,這里為了技術的廣度的一個應用,采用后面的方式。
3.1 下載idea的docker插件并配置相關鏡像信息
- docker插件下載

idea配置docker連接虛擬機上的docker
開啟docker遠程連接
vim /usr/lib/systemd/system/docker.service
找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375

重啟docker
systemctl daemon-reload systemctl start docker
開放端口
firewall-cmd --zone=public --add-port=2375/tcp --permanent
idea配置docker連接

配置完成后可在idea中看到連接的docker鏡像、容器相關信息

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中直接構建鏡像啟動容器
配置信息如下

(1)Dockerfile文件位置
(2)鏡像tag
(3)構建成功后啟動的容器名稱
(4)端口映射 宿主機端口:容器內端口
jar包打好之后可直接點擊

如果沒有問題idea的docker控制臺會輸出容器內啟動相關日志信息

此處為了驗證分布式鎖,需要兩個節(jié)點以上,所以這里我手動啟動了另外一個docker容器(暫時沒有編寫shell腳本)
啟動命令如下
docker run -d --name demo2 -p 8900:8899 demo:1.1
容器名稱demo2 映射到宿主機端口 8900
查看應用日志可使用 docker logs -f 容器名稱
spring boot 構建docker鏡像應該有更簡單的方式,歡迎在評論區(qū)交流補充
3.2 配置nginx
可以更改默認的日志格式如下,為了記錄代理的具體節(jié)點信息
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;
}完整的代理配置如下

配置完成后
nginx -s reload
進行訪問驗證
192.168.0.160/lock
可查看nginx、容器內日志信息來驗證是否訪問成功
nginx如何訪問出現(xiàn)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
新增計劃

配置線程信息

(1) 請求線程數(shù)
(2) 多少s內啟動完線程 設置為0代表同時啟動 設置為2代表2s內啟動完20個線程,1s啟動10個線程
添加請求


(1) ip地址
(2) 端口
(3) path信息,這里設置為jar中的地址信息
點擊綠色三角箭頭啟動并進行驗證
查看redis緩存中設置的數(shù)據是否在測試完成后符合預期值,也可查看nginx中的日志來確定請求是否平均分配到了兩個節(jié)點

到此這篇關于Spring boot 整合 Redisson實現(xiàn)分布式鎖并驗證的文章就介紹到這了,更多相關Spring boot 分布式鎖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
feign服務端發(fā)現(xiàn)異??蛻舳颂幚淼姆椒ń榻B
這篇文章主要給大家介紹了關于feign服務端發(fā)現(xiàn)異??蛻舳颂幚淼姆椒?,文中通過示例代碼介紹的非常詳細,對大家學習或者使用feign具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-07-07
SpringBoot整合Flink CDC實現(xiàn)實時追蹤mysql數(shù)據變動
我們將整合Spring Boot和Apache Flink CDC(Change Data Capture)來實現(xiàn)實時數(shù)據追蹤,下面是一個基本的實踐流程代碼,包括搭建Spring Boot項目、整合Flink CDC以及實現(xiàn)數(shù)據變動的實時追蹤,需要的朋友可以參考下2024-07-07
如何通過Java監(jiān)聽MySQL數(shù)據的變化
對于二次開發(fā)來說,很大一部分就找找文件和找數(shù)據庫的變化情況,下面這篇文章主要給大家介紹了關于如何通過Java監(jiān)聽MySQL數(shù)據的變化的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-03-03
基于Jackson實現(xiàn)API接口數(shù)據脫敏的示例詳解
用戶的一些敏感數(shù)據,例如手機號、郵箱、身份證等信息,在數(shù)據庫以明文存儲,但在接口返回數(shù)據給瀏覽器(或三方客戶端)時,希望對這些敏感數(shù)據進行脫敏,所以本文就給大家介紹以惡如何利用Jackson實現(xiàn)API接口數(shù)據脫敏,需要的朋友可以參考下2023-08-08
Jmeter?BlazeMeter實現(xiàn)web錄制過程
BlazeMeter是一款與Apache JMeter兼容的chrome插件,采用BlazeMeter可以方便的進行流量錄制和腳本生成,作為接口測試腳本編寫的一個基礎,這篇文章主要介紹了Jmeter?BlazeMeter實現(xiàn)web錄制,需要的朋友可以參考下2021-12-12

