亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

Consul

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

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

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

加鎖的實現(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.將構件好的LockContext存儲在consul中
		String key = consulLockConfig.PREFIX+lockName;
		//加鎖成功
		Boolean value = consulClient.setKVValue(key, sessionId, putParams).getValue();
		if(value){
			//開起一個新的線程去執(zhí)行鎖續(xù)命--調用看門狗的方式實現(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;
	}
}

解鎖的實現(xiàn):

/**
 * 釋放鎖
 */
public boolean unLock(String lockName){
	//log.info("consul釋放鎖開始(線程:{},鎖名稱:{})",Thread.currentThread().getName(),lockName);
	String sessionId = SessionIdHolder.getSessionId();
	try {
		//先根據(jù)鎖名稱找到對應的sessionId   session 是需要進行存儲的  現(xiàn)在我們是通過一個lockContnt 假如說業(yè)務上不在一個微服務里釋放鎖 對應的 其他微服務如何獲取到這把鎖呢
		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
		//刪除對應的 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;
	}
}

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

相關文章

  • Elasticsearch8.1中的Script使用實例深入解讀

    Elasticsearch8.1中的Script使用實例深入解讀

    這篇文章主要為大家介紹了Elasticsearch8.1中的Script使用實例深入解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Java實現(xiàn)Socket的TCP傳輸實例

    Java實現(xiàn)Socket的TCP傳輸實例

    這篇文章主要介紹了Java實現(xiàn)Socket的TCP傳輸,實例分析了java通過socket實現(xiàn)TCP傳輸?shù)南嚓P技巧,需要的朋友可以參考下
    2015-05-05
  • Java中超高頻常見字符操作合集(建議收藏)

    Java中超高頻常見字符操作合集(建議收藏)

    這篇文章主要為大家詳細介紹了Java中超高頻常見字符操作合集,文中的示例代碼講解詳細,對我們學習java有一定的幫助,需要的小伙伴可以參考下
    2023-10-10
  • Java8中的LocalDateTime你會使用了嗎

    Java8中的LocalDateTime你會使用了嗎

    LocalDateTime?是?Java?8?中日期時間?API?提供的一個類,在日期和時間的表示上提供了更加豐富和靈活的支持,本文就來講講LocalDateTime的一些具體使用方法吧
    2023-05-05
  • RocketMQ設計之異步刷盤

    RocketMQ設計之異步刷盤

    本文介紹RocketMQ設計之異步刷盤,RocketMQ消息存儲到磁盤上,這樣既保證斷電后恢復,也讓存儲消息量超出內存限制,RocketMQ為了提高性能,會盡可能保證磁盤順序寫,消息通過Producer寫入RocketMQ的時候,有兩種方式,上篇介紹了同步刷盤,本文介紹異步刷盤,需要的朋友可以參考下
    2022-03-03
  • SpringBoot自動配置深入探究實現(xiàn)原理

    SpringBoot自動配置深入探究實現(xiàn)原理

    在springboot的啟動類中可以看到@SpringBootApplication注解,它是SpringBoot的核心注解,也是一個組合注解。其中@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三個注解尤為重要。今天我們就來淺析這三個注解的含義
    2022-08-08
  • 關于java中自定義注解的使用

    關于java中自定義注解的使用

    這篇文章主要介紹了關于java中自定義注解的使用,注解像一種修飾符一樣,應用于包、類型、構造方法、方法、成員變量、參數(shù)及本地變量的聲明語句中,需要的朋友可以參考下
    2023-07-07
  • 淺談Spring Cloud Ribbon的原理

    淺談Spring Cloud Ribbon的原理

    這篇文章主要介紹了淺談Spring Cloud Ribbon的原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • java多線程累加計數(shù)的實現(xiàn)方法

    java多線程累加計數(shù)的實現(xiàn)方法

    在多線程協(xié)作任務中,如何計算也是很重的,這篇文章主要介紹了java多線程累加計數(shù)的實現(xiàn)方法,感興趣的朋友可以了解一下
    2021-05-05
  • Javaweb使用thymeleaf局部刷新結合Layui插件實現(xiàn)Html分頁

    Javaweb使用thymeleaf局部刷新結合Layui插件實現(xiàn)Html分頁

    本文主要介紹了Javaweb使用thymeleaf局部刷新結合Layui插件實現(xiàn)Html分頁,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評論