99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

數(shù)據(jù)分析與開發(fā) ? 來源:JAVA日知錄 ? 作者:飄渺Jam ? 2022-05-13 15:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

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

  • 基于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)輕量級(jí)消息傳遞,并支持通過聲明適配器與外部系統(tǒng)集成。

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

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

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

  • Gemfire
  • JDBC
  • Redis
  • Zookeeper

它們使用相同的API抽象,這意味著,不論使用哪種存儲(chǔ),你的編碼體驗(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");
}

}
  • 編寫測(cè)試代碼

	
@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();
}
}
}
  • 測(cè)試
    啟動(dòng)多個(gè)實(shí)例,分別訪問/lock/redis端點(diǎn),一個(gè)正常秩序業(yè)務(wù)邏輯,另外一個(gè)實(shí)例訪問出現(xiàn)如下錯(cuò)誤c7fdd5d0-cb61-11ec-bce3-dac502259ad0.png說明第二個(gè)實(shí)例沒有拿到鎖,證明了分布式鎖的存在。

注意,如果使用新版Springboot進(jìn)行集成時(shí)需要使用Redis4版本,否則會(huì)出現(xiàn)下面的異常告警,主要是unlock()釋放鎖時(shí)使用了UNLINK命令,這個(gè)需要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");
}
}
  • 編寫測(cè)試代碼

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

@Autowired
privateZookeeperLockRegistryzookeeperLockRegistry;

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

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

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

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

    關(guān)注

    1

    文章

    998

    瀏覽量

    75430
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    15093

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

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

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

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

    前面我們有聊過樂觀和悲觀實(shí)現(xiàn),均是對(duì)于單體架構(gòu)的場(chǎng)景下的實(shí)現(xiàn)。那么現(xiàn)在我們來總結(jié)看下分布式情況下如何
    的頭像 發(fā)表于 07-01 14:53 ?3622次閱讀
    <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)。希望對(duì)大家有幫助,如果有不正確的地方,歡迎指出,一起學(xué)習(xí),一起進(jìn)步哈。
    的頭像 發(fā)表于 05-13 15:36 ?2188次閱讀

    深入理解redis分布式

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

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

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

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

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

    tldb提供分布式使用方法

    前言:分布式分布式系統(tǒng)中一個(gè)極為重要的工具。目前有多種分布式的設(shè)計(jì)方案,比如借助 redis,mq,數(shù)據(jù)庫,zookeeper 等第三
    的頭像 發(fā)表于 11-02 14:44 ?1263次閱讀
    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 ?1071次閱讀

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

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

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

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

    redis分布式死鎖處理方案

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

    redis分布式三個(gè)方法

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

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

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

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

    分布式的三種實(shí)現(xiàn)方式? 分布式是在分布式系統(tǒng)中用于實(shí)現(xiàn)
    的頭像 發(fā)表于 12-28 10:01 ?1274次閱讀