pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

Spring?boot?整合?Redisson實現分布式鎖并驗證功能

這篇文章主要介紹了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插件下載

  • 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控制臺會輸出容器內啟動相關日志信息

此處為了驗證分布式鎖,需要兩個節點以上,所以這里我手動啟動了另外一個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;
        }

完整的代理配置如下

配置完成后

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

新增計劃

配置線程信息

(1) 請求線程數

(2) 多少s內啟動完線程 設置為0代表同時啟動 設置為2代表2s內啟動完20個線程,1s啟動10個線程

添加請求

(1) ip地址

(2) 端口

(3) path信息,這里設置為jar中的地址信息

點擊綠色三角箭頭啟動并進行驗證

查看redis緩存中設置的數據是否在測試完成后符合預期值,也可查看nginx中的日志來確定請求是否平均分配到了兩個節點

參考文章:
juejin.cn/post/684490…

juejin.cn/post/709110…

到此這篇關于Spring boot 整合 Redisson實現分布式鎖并驗證的文章就介紹到這了,更多相關Spring boot 分布式鎖內容請搜索html5模板網以前的文章希望大家以后多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

這篇文章主要為大家詳細介紹了如何利用SpringBoot+WebSocket實現即時通訊功能,文中示例代碼講解詳細,對我們學習或工作有一定參考價值,需要的可以參考一下
本文主要介紹了SpringBoot二維碼生成base64并上傳OSS的實現示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學
本文主要介紹了SpringSecurity實現退出登錄和退出處理器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習
這篇文章主要介紹了springboot+redis實現一個簡單的熱搜功能,通過代碼介紹了過濾不雅文字的過濾器,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
這篇文章主要介紹了在SpringBoot中使用HATEOAS的方法,HATEOAS是實現REST規范的一種原則,通過遵循HATEOAS規范,可以解決我們實際代碼實現的各種個問題,下文更多相關介紹,需要的小伙伴可
在我們開發系統過程中,經常會處理一些費時間的任務(如:向數據庫中插入大量數據),這個時候就就需要使用多線程,下面這篇文章主要給大家介紹了關于Spring多線程的使用以及問題的相關
主站蜘蛛池模板: 甲级防雷检测仪-乙级防雷检测仪厂家-上海胜绪电气有限公司 | 河南砖机首页-全自动液压免烧砖机,小型砌块水泥砖机厂家[十年老厂] | 100国际学校招生 - 专业国际学校择校升学规划| 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 颚式破碎机,圆锥破碎机,制砂机-新乡市德诚机电制造有限公司 | 二手回收公司_销毁处理公司_设备回收公司-找回收信息网 | 玉米深加工设备-玉米深加工机械-新型玉米工机械生产厂家-河南粮院机械制造有限公司 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 【官网】博莱特空压机,永磁变频空压机,螺杆空压机-欧能优 | 没斑啦-专业的祛斑美白嫩肤知识网站-去斑经验分享 | 浙江筋膜枪-按摩仪厂家-制造商-肩颈按摩仪哪家好-温州市合喜电子科技有限公司 | 剪刃_纵剪机刀片_分条机刀片-南京雷德机械有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 磁力链接搜索神器_BT磁力狗_CILIMAO磁力猫_高效磁力搜索引擎2024 | 耐压仪-高压耐压仪|徐吉电气| 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 玻璃钢罐_玻璃钢储罐_盐酸罐厂家-河北华盛节能设备有限公司 | 铆钉机|旋铆机|东莞旋铆机厂家|鸿佰专业生产气压/油压/自动铆钉机 | 广东教师资格网-广东教师资格证考试网 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 中式装修设计_室内中式装修_【云臻轩】中式设计机构 | 气动球阀_衬氟蝶阀_调节阀_电动截止阀_上海沃托阀门有限公司 | 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | 多功能干燥机,过滤洗涤干燥三合一设备-无锡市张华医药设备有限公司 | 密集架-密集柜厂家-智能档案密集架-自动选层柜订做-河北风顺金属制品有限公司 | 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 阳光模拟试验箱_高低温试验箱_高低温冲击试验箱_快速温变试验箱|东莞市赛思检测设备有限公司 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 不锈钢水箱生产厂家_消防水箱生产厂家-河南联固供水设备有限公司 | 十二星座查询(性格特点分析、星座运势解读) - 玄米星座网 | 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 变频器维修公司_plc维修_伺服驱动器维修_工控机维修 - 夫唯科技 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 冷水机-冰水机-冷冻机-冷风机-本森智能装备(深圳)有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 自进式锚杆-自钻式中空注浆锚杆-洛阳恒诺锚固锚杆生产厂家 | 北京网站建设|北京网站开发|北京网站设计|高端做网站公司 |