技術分享——Spring Cloud Eureka 原理淺析

寫在前面:2020年面試必備的Java後端進階面試題總結了一份複習指南在Github上,內容詳細,圖文並茂,有需要學習的朋友可以Star一下!
GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master

作用:服務治理(服務註冊與發現)
兩個概念:
服務註冊:每個服務單元向註冊中心登記自己提供的服務,註冊的信息含括主機與端口號、版本號、通信協議等。服務中心會維護一個服務清單,同時使用心跳的方式檢測清單中的服務是否可用,若不可用則需要從服務清單中剔除,以達到排除故障服務的效果。

服務發現:微服務下的服務治理框架下,服務之間的相互調用不再通過具體的實例地址進行直接調用,而是通過向服務名發起請求調用實現。一般的邏輯是這樣的,A想調用B,但是A剛開始不知道B在哪,所以A向服務中心發起請求獲取B的實例地址,服務中心將所有的B實例地址給到A,A調用B的時候會從服務中心返回的B實例列表中通過某種輪詢策略獲取一個位置來進行服務調用,從而也就是實現了客戶端負載。這裏的解釋只是一個思路,實際上A不會每次都去服務中心查取B地址的,並且不同的應用場景下在緩存和服務剔除機制上也會有一些不同的實現策略

Eureka的服務治理機制
在這裏插入圖片描述
Eureka服務治理基礎架構下的三個核心要素
服務註冊中心
服務提供者
服務消費者
很多時候,客戶端既是服務提供者又是服務消費者

服務提供者
服務註冊
服務提供者在啓動的時候通過發送REST請求的方式將自己註冊到EurecaServer上,同時帶上自身元數據信息。 Eureca Server接收到這個REST請求之後,將元數據的信息儲存在一個雙層結構的Map中,第一層map的key爲服務名,第二層的key爲具體服務的實例名。

服務續約(Renew)
註冊完服務之後,服務提供者會維持一個心跳告訴Eureca Server :“我是一個活着的健康實例”,從而防止Eureca Server的“剔除任務”從服務列表中排除該實例。 eureka.instance.lease-renewal-interval-in-seconds:心跳任務的調用時間,默認三十秒 eureka.instance.lease-expiration-duration0in-seconds:服務時效時間,默認九十秒

服務消費者
獲取服務
服務消費者啓動的時候會發送一個REST請求給註冊中心,獲取已註冊的服務清單。 爲了性能考慮,EurecaServer會維護一份只讀的服務清單來返回給 客戶端,同時該緩存清單會隔三十秒刷新一次。 eureka.client.fetch-registry:獲取服務,默認爲true eureka.client.registry-fetch-interval-seconds:緩存清單的更新時間,默認三十秒

調用服務
消費者獲取清單之後,就可以獲得服務者的實例名和元數據信息。 Ribbon默認使用輪詢的方式調用,從而實現客戶端負載均衡

下線服務
服務實例進行正常的關閉操作時,會觸發一個服務下線的REST請求給Eureca Server,註冊中心將該服務狀態設置爲下線(DOWN),並且把下線事件傳播出去。

服務註冊中心
服務同步
同一個服務的兩個實例如果註冊到不同的服務中心實例上,由於服務註冊中心之間互相註冊爲服務,所以服務中心之間會互相轉發註冊請求服務給集羣中的其他服務註冊中心,從而實現服務註冊中心之間的服務同步。

失效剔除
sometime,服務實例會因爲內存溢出、網絡故障等不正常下線了。但是服務註冊中心並沒有收到“服務下線”的請求。那麼爲了解決這個問題,Eureca Server 在啓動的時候會創建一個定時任務,默認每隔六十秒將當前清單中超時(默認九十秒)沒有續約的服務剔除出去。

自我保護
EurekaServer會統計心跳失敗的比例在15分鐘之內是否低於85%,如果出現低於的情況,EurekaServer會將這些實例保護起來,讓其不過期,但是這樣會讓客戶端拿到已經掛掉的服務實例,這就要求客戶端必須要有容錯機制(請求重試、斷路器等) eureka.server.enable-self-preservation=false : 關閉保護機制

Q&A
Eureka Server 如何實現高可用?
機制:將自己作爲註冊中心向其他服務註冊中心註冊自己,這樣就可以形成一組互相註冊的服務註冊中心。
實現:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章