基於ZooKeeper的服務註冊中心

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

1.ZooKeeper中的節點算法

ZooKeeper是一個樹形結構的目錄服務,支持變動推送,所以很是適合做爲Dubbo服務的註冊中心。數據結構

注:在ZooKeeper中,節點分爲兩類,第一類是指構成集羣的機器,咱們稱之爲機器節點;第二類是指數據模型中的數據單元,稱之爲數據節點ZNode。ZooKeeper將全部數據存儲在內存中,數據模型是一棵樹(ZNode Tree),由斜槓(/)進行分割的路徑,就是一個ZNode,例如/foo/path1。每一個ZNode上都會保存本身的數據內容,同時還會保存一系列屬性信息。負載均衡

在ZooKeeper中,Znode可分爲持久節點和臨時節點兩類,所謂持久節點是指一旦這個ZNode被建立了,除非主動進行ZNode的移除操做,不然這個ZNode將一直保存在ZooKeeper上。而臨時節點就不同了,它的生命週期和客戶端會話綁定,一旦客戶端會話失效,那麼這個客戶端建立的全部臨時節點都會被移除。ide

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

這裏寫圖片描述

/dubbo:這是dubbo在ZooKeeper上建立的根節點;生命週期

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

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

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

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宕機以後若是提供者有變更,增長或者減小,沒法把最新的服務提供者地址列表推送給消費者,因此消費者感知不到。

相關文章
相關標籤/搜索