基於ZooKeeper的服務註冊中心

拷貝一篇博客留着 https://www.cnblogs.com/valor-xh/p/6281502.html

本文介紹基於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宕機之後如果提供者有變動,增加或者減少,無法把最新的服務提供者地址列表推送給消費者,所以消費者感知不到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章