1. 程式人生 > >dubbo服務註冊

dubbo服務註冊

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