基於zookeeper的服務註冊中心
本文介紹基於zookeeper的dubbo服務註冊中心的原理。
1.zookeeper中的節點
zookeeper是乙個樹形結構的目錄服務,支援變更推送,因此非常適合作為dubbo服務的註冊中心。
注:在zookeeper中,節點分為兩類,第一類是指構成集群的機器,我們稱之為機器節點;第二類是指資料模型中的資料單元,稱之為資料節點znode。zookeeper將所有資料儲存在記憶體中,資料模型是一棵樹(znode tree),由斜槓(/)進行分割的路徑,就是乙個znode,例如/foo/path1。每個znode上都會儲存自己的資料內容,同時還會儲存一系列屬性資訊。基於zookeeper實現的註冊中心節點結構示意圖:在zookeeper中,znode可分為持久節點和臨時節點兩類,所謂持久節點是指一旦這個znode被建立了,除非主動進行znode的移除操作,否則這個znode將一直儲存在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宕機之後如果提供者有變動,增加或者減少,無法把最新的服務提供者位址列表推送給消費者,所以消費者感知不到。
Linux上搭建zookeeper服務註冊中心
1.上傳zookeeper檔案至linux中 jdk 8u121 linux x64.tar.gz zookeeper 3.4.9.tar.gz 上傳的具體步驟 2.安裝jdk以及jdk配置環境變數 具體步驟 3.解壓zookeeper壓縮包至 opt目錄下 tar xzvf zookeeper 3...
Spring AOP的基於AspectJ註解開發
1.編寫目標類並配置 這個目標類並沒有實現介面,因此spring會自動用cglib來對其進行動態 public class orderdao void delete void update void find 2.編寫切面類並配置 切面類 public class myaspect 3.使用註解對目...
spring cloud Eureka服務註冊
yls 2020 5 5 org.springframework.cloud spring cloud starter netflix eureka server enableeurekaserver public static void main string args spring name i...