精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用Spring Integration實現分布式鎖

數據分析與開發 ? 來源:JAVA日知錄 ? 作者:飄渺Jam ? 2022-05-13 15:42 ? 次閱讀

概述

提到分布式鎖大家都會想到如下兩種:

  • 基于Redisson組件,使用redlock算法實現
  • 基于Apache Curator,利用Zookeeper的臨時順序節點模型實現

今天我們來說說第三種,使用Spring Integration實現。

Spring Integration在基于Spring的應用程序中實現輕量級消息傳遞,并支持通過聲明適配器與外部系統集成。

Spring Integration的主要目標是提供一個簡單的模型來構建企業集成解決方案,同時保持關注點的分離,這對于生成可維護,可測試的代碼至關重要。我們熟知的 Spring Cloud Stream的底層就是Spring Integration。

官方地址:https://github.com/spring-projects/spring-integration

Spring Integration提供的全局鎖目前為如下存儲提供了實現:

  • Gemfire
  • JDBC
  • Redis
  • Zookeeper

它們使用相同的API抽象,這意味著,不論使用哪種存儲,你的編碼體驗是一樣的。試想一下你目前是基于zookeeper實現的分布式鎖,哪天你想換成redis的實現,我們只需要修改相關依賴和配置就可以了,無需修改代碼。下面是你使用Spring Integration實現分布式鎖時需要關注的方法:

方法名 描述
lock() Acquires the lock.加鎖,如果已經被其他線程鎖住或者當前線程不能獲取鎖則阻塞
lockInterruptibly() Acquires the lock unless the current thread is interrupted.加鎖,除非當前線程被打斷。
tryLock() Acquires the lock only if it is free at the time of invocation.嘗試加鎖,如果已經有其他鎖鎖住,獲取當前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
tryLock(long time, TimeUnit unit) Acquires the lock if it is free within the given waiting time and the current thread has not been interrupted.嘗試在指定時間內加鎖,如果已經有其他鎖鎖住,獲取當前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
unlock() Releases the lock.解鎖

實戰

話不多說,我們看看使用Spring Integration如何基于redis和zookeeper快速實現分布式鎖,至于Gemfire 和 Jdbc的實現大家自行實踐。

基于Redis實現

  • 引入相關組件

	

org.springframework.boot
spring-boot-starter-integration



org.springframework.integration
spring-integration-redis



org.springframework.boot
spring-boot-starter-data-redis
  • 在application.yml中添加redis的配置

	
spring:
redis:
host:172.31.0.149
port:7111
  • 建立配置類,注入RedisLockRegistry

	
@Configuration
publicclassRedisLockConfiguration{

@Bean
publicRedisLockRegistryredisLockRegistry(RedisConnectionFactoryredisConnectionFactory){
returnnewRedisLockRegistry(redisConnectionFactory,"redis-lock");
}

}
  • 編寫測試代碼

	
@RestController
@RequestMapping("lock")
@Log4j2
publicclassDistributedLockController{
@Autowired
privateRedisLockRegistryredisLockRegistry;

@GetMapping("/redis")
publicvoidtest1(){
Locklock=redisLockRegistry.obtain("redis");
try{
//嘗試在指定時間內加鎖,如果已經有其他鎖鎖住,獲取當前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
if(lock.tryLock(3,TimeUnit.SECONDS)){
log.info("lockisready");
TimeUnit.SECONDS.sleep(5);
}
}catch(InterruptedExceptione){
log.error("obtainlockerror",e);
}finally{
lock.unlock();
}
}
}
  • 測試
    啟動多個實例,分別訪問/lock/redis端點,一個正常秩序業務邏輯,另外一個實例訪問出現如下錯誤c7fdd5d0-cb61-11ec-bce3-dac502259ad0.png說明第二個實例沒有拿到鎖,證明了分布式鎖的存在。

注意,如果使用新版Springboot進行集成時需要使用Redis4版本,否則會出現下面的異常告警,主要是unlock()釋放鎖時使用了UNLINK命令,這個需要Redis4版本才能支持。


	
2020-05-141124,781WARNRedisLockRegistry:339-TheUNLINKcommandhasfailed(notsupportedontheRedisserver?);fallingbacktotheregularDELETEcommand
org.springframework.data.redis.RedisSystemException:Errorinexecution;nestedexceptionisio.lettuce.core.RedisCommandExecutionException:ERRunknowncommand'UNLINK'

基于Zookeeper實現

  • 引入組件

	

org.springframework.boot
spring-boot-starter-integration



org.springframework.integration
spring-integration-zookeeper
  • 在application.yml中添加zookeeper的配置

	
zookeeper:
host:172.31.0.43:2181
  • 建立配置類,注入ZookeeperLockRegistry

	
@Configuration
publicclassZookeeperLockConfiguration{
@Value("${zookeeper.host}")
privateStringzkUrl;


@Bean
publicCuratorFrameworkFactoryBeancuratorFrameworkFactoryBean(){
returnnewCuratorFrameworkFactoryBean(zkUrl);
}

@Bean
publicZookeeperLockRegistryzookeeperLockRegistry(CuratorFrameworkcuratorFramework){
returnnewZookeeperLockRegistry(curatorFramework,"/zookeeper-lock");
}
}
  • 編寫測試代碼

	
@RestController
@RequestMapping("lock")
@Log4j2
publicclassDistributedLockController{

@Autowired
privateZookeeperLockRegistryzookeeperLockRegistry;

@GetMapping("/zookeeper")
publicvoidtest2(){
Locklock=zookeeperLockRegistry.obtain("zookeeper");
try{
//嘗試在指定時間內加鎖,如果已經有其他鎖鎖住,獲取當前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
if(lock.tryLock(3,TimeUnit.SECONDS)){
log.info("lockisready");
TimeUnit.SECONDS.sleep(5);
}
}catch(InterruptedExceptione){
log.error("obtainlockerror",e);
}finally{
lock.unlock();
}
}
}
測試
啟動多個實例,分別訪問/lock/zookeeper端點,一個正常秩序業務邏輯,另外一個實例訪問出現如下錯誤c81884ca-cb61-11ec-bce3-dac502259ad0.png
說明第二個實例沒有拿到鎖,證明了分布式鎖的存在。

原文標題:這樣實現分布式鎖,才叫優雅!

文章出處:【微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 分布式
    +關注

    關注

    1

    文章

    879

    瀏覽量

    74467
  • spring
    +關注

    關注

    0

    文章

    338

    瀏覽量

    14311

原文標題:這樣實現分布式鎖,才叫優雅!

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Redis 分布式的正確實現方式

    分布式一般有三種實現方式:1. 數據庫樂觀;2. 基于Redis的分布式;3. 基于Zoo
    的頭像 發表于 05-31 14:19 ?3572次閱讀

    Java:Redis分布式的原理和案例

    要介紹分布式,首先要提到與分布式鎖相對應的是線程、進程
    的頭像 發表于 07-01 11:49 ?3849次閱讀

    分布式的基本原理和案例實現

    前面我們有聊過樂觀和悲觀實現,均是對于單體架構的場景下的實現。那么現在我們來總結看下分布式情況下如何
    的頭像 發表于 07-01 14:53 ?3299次閱讀
    <b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>的基本原理和案例<b class='flag-5'>實現</b>

    分布式的設計與實現

    今天跟大家探討一下分布式的設計與實現。希望對大家有幫助,如果有不正確的地方,歡迎指出,一起學習,一起進步哈。
    的頭像 發表于 05-13 15:36 ?1723次閱讀

    深入理解redis分布式

    深入理解redis分布式 哈嘍,大家好,我是指北君。 本篇文件我們來介紹如何Redis實現分布式的演進過程,以及為什么不能直接用Setn
    的頭像 發表于 10-08 14:13 ?911次閱讀
    深入理解redis<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>

    Redis實現分布式的幾種方案

    本文將介紹什么是分布式,以及使用Redis實現分布式的幾種方案。 前言 了解分布式
    的頭像 發表于 10-11 15:19 ?655次閱讀

    什么是分布式 Redis的五種分布式方案

    本地加鎖的方式在分布式的場景下不適用,所以本文我們來探討下如何引入分布式解決本地的問題。本篇所有代碼和業務基于我的開源項目 PassJava。
    發表于 10-23 11:35 ?1082次閱讀
    什么是<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b> Redis的五種<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>方案

    tldb提供分布式使用方法

    前言:分布式分布式系統中一個極為重要的工具。目前有多種分布式的設計方案,比如借助 redis,mq,數據庫,zookeeper 等第三
    的頭像 發表于 11-02 14:44 ?863次閱讀
    tldb提供<b class='flag-5'>分布式</b><b class='flag-5'>鎖</b>使用方法

    spring分布式框架有哪些

    Spring分布式框架是一套基于Spring框架的解決方案,用于構建分布式系統。它提供了一系列的組件和模塊,可以幫助開發人員輕松地構建可擴展、高可用、高性能的
    的頭像 發表于 11-16 10:58 ?750次閱讀

    springcloud如何實現分布式

    ,我們可以快速搭建分布式系統,并且靈活地進行伸縮和擴展。 要實現分布式系統,我們可以按照以下步驟來使用Spring Cloud: 服務注冊與發現:
    的頭像 發表于 11-16 11:01 ?650次閱讀

    redis分布式如何實現

    Redis分布式是一種基于Redis實現的機制,可以用于多個進程或多臺服務器之間對共享資源的并發訪問控制。在分布式系統中,由于多個進程或多臺服務器同時訪問共享資源,可能會發生數據競爭
    的頭像 發表于 11-16 11:29 ?499次閱讀

    redis分布式死鎖處理方案

    引言: 隨著分布式系統的廣泛應用,尤其是在大規模并發操作下,對并發控制的需求越來越高。Redis分布式作為一種常見的分布式
    的頭像 發表于 11-16 11:44 ?1696次閱讀

    redis分布式三個方法

    的三種常見的分布式實現方法:基于SETNX命令的簡單分布式、基于SET命令的帶過期時間的分布式
    的頭像 發表于 12-04 11:22 ?1405次閱讀

    如何實現Redis分布式

    機制,下面將詳細介紹如何實現Redis分布式。 一、引言 在分布式系統中,多個節點可能同時讀寫同一共享資源。如果沒有實現互斥訪問和同步機制
    的頭像 發表于 12-04 11:24 ?663次閱讀

    分布式的三種實現方式

    分布式的三種實現方式? 分布式是在分布式系統中用于實現
    的頭像 發表于 12-28 10:01 ?859次閱讀