Java之Zookeeper注冊中心原理剖析
RPC框架中有3個重要的角色:
注冊中心 :保存所有服務的名字,服務提供者的IP列表,服務消費者的IP列表
服務提供者: 提供跨進程服務
服務消費者: 尋找到指定命名的服務并消費。
Zookeeper用作注冊中心
簡單來講,zookeeper可以充當一個服務注冊表(Service Registry),讓多個服務提供者形成一個集群,讓服務消費者通過服務注冊表獲取具體的服務訪問地址(IP+端口)去訪問具體的服務提供者。如下圖所示:
具體來說,zookeeper就是個分布式文件系統(tǒng),每當一個服務提供者部署后都要將自己的服務注冊到zookeeper的某一路徑上: /{service}/{version}/{ip:port},比如我們的HelloWorldService部署到兩臺機器,那么zookeeper上就會創(chuàng)建兩條目錄:分別為/HelloWorldService/1.0.0/100.100.0.237:16888
/HelloWorldService/1.0.0/100.100.0.238:16888。
如圖:
在zookeeper中,進行服務注冊,實際上就是在zookeeper中創(chuàng)建了一個znode節(jié)點,該節(jié)點存儲了該服務的IP、端口、調(diào)用方式(協(xié)議、序列化方式)等。該節(jié)點承擔著最重要的職責,它由服務提供者(發(fā)布服務時)創(chuàng)建,以供服務消費者獲取節(jié)點中的信息,從而定位到服務提供者真正網(wǎng)絡拓撲位置以及得知如何調(diào)用。RPC服務注冊、發(fā)現(xiàn)過程簡述如下:
1.服務提供者啟動時,會將其服務名稱,ip地址注冊到配置中心。
2.服務消費者在第一次調(diào)用服務時,會通過注冊中心找到相應的服務的IP地址列表,并緩存到本地,以供后續(xù)使用。當消費者調(diào)用服務時,不會再去請求注冊中心,而是直接通過負載均衡算法從IP列表中取一個服務提供者的服務器調(diào)用服務。
3.當服務提供者的某臺服務器宕機或下線時,相應的ip會從服務提供者IP列表中移除。同時,注冊中心會將新的服務IP地址列表發(fā)送給服務消費者機器,緩存在消費者本機。
4.當某個服務的所有服務器都下線了,那么這個服務也就下線了。
5.同樣,當服務提供者的某臺服務器上線時,注冊中心會將新的服務IP地址列表發(fā)送給服務消費者機器,緩存在消費者本機。
6.服務提供方可以根據(jù)服務消費者的數(shù)量來作為服務下線的依據(jù)。
感知服務的下線&上線
zookeeper提供了“心跳檢測”功能,它會定時向各個服務提供者發(fā)送一個請求(實際上建立的是一個 socket 長連接),如果長期沒有響應,服務中心就認為該服務提供者已經(jīng)“掛了”,并將其剔除。比如100.100.0.237這臺機器如果宕機了,那么zookeeper上的路徑就會只剩/HelloWorldService/1.0.0/100.100.0.238:16888。
服務消費者會去監(jiān)聽相應路徑(/HelloWorldService/1.0.0),一旦路徑上的數(shù)據(jù)有任務變化(增加或減少),zookeeper都會通知服務消費方、服務提供者地址列表已經(jīng)發(fā)生改變,從而進行更新。
更為重要的是zookeeper 與生俱來的容錯容災能力(比如leader選舉),可以確保服務注冊表的高可用性。
使用 zookeeper 作為注冊中心時,客戶端訂閱服務時會向 zookeeper 注冊自身;主要是方便對調(diào)用方進行統(tǒng)計、管理。但訂閱時是否注冊 client 不是必要行為,和不同的注冊中心實現(xiàn)有關(guān),例如使用 consul 時便沒有注冊。
到此這篇關(guān)于Java之Zookeeper注冊中心原理剖析的文章就介紹到這了,更多相關(guān)Java之Zookeeper注冊中心原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA中WebService生成Java代碼并調(diào)用外部接口實現(xiàn)代碼
這篇文章主要介紹了IDEA中WebService生成Java代碼并調(diào)用外部接口實現(xiàn),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05Intellij Idea中進行Mybatis逆向工程的實現(xiàn)
這篇文章主要介紹了Intellij Idea中進行Mybatis逆向工程的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05