在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用Spring Integration實(shí)現(xiàn)分布式鎖

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

概述

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

  • 基于Redisson組件,使用redlock算法實(shí)現(xiàn)
  • 基于Apache Curator,利用Zookeeper的臨時(shí)順序節(jié)點(diǎn)模型實(shí)現(xiàn)

今天我們來說說第三種,使用Spring Integration實(shí)現(xiàn)。

Spring Integration在基于Spring的應(yīng)用程序中實(shí)現(xiàn)輕量級消息傳遞,并支持通過聲明適配器與外部系統(tǒng)集成。

Spring Integration的主要目標(biāo)是提供一個簡單的模型來構(gòu)建企業(yè)集成解決方案,同時(shí)保持關(guān)注點(diǎn)的分離,這對于生成可維護(hù),可測試的代碼至關(guān)重要。我們熟知的 Spring Cloud Stream的底層就是Spring Integration。

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

Spring Integration提供的全局鎖目前為如下存儲提供了實(shí)現(xiàn):

  • Gemfire
  • JDBC
  • Redis
  • Zookeeper

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

方法名 描述
lock() Acquires the lock.加鎖,如果已經(jīng)被其他線程鎖住或者當(dāng)前線程不能獲取鎖則阻塞
lockInterruptibly() Acquires the lock unless the current thread is interrupted.加鎖,除非當(dāng)前線程被打斷。
tryLock() Acquires the lock only if it is free at the time of invocation.嘗試加鎖,如果已經(jīng)有其他鎖鎖住,獲取當(dāng)前線程不能加鎖,則返回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.嘗試在指定時(shí)間內(nèi)加鎖,如果已經(jīng)有其他鎖鎖住,獲取當(dāng)前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
unlock() Releases the lock.解鎖

實(shí)戰(zhàn)

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

基于Redis實(shí)現(xiàn)

  • 引入相關(guān)組件

	

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{
//嘗試在指定時(shí)間內(nèi)加鎖,如果已經(jīng)有其他鎖鎖住,獲取當(dāng)前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
if(lock.tryLock(3,TimeUnit.SECONDS)){
log.info("lockisready");
TimeUnit.SECONDS.sleep(5);
}
}catch(InterruptedExceptione){
log.error("obtainlockerror",e);
}finally{
lock.unlock();
}
}
}
  • 測試
    啟動多個實(shí)例,分別訪問/lock/redis端點(diǎn),一個正常秩序業(yè)務(wù)邏輯,另外一個實(shí)例訪問出現(xiàn)如下錯誤c7fdd5d0-cb61-11ec-bce3-dac502259ad0.png說明第二個實(shí)例沒有拿到鎖,證明了分布式鎖的存在。

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


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

基于Zookeeper實(shí)現(xiàn)

  • 引入組件

	

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{
//嘗試在指定時(shí)間內(nèi)加鎖,如果已經(jīng)有其他鎖鎖住,獲取當(dāng)前線程不能加鎖,則返回false,加鎖失敗;加鎖成功則返回true
if(lock.tryLock(3,TimeUnit.SECONDS)){
log.info("lockisready");
TimeUnit.SECONDS.sleep(5);
}
}catch(InterruptedExceptione){
log.error("obtainlockerror",e);
}finally{
lock.unlock();
}
}
}
測試
啟動多個實(shí)例,分別訪問/lock/zookeeper端點(diǎn),一個正常秩序業(yè)務(wù)邏輯,另外一個實(shí)例訪問出現(xiàn)如下錯誤c81884ca-cb61-11ec-bce3-dac502259ad0.png
說明第二個實(shí)例沒有拿到鎖,證明了分布式鎖的存在。

原文標(biāo)題:這樣實(shí)現(xiàn)分布式鎖,才叫優(yōu)雅!

文章出處:【微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 分布式
    +關(guān)注

    關(guān)注

    1

    文章

    903

    瀏覽量

    74545
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14353

原文標(biāo)題:這樣實(shí)現(xiàn)分布式鎖,才叫優(yōu)雅!

文章出處:【微信號:DBDevs,微信公眾號:數(shù)據(jù)分析與開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Redis 分布式的正確實(shí)現(xiàn)方式

    分布式一般有三種實(shí)現(xiàn)方式:1. 數(shù)據(jù)庫樂觀;2. 基于Redis的分布式;3. 基于Zoo
    的頭像 發(fā)表于 05-31 14:19 ?3606次閱讀

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

    要介紹分布式,首先要提到與分布式鎖相對應(yīng)的是線程、進(jìn)程
    的頭像 發(fā)表于 07-01 11:49 ?3880次閱讀

    分布式的基本原理和案例實(shí)現(xiàn)

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

    分布式的設(shè)計(jì)與實(shí)現(xiàn)

    今天跟大家探討一下分布式的設(shè)計(jì)與實(shí)現(xiàn)。希望對大家有幫助,如果有不正確的地方,歡迎指出,一起學(xué)習(xí),一起進(jìn)步哈。
    的頭像 發(fā)表于 05-13 15:36 ?1774次閱讀

    深入理解redis分布式

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

    Redis實(shí)現(xiàn)分布式的幾種方案

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

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

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

    tldb提供分布式使用方法

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

    spring分布式框架有哪些

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

    springcloud如何實(shí)現(xiàn)分布式

    ,我們可以快速搭建分布式系統(tǒng),并且靈活地進(jìn)行伸縮和擴(kuò)展。 要實(shí)現(xiàn)分布式系統(tǒng),我們可以按照以下步驟來使用Spring Cloud: 服務(wù)注冊與發(fā)現(xiàn):
    的頭像 發(fā)表于 11-16 11:01 ?694次閱讀

    redis分布式如何實(shí)現(xiàn)

    Redis分布式是一種基于Redis實(shí)現(xiàn)的機(jī)制,可以用于多個進(jìn)程或多臺服務(wù)器之間對共享資源的并發(fā)訪問控制。在分布式系統(tǒng)中,由于多個進(jìn)程或多臺服務(wù)器同時(shí)訪問共享資源,可能會發(fā)生數(shù)據(jù)競爭
    的頭像 發(fā)表于 11-16 11:29 ?546次閱讀

    redis分布式死鎖處理方案

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

    redis分布式三個方法

    的三種常見的分布式實(shí)現(xiàn)方法:基于SETNX命令的簡單分布式、基于SET命令的帶過期時(shí)間的分布式
    的頭像 發(fā)表于 12-04 11:22 ?1478次閱讀

    如何實(shí)現(xiàn)Redis分布式

    機(jī)制,下面將詳細(xì)介紹如何實(shí)現(xiàn)Redis分布式。 一、引言 在分布式系統(tǒng)中,多個節(jié)點(diǎn)可能同時(shí)讀寫同一共享資源。如果沒有實(shí)現(xiàn)互斥訪問和同步機(jī)制
    的頭像 發(fā)表于 12-04 11:24 ?715次閱讀

    分布式的三種實(shí)現(xiàn)方式

    分布式的三種實(shí)現(xiàn)方式? 分布式是在分布式系統(tǒng)中用于實(shí)現(xiàn)
    的頭像 發(fā)表于 12-28 10:01 ?923次閱讀
    主站蜘蛛池模板: aa黄色大片| 色综合激情| 看真人一级毛片| 2021国产成人精品国产| 高清在线免费观看| 在线a人片免费观看不卡| 欧美性色欧美a在线观看| a网站免费| 中国一级特黄真人毛片| 91精品啪在线观看国产日本| 免费观看一级一片| www.色偷偷| 国内久久精品视频| 欧美xxxxx精品| 四虎国产精品免费观看| 中文字幕导航| 亚洲人成电影在线| 久久99国产精品免费观看| 丁香欧美| 国产精品九九热| 免费一级特黄特色大片| 白嫩美女一级高清毛片免费看| 日日拍拍| 天天综合干| sesese在线观看| 天天骑天天干| 手机国产看片| 天天操天天插天天干| 小雪被老外黑人撑破了视频| yy6080理aa级伦大片一级| 好男人午夜| 国产主播在线一区| 亚洲小younv另类| 夜夜操网站| 国内精品网站| 91极品女神私人尤物在线播放| 国产美女一级片| 亚洲色图27p| 日本一区二区视频在线观看| 亚洲一区二区三区深夜天堂| 在线二区|