1. 程式人生 > >Eureka的服務提供者、服務消費者和註冊中心詳解

Eureka的服務提供者、服務消費者和註冊中心詳解

一 架構圖二 服務提供者1 服務註冊“服務提供者”在啟動的時候會通過REST請求的方式將自己註冊到Eureka Server上,同時帶上自身服務的一些元資料資訊。Eureka Server接收到這個REST請求之後,將元資料資訊儲存在一個雙層結構Map中,其中第一層的key是服務名,第二層的key是具體服務的例項名。在服務註冊時候,需要確認一下eureka.client.register-with-eureka=true引數是否正確,該值預設為true。若設定為false將不會啟動註冊操作。2 服務同步如架構圖所示,這裡的兩個微服務提供者分別註冊到兩個不同的服務註冊中心上,也就是說,它們的資訊分別被兩個服務註冊中心所維護。此時由於服務註冊中心之間因互相註冊為服務,當服務提供者傳送註冊請求到一個服務註冊中心時,它會將該請求轉發給叢集中相連的註冊中心,從而實現註冊中心之間的服務同步。通過服務同步,兩個服務提供者的服務資訊就可以通過這兩臺服務註冊中心中的任意一臺獲取,3 服務續約在註冊完服務之後,服務提供者會維護一個心跳用來持續告訴Eureka Server:“我還活著”,以防止Eureka Server的“剔除任務”將該服務例項從服務列表中排除出去,我們稱該操作為服務續約(Renew)。關於服務續約有兩個重要屬性,我們可以關注並根據需要來進行調整:eureka.client.registry-fetch-interval-seconds=30eureka.instance.lease-expiration-duration-in-seconds=90eureka.client.registry-fetch-interval-seconds引數用來定義服務續約任務的呼叫間隔時間,預設為30秒。eureka.instance.lease-expiration-duration-in-seconds引數用於定義服務失效時間,預設為90秒。三 服務消費者
1 獲取服務到此,在服務註冊中已經註冊了一個服務,並且該服務有兩個例項。當我們啟動服務消費者的時候,它會發送一個REST請求給服務註冊中心,來獲取上面註冊的服務清單。為了效能考慮,Eureka Server會維護一份只讀的服務清單來返回給客戶端,同時該快取清單會每隔30秒更新一次。獲取服務是服務消費者的基礎,所以必須確保eureka.client.fetch-registry=true引數沒有被修改為false,該值預設為true。eureka.client.registry-fetch-interval-seconds=30表示間隔多久去拉取服務註冊資訊,該引數預設值為30,單位為秒。2 服務呼叫服務消費者在獲取服務清單後,通過服務名可以獲得具體提供服務的例項名和該例項的元資料資訊。因為有了這些服務例項詳細資訊,所以客戶端可以根據自己的需要決定具體呼叫哪個例項,在Ribbon中預設採用輪詢的方式進行呼叫,從而實現客戶端的負載均衡。對於訪問例項的選擇,Eureka中有Region和Zone的概念,一個Region中可以包含多個Zone,每個服務客戶端需要註冊到一個Zone中,所以每個客戶端對於一個Region和一個Zone。在進行服務呼叫的時候,優先訪問同處一個Zone中服務提供方,若訪問不到,就訪問其他的Zone。3 服務下線在系統執行過程中必然會面臨關閉或重啟服務的某個例項的情況,在服務關閉期間,我們自然不希望客戶端會繼續呼叫關閉了的例項。所以客戶端程式中,當服務例項進行正常的關閉操作時,它會觸發一個服務下線的REST請求給Eureka Server,告訴服務註冊中心:“我要下線了”。服務端在接收到請求之後,將該服務狀態設定為(DOWN),並把該下線事件傳播出去。四 註冊中心
1 失效剔除有些時候,我們的服務例項並不一定會正常下線,可能由於記憶體溢位,網路故障等原因使得服務不能正常工作,而服務註冊中心並未收到“服務下線”的請求。為了從服務列表中將這些無法提供服務的例項剔除,Eureka Server在啟動時候會建立一個定時任務,預設每隔一段時間(預設60秒)將當前清單中超時(預設為90秒)沒有續約的服務剔除出去。2 自我保護當我們在本地除錯基於Eureka的程式的時候,基本都會碰到一個問題,在服務註冊中心的資訊面板中出現紅色警告資訊。實際上,該警告就是觸發了Eureka Server的自我保護機制。服務註冊到Eureka Server之後,會維護一個心跳連線,告訴Eureka Server自己還活著。Eureka Server在執行期間,會統計心跳失敗比例在15分鐘之內是否低於85%,如果出現低於的情況(在單機除錯的時候很容易滿足,實際在生產環境上通常是由於網路不穩定導致),Eureka Server會將當前的例項註冊資訊包含起來,讓這些例項不會過期,儘可能包含這些註冊資訊。但是,在這段保護期內例項若出現了問題,那麼客戶端很容易拿到實際已經不存在的服務例項,會出現呼叫失敗的情況,所有客戶端必須要有容錯機制,比如可以使用請求重試。斷路器等機制。由於本地除錯很容易觸發註冊中心的保護機制,這會使得註冊中心維護的服務例項不那麼準確。所以,在本地進行開發的時候,可以使用eureka.server.enable-self-preservation=false引數來關閉保護機制,以確保註冊中心可以將不可用的例項正確剔除。