Spring Cloud 框架 -- Eureka 集群的搭建、工作細節及集群原理


1、Eureka 集群的搭建

使用了注冊中心后,所有的服務都要通過服務注冊中心來進行信息交換。服務注冊中心的穩定性就非常重要了,一旦服務注冊中心調線,會影響整個系統的穩定性。所以在實際開發中,Eureka 一般是以集群的形式出現的。

Eureka 集群,實際上就是啟動多個 Eureka 實例,多個 Eureka 實例之間,互相注冊,互相同步數據,共同組成一個 Eureka 集群。

搭建 Eureka 集群,首先需要修改電腦的 hosts 文件(C:\Windows\System32\drivers\etc)

在 hosts 文件末尾添加一句:

127.0.0.1 eurekaA eurekaB

如下圖:

保存即可。

在上節文章 Eureka 的搭建的基礎上,再在 resources 目錄下添加兩個配置文件,分別是 application-a.properties 和 application-b.properties

其中,application-a.properties 的內容如下:

# 為當前服務指定一個名字
spring.application.name = eureka
# 設置端口號
server.port = 1111
# 給服務起個別名
eureka.instance.hostname=eurekaA
# 默認情況下,Eureka Server 也是一個微服務,所以當它還是一個注冊中心的時候,它會有兩層身份:1.注冊中心,2.普通微服務,
# 即它會自己把自己注冊到注冊中心
# register-with-eureka 設置為 false ,表示當前項目不要注冊到注冊中心。
eureka.client.register-with-eureka = true
# 表示是否從 Eureka Server 上獲取注冊信息
eureka.client.fetch-registry=true
# 將服務 A 注冊到 B 上
eureka.client.service-url.defaultZone = http://eurekaB:1112/eureka

application-b.properties 的內容如下:

# 為當前服務指定一個名字
spring.application.name = eureka
# 設置端口號
server.port = 1112
eureka.instance.hostname=eurekaB
# 默認情況下,Eureka Server 也是一個微服務,所以當它還是一個注冊中心的時候,它會有兩層身份:1.注冊中心,2.普通微服務,
# 即它會自己把自己注冊到注冊中心
# register-with-eureka 設置為 false ,表示當前項目不要注冊到注冊中心。
eureka.client.register-with-eureka = true
# 表示是否從 Eureka Server 上獲取注冊表信息
eureka.client.fetch-registry=true
# 將 B 注冊到 A 上
eureka.client.service-url.defaultZone = http://eurekaA:1111/eureka

配置完成后,對當前項目進行打包,打包成 jar 文件,具體操作參考文章:使用 IDEA 將 Spring Boot 項目打包成 jar 包,並運行該 jar 包

打包完成后,在命令行啟動兩個 Eureka 實例。兩個啟動命令如下:

java -jar eureka-0.0.1-SNAPSHOP.jar --spring.profiles.active = a
java -jar eureka-0.0.1-SNAPSHOP.jar --spring.profiles.active = b

啟動成功后,打開瀏覽器,分別輸入 http://localhost:1111http://localhost:1112

如下圖:

這是 EurekaA

這是 EurekaA

這是 EurekaB

這是 EurekaB

2、Eureka 的工作細節

Eureka 本身可以分為兩大部分,Eureka Server 和 Eureka Client。

2.1 Eureka Server

Eureka Server 主要對外提供了三個功能:

  • 服務注冊:所有的服務都注冊到 Eureka Server 上面來。

  • 提供注冊表:注冊表是所有注冊上來的服務的列表,Eureka Client 在調用服務時,需要獲取這個注冊表,一般來說,這個注冊表會被緩存下來,如果緩存失效,則直接獲取最新的注冊表。

  • 同步狀態:Eureka Client 通過注冊、心跳等機制,和 Eureka Server 同步當前客戶端的狀態。

2.2 Eureka Client

Eureka Client 主要用來簡化每個服務和 Eureka Server 的交互。 Eureka Client 會自動拉取、更新以及緩存 Eureka Server 中的信息,這樣,即使 Eureka Server 所有節點都宕機,Eureka Client 依然能夠獲取到想要調用服務的地址(地址可能不准確)

2.2.1 服務注冊

服務提供者將自己注冊到注冊中心(Eureka Server),需要注意,所謂的服務提供者,只是一個業務上的分類,本質上它就是一個 Eureka Client 。當 Eureka Client 向 Eureka Server 注冊時,它需要提供一些自身的元數據信息,如 IP 地址、端口、名稱、運行狀態等。

2.2.2 服務續約

Eureka Client 注冊到 Eureka Server 上之后,事情沒有結束,剛剛開始而已。注冊成功后,默認情況下,Eureka Client 每隔 30 秒就要向 Eureka Server 發行一條心跳信息,告訴 Eureka Server 我還在運行。

如果 Eureka Server 連續 90 秒都沒有收到 Eureka Client 的續約消息(連續 3 次都沒發送),它會認為 Eureka Client 已經掉線了,會將掉線的 Eureka Client 從當前的服務注冊表中剔除。

服務續約,有兩個相關屬性(一般不做修改):

# eureka.instance.lease-renewal-interval-in-seconds 表示服務續約時間
eureka.instance.lease-renewal-interval-in-seconds = 30  
# eureka.instance.lease-expiration-duration-in-seconds 表示服務時效時間
eureka.instance.lease-expiration-duration-in-seconds = 90

2.2.3 服務下線

當 Eureka Client 下線時,它會主動發送一條信息,告訴 Eureka Server ,我下線了。

2.2.4 獲取注冊表信息

Eureka Client 從 Eureka Server 上獲取服務的注冊信息,並將其緩存到本地。本地客戶端,在需要調用遠程服務時,會從該信息中查找遠程服務所對應的的 IP 地址、端口等信息。Eureka Client 上緩存的服務注冊信息會定期更新(30 秒),如果 Eureka Server 返回的注冊表信息與本地緩存的注冊表信息不同的話,Eureka Client 會自動處理。

這里,也涉及兩個屬性,一個是是否允許獲取注冊表信息:

eureka.client.fetch-registry = true

Eureka Client 上緩存的服務注冊信息,定期更新的時間間隔,默認為 30 秒

eureka.client.registry-fetch-interval-seconds = 30

3、Eureka 集群原理

下圖是官方的 Eureka 集群架構圖

在這個集群架構中,Eureka Server 之間通過 Replicate 進行數據同步,不同的 Eureka Server 之間不區分主從節點,所有節點都是平等的。節點之間,通過置頂 serviceUrl 來相互注冊,形成一個集群,進而提高節點的可用性。

在 Eureka Server 集群中,如果某個節點宕機,Eureka Client 會自動切換到新的 Eureka Server 上。每個 Eureka Server 節點,都會互相同步數據。

Eureka Server 的連接方式,可以是單線的,就是 A->B->c,此時,A 的數據也會和 C 之間相互同步。但是一般不建議這么寫(假如 B 宕機,則 A 和 C 也斷開聯系了)。在我們配置 serviceUrl 時,可以指定多個注冊地址,即 A 可以注冊到 B 上,也可以同時注冊到 C 上。

Eureka 分區:

  • region:地理上的不同區域

  • zone:具體的機房

同一個分區內的 Eureka Server 和 Eureka Client 會優先進行心跳同步。

參考資源:

1、Eureka 官方文檔

2、江南一點雨 SpringCloud 視頻教程

每天學習一點點,每天進步一點點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM