基于ZooKeeper的Dubbo服務(wù)注冊(cè)中心的原理
1.ZooKeeper中的節(jié)點(diǎn)
ZooKeeper是一個(gè)樹(shù)形結(jié)構(gòu)的目錄服務(wù),支持變更推送,因此非常適合作為Dubbo服務(wù)的注冊(cè)中心材鹦。
注:在ZooKeeper中飞傀,節(jié)點(diǎn)分為兩類(lèi),第一類(lèi)是指構(gòu)成集群的機(jī)器舔腾,我們稱(chēng)之為機(jī)器節(jié)點(diǎn)沪摄;第二類(lèi)是指數(shù)據(jù)模型中的數(shù)據(jù)單元躯嫉,稱(chēng)之為數(shù)據(jù)節(jié)點(diǎn)ZNode。ZooKeeper將所有數(shù)據(jù)存儲(chǔ)在內(nèi)存中杨拐,數(shù)據(jù)模型是一棵樹(shù)(ZNode Tree)祈餐,由斜杠(/)進(jìn)行分割的路徑,就是一個(gè)ZNode戏阅,例如/foo/path1昼弟。每個(gè)ZNode上都會(huì)保存自己的數(shù)據(jù)內(nèi)容啤它,同時(shí)還會(huì)保存一系列屬性信息奕筐。
在ZooKeeper中,Znode可分為持久節(jié)點(diǎn)和臨時(shí)節(jié)點(diǎn)兩類(lèi)变骡,所謂持久節(jié)點(diǎn)是指一旦這個(gè)ZNode被創(chuàng)建了离赫,除非主動(dòng)進(jìn)行ZNode的移除操作,否則這個(gè)ZNode將一直保存在ZooKeeper上塌碌。而臨時(shí)節(jié)點(diǎn)就不一樣了渊胸,它的生命周期和客戶端會(huì)話綁定,一旦客戶端會(huì)話失效台妆,那么這個(gè)客戶端創(chuàng)建的所有臨時(shí)節(jié)點(diǎn)都會(huì)被移除翎猛。
基于ZooKeeper實(shí)現(xiàn)的注冊(cè)中心節(jié)點(diǎn)結(jié)構(gòu)示意圖:
/dubbo:這是dubbo在ZooKeeper上創(chuàng)建的根節(jié)點(diǎn)胖翰;
/dubbo/com.foo.BarService:這是服務(wù)節(jié)點(diǎn),代表了Dubbo的一個(gè)服務(wù)切厘;
/dubbo/com.foo.BarService/providers:這是服務(wù)提供者的根節(jié)點(diǎn)萨咳,其子節(jié)點(diǎn)代表了每一個(gè)服務(wù)真正的提供者;
/dubbo/com.foo.BarService/consumers:這是服務(wù)消費(fèi)者的根節(jié)點(diǎn)疫稿,其子節(jié)點(diǎn)代表每一個(gè)服務(wù)真正的消費(fèi)者培他;
2.注冊(cè)中心的工作流程
接下來(lái)以上述的BarService為例,說(shuō)明注冊(cè)中心的工作流程遗座。
1)服務(wù)提供方啟動(dòng)
服務(wù)提供者在啟動(dòng)的時(shí)候舀凛,會(huì)在ZooKeeper上注冊(cè)服務(wù)。所謂注冊(cè)服務(wù)途蒋,其實(shí)就是在ZooKeeper的/dubbo/com.foo.BarService/providers節(jié)點(diǎn)下創(chuàng)建一個(gè)子節(jié)點(diǎn)猛遍,并寫(xiě)入自己的URL地址,這就代表了com.foo.BarService這個(gè)服務(wù)的一個(gè)提供者号坡。
2)服務(wù)消費(fèi)者啟動(dòng)
服務(wù)消費(fèi)者在啟動(dòng)的時(shí)候螃壤,會(huì)向ZooKeeper注冊(cè)中心訂閱自己的服務(wù)。其實(shí)筋帖,就是讀取并訂閱ZooKeeper上/dubbo/com.foo.BarService/providers節(jié)點(diǎn)下的所有子節(jié)點(diǎn)奸晴,并解析出所有提供者的URL地址來(lái)作為該服務(wù)地址列表。
同時(shí)日麸,服務(wù)消費(fèi)者還會(huì)在ZooKeeper的/dubbo/com.foo.BarService/consumers節(jié)點(diǎn)下創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn)寄啼,并寫(xiě)入自己的URL地址,這就代表了com.foo.BarService這個(gè)服務(wù)的一個(gè)消費(fèi)者代箭。
3)消費(fèi)者遠(yuǎn)程調(diào)用提供者
服務(wù)消費(fèi)者墩划,從提供者地址列表中,基于軟負(fù)載均衡算法嗡综,選一個(gè)提供者進(jìn)行調(diào)用乙帮,如果調(diào)用失敗,再選另一個(gè)提供者調(diào)用极景。
4)增加服務(wù)提供者
增加提供者察净,也就是在providers下面新建子節(jié)點(diǎn)。一旦服務(wù)提供方有變動(dòng)盼樟,zookeeper就會(huì)把最新的服務(wù)列表推送給消費(fèi)者氢卡。
5)減少服務(wù)提供者
所有提供者在ZooKeeper上創(chuàng)建的節(jié)點(diǎn)都是臨時(shí)節(jié)點(diǎn),利用的是臨時(shí)節(jié)點(diǎn)的生命周期和客戶端會(huì)話相關(guān)的特性晨缴,因此一旦提供者所在的機(jī)器出現(xiàn)故障導(dǎo)致該提供者無(wú)法對(duì)外提供服務(wù)時(shí)译秦,該臨時(shí)節(jié)點(diǎn)就會(huì)自動(dòng)從ZooKeeper上刪除,同樣,zookeeper會(huì)把最新的服務(wù)列表推送給消費(fèi)者筑悴。
6)ZooKeeper宕機(jī)之后
消費(fèi)者每次調(diào)用服務(wù)提供方是不經(jīng)過(guò)ZooKeeper的们拙,消費(fèi)者只是從zookeeper那里獲取服務(wù)提供方地址列表。所以當(dāng)zookeeper宕機(jī)之后阁吝,不會(huì)影響消費(fèi)者調(diào)用服務(wù)提供者睛竣,影響的是zookeeper宕機(jī)之后如果提供者有變動(dòng),增加或者減少求摇,無(wú)法把最新的服務(wù)提供者地址列表推送給消費(fèi)者射沟,所以消費(fèi)者感知不到。