SpringCloud升級之路2020.0.x版-16.Eureka架構和核心概念

乾貨滿滿張雜湊發表於2021-08-20

本系列程式碼地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford

image

Eureka 目前 1.x 版本還在更新,但是應該不會更新新的功能了,只是對現有功能進行維護,升級併相容所需的依賴。 Eureka 2.x 已經胎死腹中了。但是,這也不代表 Eureka 就是不能用了。如果你需要一個簡便易於部署的註冊中心,Eureka 還是一個很好的選擇。雲服務環境中,基本上所有例項地址和微服務名稱都在不斷變化,也並不太需要 Eureka 所缺少的持久化特性。當你的叢集屬於中小規模的時候(節點小於 1000 個), Eureka 依然是一個不錯的選擇。當你的叢集很大的時候,Eureka 的同步機制可能就限制了他的表現。

Eureka 的設計比較小巧,沒有複雜的同步機制(例如 Nacos 基於 Raft,Zookeeper 基於 Zab),也沒有複雜的持久化機制,叢集關係只是簡單的將收到的客戶端請求轉發到叢集內的其他 Eureka 例項。Eureka 本身也只有註冊中心的功能,不像其他種類的註冊中心那樣,將註冊中心和配置中心合在一起,例如 Consul 和 nacos。

image

這裡我們忽略所有的 AWS 相關的術語以及配置還有相關邏輯處理。

Eureka 中的術語:

  1. Eureka 例項:每個註冊到 Eureka 上面的例項就是 Eureka 例項
  2. Eureka 例項狀態:包括 UP(可以處理請求),DOWN(健康檢查失敗,不能正常處理請求),STARTING(啟動中,不能處理請求),OUT_OF_SERVICE(人為下線,暫時不處理請求),UNKNOWN(未知狀態)。
  3. Eureka 伺服器:作為註冊中心執行,主要提供例項管理功能(處理例項註冊(register)請求、處理例項登出(cancel)請求、處理例項心跳(renew)請求、內部處理例項過期(evict))、例項查詢功能(各種查詢例項資訊的介面,例如通過 AppName 獲取例項列表,通過例項 id 獲取例項資訊等等)
  4. Eureka 伺服器叢集:Eureka 伺服器的叢集,每個 Eureka 伺服器都配置了區域以及可用區,Eureka 伺服器收到的客戶端請求會轉發到同一區域內的其他 Eureka 伺服器,可以配置優先發到同一可用區的 Eureka 伺服器。非同一區域內 Eureka 伺服器,通過定時拉取的方式進行同步。
  5. Eureka 客戶端:請求 Eureka 伺服器的客戶端。封裝傳送例項註冊(register)請求、例項登出(cancel)請求和例項心跳(renew)請求。
  6. VIP(或者是 Virtual Hostname): Eureka 中可以通過兩種方式獲取例項,一個是通過服務名稱,另一種是通過 VIP。每個例項都有服務名稱,以及 VIP。Eureka 伺服器中的索引方式是以服務名稱為 key 的索引,我們也可以通過遍歷所有例項資訊的方式通過 VIP 字串匹配獲取相關的例項。在 Spring Cloud 體系中,一個例項的 VIP、SVIP(其實就是 Secure VIP,即 https 的地址)以及服務名稱都是 spring.application.name 指定的服務名稱。

image

image

首先,Service A 通過 Eureka Client 傳送註冊請求(Register)到同一可用區的 Eureka Server 1。之後通過傳送心跳請求(Renew)到這個 Eureka Server 1. Eureka Server 1 收到這些請求的時候,會處理這些請求並將這些請求轉發到其他的叢集內的 Eureka Server 2 和 Eureka Server 3. Eureka Server 2 和 Eureka Server 3 不會再轉發收到的 Eureka Server 1 轉發過來的請求。然後,Service B 還有 Service C 通過 Eureka 獲取到了 Service A 的位置,最後呼叫了 Service A。

對於本地沒有查詢到的微服務,Eureka Server 還會從遠端 Region 的 Eureka Server 去獲取,例如這裡對於 Service D,本地沒有查到,Eureka Server 會返回遠端 Region 的 Service D 的例項。由於本地有 Service A,所以肯定不會返回遠端 Region 的 Service A 的例項。並且,本地是定時拉取的遠端 Region 的 Service 列表,並不是每次查詢的時候現查詢的。

一般的,微服務之間的互相呼叫,並不經過 Eureka,也不會涉及到 Eureka 客戶端了,而是通過負載均衡器呼叫,這個我們後面就會提到。

我們這一節詳細分析了 Eureka 的架構,以及其中的核心概念。下一節,我們將開始介紹我們微服務的註冊中心 Eureka 的例項配置。

微信搜尋“我的程式設計喵”關注公眾號,每日一刷,輕鬆提升技術,斬獲各種offer

相關文章