基於ZooKeeper的服務注冊中心


本文介紹基於ZooKeeper的Dubbo服務注冊中心的原理。

1.ZooKeeper中的節點

ZooKeeper是一個樹形結構的目錄服務,支持變更推送,因此非常適合作為Dubbo服務的注冊中心。

注:在ZooKeeper中,節點分為兩類,第一類是指構成集群的機器,我們稱之為機器節點;第二類是指數據模型中的數據單元,稱之為數據節點ZNode。ZooKeeper將所有數據存儲在內存中,數據模型是一棵樹(ZNode Tree),由斜杠(/)進行分割的路徑,就是一個ZNode,例如/foo/path1。每個ZNode上都會保存自己的數據內容,同時還會保存一系列屬性信息。

在ZooKeeper中,Znode可分為持久節點和臨時節點兩類,所謂持久節點是指一旦這個ZNode被創建了,除非主動進行ZNode的移除操作,否則這個ZNode將一直保存在ZooKeeper上。而臨時節點就不一樣了,它的生命周期和客戶端會話綁定,一旦客戶端會話失效,那么這個客戶端創建的所有臨時節點都會被移除。

基於ZooKeeper實現的注冊中心節點結構示意圖:

這里寫圖片描述

/dubbo:這是dubbo在ZooKeeper上創建的根節點;

/dubbo/com.foo.BarService:這是服務節點,代表了Dubbo的一個服務;

/dubbo/com.foo.BarService/providers:這是服務提供者的根節點,其子節點代表了每一個服務真正的提供者;

/dubbo/com.foo.BarService/consumers:這是服務消費者的根節點,其子節點代表每一個服務真正的消費者;

2.注冊中心的工作流程

接下來以上述的BarService為例,說明注冊中心的工作流程。

1)服務提供方啟動

服務提供者在啟動的時候,會在ZooKeeper上注冊服務。所謂注冊服務,其實就是在ZooKeeper的/dubbo/com.foo.BarService/providers節點下創建一個子節點,並寫入自己的URL地址,這就代表了com.foo.BarService這個服務的一個提供者。

2)服務消費者啟動

服務消費者在啟動的時候,會向ZooKeeper注冊中心訂閱自己的服務。其實,就是讀取並訂閱ZooKeeper上/dubbo/com.foo.BarService/providers節點下的所有子節點,並解析出所有提供者的URL地址來作為該服務地址列表。

同時,服務消費者還會在ZooKeeper的/dubbo/com.foo.BarService/consumers節點下創建一個臨時節點,並寫入自己的URL地址,這就代表了com.foo.BarService這個服務的一個消費者。

3)消費者遠程調用提供者

服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一個提供者進行調用,如果調用失敗,再選另一個提供者調用。

4)增加服務提供者

增加提供者,也就是在providers下面新建子節點。一旦服務提供方有變動,zookeeper就會把最新的服務列表推送給消費者。

5)減少服務提供者

所有提供者在ZooKeeper上創建的節點都是臨時節點,利用的是臨時節點的生命周期和客戶端會話相關的特性,因此一旦提供者所在的機器出現故障導致該提供者無法對外提供服務時,該臨時節點就會自動從ZooKeeper上刪除,同樣,zookeeper會把最新的服務列表推送給消費者。

6)ZooKeeper宕機之后

消費者每次調用服務提供方是不經過ZooKeeper的,消費者只是從zookeeper那里獲取服務提供方地址列表。所以當zookeeper宕機之后,不會影響消費者調用服務提供者,影響的是zookeeper宕機之后如果提供者有變動,增加或者減少,無法把最新的服務提供者地址列表推送給消費者,所以消費者感知不到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM