欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot+zookeeper實現(xiàn)分布式鎖的示例代碼

 更新時間:2022年03月21日 16:11:23   作者:冬雪是你  
本文主要介紹了springboot+zookeeper實現(xiàn)分布式鎖的示例代碼,文中根據實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下

InterProcessMutex內部實現(xiàn)了zookeeper分布式鎖的機制,所以接下來我們嘗試使用這個工具來為我們的業(yè)務加上分布式鎖處理的功能

zookeeper分布式鎖的特點:1、分布式 2、公平鎖 3、可重入

依賴

<dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.4.10</version>
</dependency>
<!-- zookeeper 客戶端 -->
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-framework</artifactId>
   <version>2.12.0</version>
</dependency>
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-recipes</artifactId>
   <version>2.12.0</version>
</dependency>
<!-- lombok -->
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.18.16</version>
   <scope>provided</scope>
</dependency>

本地封裝

這個工具類主要封裝CuratorFramework這個client(連接Zookeeper)

@Slf4j
public class CuratorClientUtil {
    private String zookeeperServer;

    @Getter
    private CuratorFramework client;

    public CuratorClientUtil(String zookeeperServer) {
        this.zookeeperServer = zookeeperServer;
    }

  	// 創(chuàng)建CuratorFrameworkFactory并且啟動
    public void init() {
       // 重試策略,等待1s,最大重試3次
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
        this.client = CuratorFrameworkFactory.builder()
                .connectString(zookeeperServer)
                .sessionTimeoutMs(5000)
                .connectionTimeoutMs(5000)
                .retryPolicy(retryPolicy)
                .build();
        this.client.start();
    }

   // 容器關閉,CuratorFrameworkFactory關閉
    public void destroy() {
        try {
            if (Objects.nonNull(getClient())) {
                getClient().close();
            }
        } catch (Exception e) {
            log.info("CuratorFramework close error=>{}", e.getMessage());
        }
    }
}

配置

@Configuration
public class CuratorConfigration {
    @Value("${zookeeper.server}")
    private String zookeeperServer;
    // 注入時,指定initMethod和destroyMethod
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public CuratorClientUtil curatorClientUtil() {
        CuratorClientUtil clientUtil = new CuratorClientUtil(zookeeperServer);
        return clientUtil;
    }
}

測試代碼

模擬不同客戶端的請求

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
    // 注入client工具類
    @Autowired
    private CuratorClientUtil curatorClientUtil;
    // 在zookeeper的/rootLock節(jié)點下創(chuàng)建鎖對應的臨時有序節(jié)點
    private String rootLock = "/rootLock";

    @GetMapping("/testLock")
    public Object testLock() throws Exception {
        // 獲取當前線程的名字,方便觀察那些線程在獲取鎖
        String threadName = Thread.currentThread().getName();
        InterProcessMutex mutex = new InterProcessMutex(curatorClientUtil.getClient(), rootLock);
        try {
            log.info("{}---獲取鎖start", threadName);
            // 嘗試獲取鎖,最長等待3s,超時放棄獲取
            boolean lockFlag = mutex.acquire(3000, TimeUnit.SECONDS);
            // 獲取鎖成功,進行業(yè)務處理
            if (lockFlag) {
                log.info("{}---獲取鎖success", threadName);
                // 模擬業(yè)務處理,時間為3s
                Thread.sleep(3000);
            } else {
                log.info("{}---獲取鎖fail", threadName);
            }
        } catch (Exception e) {
            log.info("{}---獲取鎖異常", threadName);
        } finally {
            // 業(yè)務處理完成,釋放鎖,喚醒比當前線程創(chuàng)建的節(jié)點序號大(最靠近)的線程獲取鎖
            mutex.release();
            log.info("{}---鎖release", threadName);
        }
        return "線程:" + threadName + "執(zhí)行完成";
    }
}

JMeter測試

我們使用JMeter模擬100個客戶端同時并發(fā)的訪問 localhost:8081/test/testLock,相當于100個客戶端爭搶分布式鎖,結果如圖右上角所示,100個請求花了5分6s,每個線程獲取到鎖后業(yè)務處理3s,100個線程理想時間為300s(Thread.sleep(3000)),所以運行時間符合。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AiBDB0tM-1647660941538)(/Users/maxuedong/Library/Containers/com.tencent.qq/Data/Library/Application Support/QQ/Users/2860850965/QQ/Temp.db/63AC764F-1C38-4422-9A01-776403B51E5F.png)]

在這里插入圖片描述

zookeeper每個線程在/rooLock節(jié)點下創(chuàng)建的臨時有序節(jié)點如下圖,由于是臨時的,所以線程釋放鎖后這些節(jié)點也會刪除

在這里插入圖片描述

100個線程程序日志打印

在這里插入圖片描述

關于InterProcessMutex內部如何實現(xiàn)zookeeper分布式鎖,請看我寫的這篇文章:在這里

到此這篇關于springboot+zookeeper實現(xiàn)分布式鎖的示例代碼的文章就介紹到這了,更多相關springboot zookeeper分布式鎖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java檢測線程中斷狀態(tài)的方法示例

    Java檢測線程中斷狀態(tài)的方法示例

    這篇文章主要介紹了Java檢測線程中斷狀態(tài)的方法,結合實例形式分析了java針對線程中斷狀態(tài)檢測的相關實現(xiàn)技巧,需要的朋友可以參考下
    2019-10-10
  • Java加密解密和數(shù)字簽名完整代碼示例

    Java加密解密和數(shù)字簽名完整代碼示例

    這篇文章主要介紹了Java加密解密和數(shù)字簽名完整代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • Spring Boot整合JPA使用多個數(shù)據源的方法步驟

    Spring Boot整合JPA使用多個數(shù)據源的方法步驟

    這篇文章主要給大家介紹了關于Spring Boot整合JPA使用多個數(shù)據源的方法步驟,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • Java?WebService開源框架CXF詳解

    Java?WebService開源框架CXF詳解

    本文詳細講解了Java?WebService開源框架CXF,文中通過示例代碼介紹的非常詳細。對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • Java使用FastExcel實現(xiàn)合并單元格

    Java使用FastExcel實現(xiàn)合并單元格

    FastExcel 是一個采用純 java 開發(fā)的 excel 文件讀寫組件,支持 Excel'97(-2003)(BIFF8)文件格式,本文主要介紹了如何使用FastExcel實現(xiàn)合并單元格,需要的可以參考下
    2024-12-12
  • java字符串拼接與性能分析詳解

    java字符串拼接與性能分析詳解

    在JAVA中拼接兩個字符串的最簡便的方式就是使用操作符”+”。如果你用”+”來連接固定長度的字符串,可能性能上會稍受影響,但是如果你是在循環(huán)中來”+”多個串的話,性能將指數(shù)倍的下降,下面我們分析一下JAVA字符串拼接的性能
    2014-01-01
  • Java重點之基于比較的七大排序

    Java重點之基于比較的七大排序

    最近幾天在研究排序算法,看了很多博客,發(fā)現(xiàn)網上有的文章中對排序算法解釋的并不是很透徹,而且有很多代碼都是錯誤的,所以我根據這幾天看的文章,整理了一個較為完整的排序算法總結,本文中的所有算法均有JAVA實現(xiàn),經本人調試無誤后才發(fā)出,如有錯誤,請各位前輩指出
    2021-10-10
  • Java結合Kotlin實現(xiàn)寶寶年齡計算

    Java結合Kotlin實現(xiàn)寶寶年齡計算

    這篇文章主要為大家介紹了Java結合Kotlin實現(xiàn)寶寶年齡計算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • SpringCloud Zuul基本使用方法匯總

    SpringCloud Zuul基本使用方法匯總

    這篇文章主要介紹了SpringCloud Zuul基本使用方法匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Java?超詳細講解對象的構造及初始化

    Java?超詳細講解對象的構造及初始化

    面向對象乃是Java語言的核心,是程序設計的思想。Java語言的面向對象技術包括了面向對象和面向過程的基本概念,面向對象的特征,Java語言的類,對象,修飾符,抽象類等一系列的知識點
    2022-03-03

最新評論