掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
作者:程序員小航 2021-07-08 09:21:17
大數(shù)據(jù)
分布式 一般工作中常用的分布式鎖,就是基于 Redis 和 ZooKeeper,前面已經(jīng)介紹完了 Redisson 鎖相關(guān)的源碼,下面一起看看基于 ZooKeeper 的鎖。也就是 Curator 這個框架。

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、嘉祥網(wǎng)絡(luò)推廣、微信小程序開發(fā)、嘉祥網(wǎng)絡(luò)營銷、嘉祥企業(yè)策劃、嘉祥品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供嘉祥建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
一般工作中常用的分布式鎖,就是基于 Redis 和 ZooKeeper,前面已經(jīng)介紹完了 Redisson 鎖相關(guān)的源碼,下面一起看看基于 ZooKeeper 的鎖。也就是 Curator 這個框架。
Curator 的鎖也分為很多種,本文分析共享可重入鎖。
考慮到如果文章篇幅較長,不太適合閱讀,所以對文章做了適當(dāng)?shù)牟鸱帧?/p>
本機三個節(jié)點
版本:3.7.0 系統(tǒng):macOS 安裝方式:brew install zookeeper Curator Maven 依賴版本:5.1.0
org.apache.curator curator-recipes 5.1.0
詳細信息可參考官方文檔[1]。
加鎖前
在加鎖之前,ZooKeeper 僅有一個節(jié)點 /zookeeper。
加鎖中
在 /locks/lock_01 路徑上加鎖。
加鎖之后:
PS:下面代碼截圖中的代碼風(fēng)格就是 Curator 源碼的代碼風(fēng)格。
入口
InterProcessMutex#internalLock
開始先從 threadData 中獲取當(dāng)前線程,這里肯定是沒有的,所以進入 attemptLock 方法。
本方法中還包含了鎖重入的邏輯,后面也會介紹。
加鎖
LockInternals#attemptLock
核心部分就是這兩行:
創(chuàng)建臨時順序節(jié)點
StandardLockInternalsDriver#createsTheLock
可以看出節(jié)點的 mode 是 CreateMode.EPHEMERAL_SEQUENTIAL,表示這是一個臨時順序節(jié)點!
進入 CreateBuilderImpl#forPath(java.lang.String, byte[])
client.getDefaultData() 就是本機 IP 地址。
這個 adjustPath 方法看名字就是在調(diào)整路徑之類的。會生成一個 UUID 拼接到 /locks/lock_01 中,變成 /locks/lock_01/_c_UUID-lock-。
因為創(chuàng)建的是臨時順序節(jié)點,所以會自動在后面添加順序,最終變?yōu)?/locks/lock_01/_c_UUID-lock-0000000000。
具體創(chuàng)建節(jié)點是在 CreateBuilderImpl#pathInForeground 中。
創(chuàng)建臨時節(jié)點,如果路徑存在,會創(chuàng)建成功,如果路徑不存在會創(chuàng)建失敗;
創(chuàng)建失敗后,先創(chuàng)建路徑,再創(chuàng)建節(jié)點。
本篇文章主要介紹了基于 ZooKeeper 的分布式鎖框架 Curator 的使用,以及加鎖流程,源碼分析。
下面對內(nèi)容做下總結(jié):
重點需要關(guān)注的是:
引用鏈接:
[1]ZooKeeper Shared Reentrant Lock: https://curator.apache.org/curator-recipes/shared-reentrant-lock.html
本文轉(zhuǎn)載自微信公眾號「程序員小航」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系程序員小航公眾號。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流