1. 程式人生 > >基於ZooKeeper的服務註冊中心

基於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下面新建子節點。服務消費方監聽provider節點,一旦該節點的內容有變動,provider就會將一個變更通知推送給所有客戶端,客戶端收到通知後就會主動去provider那拉取最新的服務地址列表。

這裡有必要介紹ZK的資料釋出與訂閱。釋出訂閱一般有兩種設計模式:推和拉。在推模式中,伺服器端主動將資料更新發送給所有訂閱的客戶端;拉模式則是由客戶端主動發起請求來獲取最新資料,通常客戶端都採用定時進行輪詢拉取的方式。ZK採用推拉相結合的模式:客戶端向服務端註冊自己需要關注的節點,一旦該節點的資料發生變更,那麼服務端就會向相應的客戶端傳送watcher事件通知,客戶端接收到這個訊息通知後,需要主動到服務端獲取最新的資料。

5)減少服務提供者

所有提供者在ZooKeeper上建立的節點都是臨時節點,利用的是臨時節點的生命週期和客戶端會話相關的特性,因此一旦提供者所在的機器出現故障導致該提供者無法對外提供服務時,該臨時節點就會自動從ZooKeeper上刪除,同樣,zookeeper會把provider節點資料變更通知推送給consumer,consumer就會前來拉取最新的服務地址。

6)ZooKeeper宕機之後,consumer和provider還能否通訊?

可以。消費者從ZK獲取provider地址列表後,會在本地快取一份。當ZK註冊中心所有節點全部宕掉之後,消費者可以使用本地快取的服務列表和provider進行通訊。
ZK的意義在於為consumer和provider提供服務地址的釋出/訂閱服務,讓消費者及時感知最新的服務列表,consumer真正呼叫provider是通過某種通訊協議直接呼叫,並不依賴ZK。
所以當zookeeper宕機之後,不會影響消費者呼叫服務提供者,影響的是zookeeper宕機之後如果提供者有變動,增加或者減少,zk無法把變更通知推送給consumer,consumer會因為感知不到變更時間,不去拉取最新的服務列表,導致本地快取的服務列表有可能過時的。