Eureka服務註冊中心
前言
因爲Eureka2.x在2018年停更,所以一般情況下繼續研究Eureka的意義不大,由於道人本公司現在還有部分項目在使用Eureka,所以道人寫下一些總結比較淺顯的一些知識,應對平時項目開發。服務註冊方面作爲其替代品zookeeper,道友們可以去道人zookeeper專欄中去看看。
本篇博文純理論,關於Eureka在項目中如何使用,會在下篇文章中詳細介紹。
Eureka的作用
在SpringCloud中,其實就可以簡單的理解爲服務註冊中心。
至於服務註冊中心,你也可以理解爲,服務應用(Provider)去統一地點(Eureka)註冊,消費該服務的應用可以在該地點(Eureka)獲取相關信息,從而基於RPC框架,調用該服務應用。
舉個簡單栗子
租房爲例
- 房東(Provider)去中介(Eureka)將自己的房子出租併發布租房信息,這一過程就可以理解爲服務註冊。
- 然後租客(Consumer)需要某一類型的房子,然後他找到中介(Eureka),看有沒有符合要求的房子出租,這一過程就是獲取註冊信息(get Registry)。
- 找到符合要求的房子信息,就通過中介(Eureka)獲取的信息,來找到房東(Provider),達成交易,這一過程就是RPC框架遠程調用(remote call)。
這裏肯定有道友問了,爲什麼不直接找房東(Provider)?
其實在微服務興起之前的確是直接找房東的(Provider)。但是微服務興起後,房東太多了(服務太多),根本不知道該調用哪個服務,服務信息、管理都面對很大問題,因此Eureka應運而生,幹起服務註冊中心的活(道友也可以理解爲中介)。
Eureka的原理
- Eureka Client:註冊中心客戶端
Eureka Client 是一個 Java 客戶端,用於簡化與 Eureka Server 的交互。Eureka Client 會拉取、更新和緩存 Eureka Server 中的信息。因此當所有的 Eureka Server 節點都宕掉,服務消費者依然可以使用緩存中的信息找到服務提供者,但是當服務有更改的時候會出現信息不一致。
- Register: 服務註冊
服務的提供者,將自身註冊到註冊中心,服務提供者也是一個 Eureka Client。當 Eureka Client向Eureka Server註冊時,它提供自身的元數據,比如IP 地址、端口,運行狀況指示符 URL,主頁等。
- Renew: 服務續約
Eureka Client 會每隔30秒發送一次心跳來續約。 通過續約來告知Eureka Server該Eureka Client 運行正常,沒有出現問題。 默認情況下,如果Eureka Server 在 90 秒內沒有收到Eureka Client 的續約,Server 端會將實例從其註冊表中刪除,此時間可配置,一般情況不建議更改。
服務註冊取消的大致流程
這裏不詳細解釋,只敘述大致過程,不涉及源碼部分(原因是Eureka停更)。
兩個存儲,一個是整體註冊信息的存儲registry,一個是最近變化隊列recentlyChangedQueue。
# 整體註冊信息緩存
private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry = new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();
# 最近變化隊列
private ConcurrentLinkedQueue<RecentlyChangedItem> recentlyChangedQueue = new ConcurrentLinkedQueue<RecentlyChangedItem>();
- 註冊新服務
- 將實例註冊信息放入或者更新registry
- 將實例註冊信息加入最近修改的記錄隊列
- 主動讓Response緩存失效
- 服務取消
- 從registry中剔除這個實例
- 將實例註冊信息加入最近修改的記錄隊列
- 主動讓Response緩存失效
自我保護機制
# 關閉自我保護機制(默認是打開的-true)
eureka.server.enable-self-preservation=false
自我保護機制:默認情況下,如果Eureka Server在一定時間內沒有接收到某個微服務實例的心跳,Eureka Server將會註銷該實例(默認90秒)。但是當網絡分區故障發生時,微服務與Eureka Server之間無法正常通信,以上行爲可能變得非常危險了——因爲微服務本身其實是健康的,此時本不應該註銷這個微服務。
Eureka通過“自我保護模式”來解決這個問題——當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網絡分區故障),那麼這個節點就會進入自我保護模式。一旦進入該模式**,Eureka Server就會保護服務註冊表中的信息,不再刪除服務註冊表中的數據(也就是不會註銷任何微服務)**。當網絡故障恢復後,該Eureka Server節點會自動退出自我保護模式。