基礎架構
-
服務注冊中心:Eureka提供的服務端,提供服務注冊於發現的功能,也就是在上一節中我們實現的eureka-server
- 服務提供者:提供服務的應用,可以是springBoot應用,也可以是其他技術平台且遵循Eureka通信機制的應用。它將
自己提供的服務注冊到Eureka,以供其他應用發現,也就是上一節中我們實現的HELLO-SERVICE應用。
- 服務消費者:消費者應用從服務注冊中心獲取服務列表,從而使消費者可以知道從何處調用其所需要的服務,在上一節
使用了Ribbon來實現服務消費,另外后續還需介紹是哦那個Feign的消費方式。
很多時候客戶端既是服務提供者也是服務消費者。
服務治理機制
根據上面的結構,我們來詳細了解一下,從服務注冊開始到服務調用,及各個元素涉及的一些重要通信行為
服務提供者
1.服務注冊
“服務提供者”在啟動的時候會通過發送REST請求的方式將自己注冊到EurekaServer上,同時帶了自身服務的一些元
數據信息。Eureka Server接收到這個REST請求之后,將元素據信息存儲在一個雙層結構的MAP中,其中,第一層的key是服務名,
第二層的key是具體服務的實例名。一個服務有多個實例的情況下,這些內容就是以這樣的雙層Map形式存儲的。
在服務注冊時,需要確認下eureka.client.register-with-eureka=true 參數是否正確,該值默認為true。若設置為false將不會啟動注冊操作。
2.服務同步。
兩個服務提供者分別注冊到了兩個不同的服務注冊中心上,也就是說,他們的信息分別被兩個服務注冊中心所維護。
此時,由於服務注冊中心之間因互相注冊為服務,當服務提供者發送注冊請求到一個服務注冊中心時,它會將請求轉發給集群中
相連的其他注冊中心,從而實現注冊中心之間的服務同步。通過服務同步,兩個服務提供者的服務信息就可以通過這兩台服務注冊中心的任意一台獲取。
3.服務續約
在注冊完服務之后,服務提供者會維護一個心跳用來持續告訴EurekaServer:"我還活着,"以防止Eureka Server的”剔除任務“將該服務實例從服務列表中排除出去。
我們稱該操作為服務續約。(Renew)
服務消費者
1.獲取服務
到這里,在服務注冊中心已經注冊了一個服務,並且該服務有兩個實例。當我們啟動服務消費者的時候,它會發送一個REST請求給服務注冊中心,來獲取
上面的服務清單,為了性能考慮,Eureka Server會維護一份只讀的服務清單來返回給客戶端,同時該緩存清單會每隔30s更新一次。
2.服務調用
服務消費者在獲取服務清單后,通過服務名可以獲得具體提供服務的實例名和該實例的元數據信息。因為有這些服務實例
的詳細信息,所以客戶端可以根據自己的需要決定具體調用哪個實例,在Ribbon中會默認采用輪詢的方式進行調用,從而使客戶端負載均衡。
對於訪問實例的選擇,Eureka中有Region和Zone的概念,一個Region中可以包含多個Zone,每個服務客戶端需要被注冊到一個
Zone中,所以每個客戶端對應一個Region和一個Zone。在進行服務調用的時候,優先訪問同處一個Zone中的服務提供方。
3.服務下線
在系統運行過程中必然會面臨關閉或重啟服務的某個實例的情況,在服務關閉期間,我們自然不希望客戶端會繼續調用關閉了的實例。所以在客戶端
程序中,當服務實例進行正常的關閉操作時,它會出發一個服務下線的REST請求給EurekaServer,告訴服務注冊中心:”我要下線了“。服務端接收到請求之后,將
該服務狀態置為down。並把下線事件傳播出去。
服務注冊中心
1.失效剔除
有些時候,我們的服務實例並不一定會正常下線,可能由於內存溢出,網絡故障等原因使服務不能正常工作,而服務注冊中心未
收到”服務下線“的請求。為了從服務列表中將這些無法提供服務的實例剔除。Eureka Server在啟動的時候會創建一個定時任務,默認每隔一段時間
(默認60s)將當前清單中超時(默認為90s)沒有續約的服務剔除出去。
2.自我保護
當我們在本地調試基於Eureka的程序時,基本上都會碰到一個這樣的問題,在服務注冊宗信的信息面板出現類下面
的警告信息:
實際上,該警告就出發了Eureka Server的自我保護機制。服務注冊到Eureka Server之后,會維護一個心跳連接,告訴Eureka Server自己還活着。
Eureka Server在運行期間,會統計心跳失敗的比例在15分鍾之內是否低於80%,如果出現低於的情況,Eureka Server會將當前的實例注冊信息保護起來
讓這些實例不會過期,盡可能保護這些注冊信息。但是,這段保護期間內實例出現問題,那么客戶端很容易拿到實際已經不存在的服務實例,會出現調用失敗的情況,
所以客戶端必須要有容錯機制,比如可以使用請求重試,斷路器機制等。