最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用Zookeeper實現(xiàn)分布式鎖的實現(xiàn)示例

 更新時間:2025年10月22日 16:05:27   作者:小猿、  
Zookeeper是一個分布式協(xié)調(diào)服務(wù),非常適合用來實現(xiàn)分布式鎖,下面我將介紹如何在Spring Boot項目中集成Zookeeper來實現(xiàn)分布式鎖,_springboot實現(xiàn)基于zk的分布式鎖

概述

Zookeeper是一個分布式協(xié)調(diào)服務(wù),非常適合用來實現(xiàn)分布式鎖。下面我將介紹如何在Spring Boot項目中集成Zookeeper來實現(xiàn)分布式鎖。

1. 添加依賴

首先,在pom.xml中添加必要的依賴:

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.7.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>5.2.0</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.2.0</version>
</dependency>

2. 配置Zookeeper連接

application.propertiesapplication.yml中配置Zookeeper連接信息:

# Zookeeper配置
zookeeper.address=localhost:2181
zookeeper.session-timeout=5000
zookeeper.connection-timeout=5000

3. 創(chuàng)建Zookeeper配置類

@Configuration
public class ZookeeperConfig {

    @Value("${zookeeper.address}")
    private String connectString;

    @Value("${zookeeper.session-timeout}")
    private int sessionTimeout;

    @Value("${zookeeper.connection-timeout}")
    private int connectionTimeout;

    @Bean
    public CuratorFramework curatorFramework() {
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString(connectString)
                .sessionTimeoutMs(sessionTimeout)
                .connectionTimeoutMs(connectionTimeout)
                .retryPolicy(retryPolicy)
                .build();
        client.start();
        return client;
    }
}

4. 實現(xiàn)分布式鎖工具類

@Component
public class ZookeeperDistributedLock {

    private final CuratorFramework client;

    private static final String LOCK_ROOT_PATH = "/locks";

    public ZookeeperDistributedLock(CuratorFramework client) {
        this.client = client;
    }

    /**
     * 獲取互斥鎖
     * @param lockPath 鎖路徑
     * @param timeout 超時時間(毫秒)
     * @return 鎖對象
     */
    public InterProcessMutex acquireMutex(String lockPath, long timeout) throws Exception {
        String path = LOCK_ROOT_PATH + "/" + lockPath;
        InterProcessMutex mutex = new InterProcessMutex(client, path);
        
        if (mutex.acquire(timeout, TimeUnit.MILLISECONDS)) {
            return mutex;
        }
        return null;
    }

    /**
     * 釋放鎖
     * @param mutex 鎖對象
     */
    public void releaseMutex(InterProcessMutex mutex) {
        try {
            if (mutex != null && mutex.isAcquiredInThisProcess()) {
                mutex.release();
            }
        } catch (Exception e) {
            throw new RuntimeException("釋放鎖失敗", e);
        }
    }
}

5. 使用分布式鎖

在業(yè)務(wù)代碼中使用分布式鎖:

@Service
public class OrderService {

    @Autowired
    private ZookeeperDistributedLock distributedLock;

    public void createOrder() {
        InterProcessMutex lock = null;
        try {
            // 獲取鎖,設(shè)置超時時間5秒
            lock = distributedLock.acquireMutex("order-create", 5000);
            if (lock != null) {
                // 獲取鎖成功,執(zhí)行業(yè)務(wù)邏輯
                System.out.println("獲取鎖成功,開始處理業(yè)務(wù)");
                // 模擬業(yè)務(wù)處理
                Thread.sleep(2000);
                System.out.println("業(yè)務(wù)處理完成");
            } else {
                System.out.println("獲取鎖失敗,可能有其他實例正在處理");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 釋放鎖
            if (lock != null) {
                distributedLock.releaseMutex(lock);
            }
        }
    }
}

6. 測試分布式鎖

可以啟動多個Spring Boot實例來測試分布式鎖的效果:

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;

    @GetMapping("/create")
    public String createOrder() {
        orderService.createOrder();
        return "訂單創(chuàng)建請求已提交";
    }
}

實現(xiàn)原理說明

臨時順序節(jié)點:Zookeeper的分布式鎖實際上是利用了臨時順序節(jié)點的特性

鎖獲取

  • 每個客戶端在指定的鎖路徑下創(chuàng)建臨時順序節(jié)點
  • 判斷自己創(chuàng)建的節(jié)點是否是當前最小的節(jié)點,如果是則獲取鎖
  • 如果不是則監(jiān)聽前一個節(jié)點的刪除事件

鎖釋放

  • 任務(wù)完成后刪除自己創(chuàng)建的節(jié)點
  • 下一個節(jié)點會收到通知并獲取鎖

注意事項

  • 連接管理:確保Zookeeper客戶端連接的正確管理和異常處理
  • 鎖超時:設(shè)置合理的鎖超時時間,避免死鎖
  • 鎖釋放:務(wù)必在finally塊中釋放鎖,防止鎖泄漏
  • 重試機制:網(wǎng)絡(luò)不穩(wěn)定時需要有合理的重試機制
  • 鎖粒度:根據(jù)業(yè)務(wù)需求設(shè)計合理的鎖粒度

以上實現(xiàn)使用了Curator框架,它封裝了Zookeeper的復雜操作,提供了更簡單易用的API,特別是它的InterProcessMutex類已經(jīng)實現(xiàn)了分布式鎖的核心邏輯。

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

相關(guān)文章

  • 如何解決Webservice第一次訪問特別慢的問題

    如何解決Webservice第一次訪問特別慢的問題

    這篇文章主要介紹了如何解決Webservice第一次訪問特別慢的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 淺談一下Java中的ReentrantLock

    淺談一下Java中的ReentrantLock

    這篇文章主要介紹了淺談一下Java中的ReentrantLock,這個類是JUC工具包中對線程安全問題提供的一種解決方案,它主要是用來給對象上鎖,保證同一時間這能有一個線程在訪問當前對象,需要的朋友可以參考下
    2023-09-09
  • Java中比較運算符compareTo()、equals()與==的區(qū)別及應(yīng)用總結(jié)

    Java中比較運算符compareTo()、equals()與==的區(qū)別及應(yīng)用總結(jié)

    這篇文章主要給大家介紹了關(guān)于Java中比較運算符compareTo()、equals()與==的區(qū)別及應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-09-09
  • Java面試必問之ThreadLocal終極篇分享

    Java面試必問之ThreadLocal終極篇分享

    ThreadLocal是什么呢?其實ThreadLocal并非是一個線程的本地實現(xiàn)版本,它并不是一個Thread,而是thread local variable(線程局部變量),這篇文章主要給大家介紹了關(guān)于Java面試必問之ThreadLocal終極篇的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Java求兩集合的交集、并集、差集實例

    Java求兩集合的交集、并集、差集實例

    這篇文章主要介紹了Java求兩集合的交集、并集、差集實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • JUC并發(fā)編程LinkedBlockingQueue隊列深入分析源碼

    JUC并發(fā)編程LinkedBlockingQueue隊列深入分析源碼

    LinkedBlockingQueue 是一個可選有界阻塞隊列,這篇文章主要為大家詳細介紹了Java中LinkedBlockingQueue的實現(xiàn)原理與適用場景,感興趣的可以了解一下
    2023-04-04
  • springboot對接微信支付的完整流程(附前后端代碼)

    springboot對接微信支付的完整流程(附前后端代碼)

    最近在做支付平臺的項目,承接公司業(yè)務(wù)系統(tǒng)與第三方支付平臺的對接任務(wù),主要涉及微信支付、支付寶支付以及理房通支付等第三方平臺,這篇文章主要給大家介紹了關(guān)于springboot對接微信支付的完整流程,需要的朋友可以參考下
    2021-08-08
  • SpringShell命令行之交互式Shell應(yīng)用開發(fā)方式

    SpringShell命令行之交互式Shell應(yīng)用開發(fā)方式

    本文將深入探討Spring Shell的核心特性、實現(xiàn)方式及應(yīng)用場景,幫助開發(fā)者掌握這一強大工具,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • C語言指針數(shù)組案例詳解

    C語言指針數(shù)組案例詳解

    這篇文章主要介紹了C語言指針數(shù)組案例詳解,本文通過案例詳細的解釋了指針與數(shù)組的初始化還有關(guān)系與應(yīng)用,需要的朋友可以參考下這篇文章
    2021-07-07
  • Spring中的事務(wù)管理實例詳解

    Spring中的事務(wù)管理實例詳解

    這篇文章主要介紹了Spring中的事務(wù)管理,以實例形式詳細分析了事務(wù)的概念與特性以及事物管理的具體用法,需要的朋友可以參考下
    2014-11-11

最新評論

剑河县| 洪江市| 新和县| 车致| 汤原县| 临沭县| 通城县| 开封县| 泸水县| 舟曲县| 舟曲县| 兴文县| 通榆县| 台前县| 江山市| 久治县| 赤水市| 景德镇市| 西宁市| 绍兴县| 安平县| 堆龙德庆县| 榕江县| 门源| 垣曲县| 宝应县| 阆中市| 凤庆县| 泌阳县| 镇远县| 顺义区| 苍南县| 中江县| 隆回县| 浦县| 武穴市| 三亚市| 马龙县| 酉阳| 梅州市| 南川市|