您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn),文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在上一篇博客中,從思路上已經(jīng)分析了Zookeeper如何幫助我們實(shí)現(xiàn)分布式鎖,我們直接來(lái)看代碼:
[分布式客戶(hù)端]
[獲取分布式鎖的方法lock:初始化ZK]
[獲取分布式鎖的方法lock:創(chuàng)建臨時(shí)節(jié)點(diǎn)與判斷最小路徑]
[main測(cè)試]
[運(yùn)行結(jié)果]
需要注意的是,即便監(jiān)控到了比自己序號(hào)小的節(jié)點(diǎn)的刪除Watcher,也需要再次確認(rèn)下!
從結(jié)果上,看的很清楚,各個(gè)線程有序獲得鎖。
zkclient是在zookeeper原生API基礎(chǔ)上做了一點(diǎn)封裝,簡(jiǎn)化了ZK的復(fù)雜性。
來(lái)看代碼:
我們觀察下zkclient的使用,和以前基于zookeeper的原生API有哪些區(qū)別呢?
第一,原生API需要我們利用CountDownLatch來(lái)確保ZK的初始化,現(xiàn)在zkclient幫助我們屏蔽掉了這個(gè)細(xì)節(jié)
第二,原生API是不可以遞歸創(chuàng)建節(jié)點(diǎn)的,而zkclient可以幫助我們遞歸創(chuàng)建不存在的父節(jié)點(diǎn),還可以遞歸刪除
第三,支持序列化操作,上面的代碼你大概可以看出一些端倪,就是我們從操作byte[]到操作String了。(事實(shí)上,在zkclient中你只需要實(shí)現(xiàn)ZkSerializer接口,就可以完成Object到byte[]的轉(zhuǎn)換,雖然如此,但是實(shí)際開(kāi)發(fā)中,利用JSON也挺好的?。?/p>
第四,還有最重要的一點(diǎn)就是,zkclient將對(duì)節(jié)點(diǎn)的操作和對(duì)節(jié)點(diǎn)的監(jiān)控分離開(kāi)了,在原生API中2者是耦合在一起的!從思想上來(lái)看,便于理解;從代碼上來(lái)看,也簡(jiǎn)潔些(如果寫(xiě)在一起,頭都大了);更加方便的是,zkclient替我們完成了重復(fù)watch的功能!
[watch訂閱機(jī)制]
看到?jīng)]有,是不是有點(diǎn)像MQ的訂閱機(jī)制,非常好用!【但是也有點(diǎn)不太完美,子節(jié)點(diǎn)的數(shù)據(jù)變更為什么沒(méi)有監(jiān)控呢,這有點(diǎn)不符合人性??!還好有Curator...】
但是呢,我們知道ZK是有很多應(yīng)用場(chǎng)景的,比如實(shí)現(xiàn)分布式鎖,zkclient并沒(méi)有替我們進(jìn)行封裝,但是Curator框架可以幫助我們做到!
為了更好實(shí)現(xiàn)Java操作Zookeeper服務(wù)器,后來(lái)出現(xiàn)Curator框架,功能非常強(qiáng)大,目前已經(jīng)是Apache的頂級(jí)項(xiàng)目,有很多豐富的特性,比如session超時(shí)重連,主從選舉,分布式計(jì)數(shù)器,分布式鎖等,非常有利于Zookeeper復(fù)雜場(chǎng)景下的開(kāi)發(fā)。
POM文件:
增刪改查:
Curator框架使用鏈?zhǔn)骄幊田L(fēng)格,易讀性很強(qiáng)!
注意,不論是原生的API,還是基于zkclient的API,都是提供的connectTimeout,而Curator提供了sessionTimeout,功能很強(qiáng)大。
無(wú)論是原生的API,還是zkclient,都是支持異步回調(diào)的,但是Curator框架在支持異步回調(diào)的同時(shí),增加了線程池供我們優(yōu)化!
[NodeCacheListener]
[PathChildrenCacheListener]
對(duì)于Curator而言,為了解決重復(fù)Watch的問(wèn)題,它引入了一種全新的思想:Cache與ZK SERVER比對(duì)的機(jī)制。不論是原生的API,還是基于ZKCLIENT的,其實(shí)它們解決思路都是重復(fù)注冊(cè)!
思路決定出路!Curator通過(guò)事件驅(qū)動(dòng)將客戶(hù)端的Cache與ZK SERVER的數(shù)據(jù)比對(duì),就自然而然的解決了重復(fù)WATCH的功能!為什么Curator能成為Apache的頂級(jí)項(xiàng)目呢,我想大概就是因?yàn)樗呐c眾不同的設(shè)計(jì)思想!
在Curator中,有2種Listener,一個(gè)是監(jiān)控節(jié)點(diǎn)的NodeCacheListener,一個(gè)是監(jiān)控子節(jié)點(diǎn)的PathChildrenCacheListener。PathChildernCacheListener可以監(jiān)控子節(jié)點(diǎn)的新增、修改、刪除,非常好用!
上述就是小編為大家分享的如何進(jìn)行Zookeeper分布式鎖的代碼實(shí)現(xiàn)了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。