SpringCloud(二):Eureka服務註冊與發現

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模型圖

  • 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>();
  • 註冊新服務
  1. 將實例註冊信息放入或者更新registry
  2. 將實例註冊信息加入最近修改的記錄隊列
  3. 主動讓Response緩存失效
  • 服務取消
  1. 從registry中剔除這個實例
  2. 將實例註冊信息加入最近修改的記錄隊列
  3. 主動讓Response緩存失效

自我保護機制

# 關閉自我保護機制(默認是打開的-true)
eureka.server.enable-self-preservation=false

自我保護機制:默認情況下,如果Eureka Server在一定時間內沒有接收到某個微服務實例的心跳,Eureka Server將會註銷該實例(默認90秒)。但是當網絡分區故障發生時,微服務與Eureka Server之間無法正常通信,以上行爲可能變得非常危險了——因爲微服務本身其實是健康的,此時本不應該註銷這個微服務。

Eureka通過“自我保護模式”來解決這個問題——當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網絡分區故障),那麼這個節點就會進入自我保護模式。一旦進入該模式**,Eureka Server就會保護服務註冊表中的信息,不再刪除服務註冊表中的數據(也就是不會註銷任何微服務)**。當網絡故障恢復後,該Eureka Server節點會自動退出自我保護模式。

在這裏插入圖片描述

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