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

淺談Java基于Consul創(chuàng)建分布式鎖

 更新時間:2023年07月12日 10:13:24   作者:Blue92120  
這篇文章主要介紹了淺談基于Consul創(chuàng)建分布式鎖,Consul是HashiCorp公司推出的開源工具,用于實(shí)現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置Consul是分布式的、高可用的、可橫向擴(kuò)展的,需要的朋友可以參考下

Consul

Consul是HashiCorp公司推出的開源工具,用于實(shí)現(xiàn)分布式系統(tǒng)的服務(wù)發(fā)現(xiàn)與配置。

Consul是分布式的、高可用的、可橫向擴(kuò)展的。它具備以下特性 :

  • 服務(wù)發(fā)現(xiàn):consul通過DNS或者HTTP接口使服務(wù)注冊和服務(wù)發(fā)現(xiàn)變的很容易。
  • 健康檢查:健康檢測使consul可以快速的告警在集群中的操作。
  • 鍵/值存儲:一個用來存儲動態(tài)配置的系統(tǒng)。提供簡單的HTTP接口,可以在任何地方操作。
  • 多數(shù)據(jù)中心:無需復(fù)雜的配置,即可支持任意數(shù)量的區(qū)域。

一句話概況:Consul既可以用于注冊中心和配置中心,也可以做keyValue存儲。使用Consul做分布式鎖的底層原理就是keyValue存儲。

基于consul的分布式鎖

ConsulClient 是一個比較核心的類(consul客戶端),keyvalue存儲要用。

    private ConsulClient consulClient;
    @PostConstruct
    public void init(){
        consulClient = new ConsulClient(consulLockConfig.getHost(),consulLockConfig.getPort());
    }

createSession方法用于創(chuàng)建一個會話并返回sessionId,ttl是過期時間。我們在釋放鎖的時候會用到這個sessionId。

    /**
     * 創(chuàng)建一個sessionId
     * @param lockName
     * @param ttlSeconds
     * @return
     */
    private String createSession(String lockName,int ttlSeconds){
        NewSession session = new NewSession();
        //session.setBehavior(Session.Behavior.DELETE);
        session.setBehavior(Session.Behavior.RELEASE);
        session.setName("session " + lockName);
        session.setTtl(ttlSeconds + "s");
        return consulClient.sessionCreate(session, null).getValue();
    }

加鎖的實(shí)現(xiàn):

/**
 * 獲取鎖
 * @param lockName 鎖的名稱(key)
 * @param ttlSeconds 鎖的超時時間
 * @return
 */
private boolean tryLock(String lockName,int ttlSeconds){
	try {
		PutParams putParams = new PutParams();
		String sessionId = createSession(lockName, ttlSeconds);
		SessionIdHolder.setSessionId(sessionId);
		log.info("consul加鎖開始(線程:{},鎖名稱:{},sessionId:{})",Thread.currentThread().getName(), lockName,sessionId);
		putParams.setAcquireSession(sessionId);
		//2.將構(gòu)件好的LockContext存儲在consul中
		String key = consulLockConfig.PREFIX+lockName;
		//加鎖成功
		Boolean value = consulClient.setKVValue(key, sessionId, putParams).getValue();
		if(value){
			//開起一個新的線程去執(zhí)行鎖續(xù)命--調(diào)用看門狗的方式實(shí)現(xiàn)
			if(consulLockConfig.isRenewal()){  //如果續(xù)期
				new ConsulWatchDog(consulClient).watchSession(sessionId,ttlSeconds);//啟動看門狗
			}
			log.info("consul加鎖成功(線程:{},鎖名稱:{},sessionId:{})",Thread.currentThread().getName(), lockName,sessionId);
			return true;
		}else{
			//將sessionId刪除
			//consulClient.deleteKVValue(key);
			log.info("consul加鎖失敗(線程:{},鎖名稱:{},sessionId:{})",Thread.currentThread().getName(), lockName,sessionId);
			return false;
		}
	}catch (Exception e){
		e.printStackTrace();
		return false;
	}
}

解鎖的實(shí)現(xiàn):

/**
 * 釋放鎖
 */
public boolean unLock(String lockName){
	//log.info("consul釋放鎖開始(線程:{},鎖名稱:{})",Thread.currentThread().getName(),lockName);
	String sessionId = SessionIdHolder.getSessionId();
	try {
		//先根據(jù)鎖名稱找到對應(yīng)的sessionId   session 是需要進(jìn)行存儲的  現(xiàn)在我們是通過一個lockContnt 假如說業(yè)務(wù)上不在一個微服務(wù)里釋放鎖 對應(yīng)的 其他微服務(wù)如何獲取到這把鎖呢
		String key = consulLockConfig.PREFIX+lockName;
		Response<GetValue> kvValue = consulClient.getKVValue(key);
		if(kvValue==null) return false;
		GetValue value = kvValue.getValue();
		if(value==null) return false;
		//log.info("consul釋放鎖開始(線程:{},鎖名稱:{},sessionId:{})",Thread.currentThread().getName(),lockName,sessionId);
		PutParams putParams = new PutParams();
		putParams.setReleaseSession(sessionId);
		consulClient.setKVValue(key, sessionId, putParams);
		//String sessionId = value.getDecodedValue();
		consulClient.sessionDestroy(sessionId, null);// key value也會被刪除 是使用的DELETE
		//刪除對應(yīng)的 sessionId存儲
		//consulClient.deleteKVValue(key);
		log.info("consul釋放鎖成功(線程:{},鎖名稱:{},sessionId:{})",Thread.currentThread().getName(),lockName,sessionId);
		return true;
	}catch (Exception e){
		e.printStackTrace();
		log.info("consul釋放鎖出錯(線程:{},鎖名稱:{},sessionId:{})",Thread.currentThread().getName(),lockName,sessionId);
		return false;
	}
}

到此這篇關(guān)于淺談Java基于Consul創(chuàng)建分布鎖的文章就介紹到這了,更多相關(guān)Consul創(chuàng)建分布鎖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot整合easy-es實(shí)現(xiàn)數(shù)據(jù)的增刪改查的示例代碼

    springboot整合easy-es實(shí)現(xiàn)數(shù)據(jù)的增刪改查的示例代碼

    Easy-Es是一款基于ElasticSearch官方提供的RestHighLevelClient打造的低碼開發(fā)框架,本文主要介紹了springboot整合easy-es實(shí)現(xiàn)數(shù)據(jù)的增刪改查的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 使用Vert.x Maven插件快速創(chuàng)建項(xiàng)目的方法

    使用Vert.x Maven插件快速創(chuàng)建項(xiàng)目的方法

    這篇文章主要介紹了使用Vert.x Maven插件快速創(chuàng)建項(xiàng)目的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Java輸入數(shù)據(jù)的知識點(diǎn)整理

    Java輸入數(shù)據(jù)的知識點(diǎn)整理

    在本篇文章里小編給大家整理的是關(guān)于Java如何輸入數(shù)據(jù)的相關(guān)知識點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)參考下。
    2020-01-01
  • 詳細(xì)了解MVC+proxy

    詳細(xì)了解MVC+proxy

    Java有兩種代理方式,一種是靜態(tài)代理,另一種是動態(tài)代理。對于靜態(tài)代理,其實(shí)就是通過依賴注入,對對象進(jìn)行封裝,不讓外部知道實(shí)現(xiàn)的細(xì)節(jié)。很多 API 就是通過這種形式來封裝的
    2021-07-07
  • SpringBoot 如何讀取pom.xml中的值

    SpringBoot 如何讀取pom.xml中的值

    這篇文章主要介紹了SpringBoot 如何讀取pom.xml中的值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java封裝數(shù)組之動態(tài)數(shù)組實(shí)現(xiàn)方法詳解

    Java封裝數(shù)組之動態(tài)數(shù)組實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Java封裝數(shù)組之動態(tài)數(shù)組實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了java動態(tài)數(shù)組的實(shí)現(xiàn)原理、操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • spring中BeanPostProcessor的作用和使用注意事項(xiàng)

    spring中BeanPostProcessor的作用和使用注意事項(xiàng)

    在Spring框架中,BeanPostProcessor?是一個核心擴(kuò)展接口,允許你在Bean實(shí)例化的過程中插入自定義邏輯,本文給大家介紹spring中BeanPostProcessor的作用,感興趣的朋友一起看看吧
    2025-04-04
  • Java雙向鏈表倒置功能實(shí)現(xiàn)過程解析

    Java雙向鏈表倒置功能實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Java雙向鏈表倒置功能實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot入門系列之JPA mysql

    SpringBoot入門系列之JPA mysql

    這篇文章主要介紹了SpringBoot入門系列之JPA mysql的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Jackson常用方法以及jacksonUtil工具類詳解

    Jackson常用方法以及jacksonUtil工具類詳解

    這篇文章主要介紹了Jackson常用方法以及jacksonUtil工具類詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

图木舒克市| 河东区| 巩留县| 通江县| 新巴尔虎右旗| 湾仔区| 山丹县| 巩留县| 城固县| 渭源县| 奎屯市| 监利县| 改则县| 秦皇岛市| 林西县| 全椒县| 昌乐县| 当雄县| 惠东县| 靖边县| 龙南县| 白银市| 台中县| 镇坪县| 永德县| 修文县| 宜君县| 珲春市| 万年县| 中卫市| 长白| 长白| 通化县| 鄂州市| 措美县| 耒阳市| 阳朔县| 阳东县| 贡山| 黄浦区| 上饶县|