勤勞的搬運工--SpringCloud--Eureka叢集
基本原理
上圖是來自eureka的官方架構圖,這是基於叢集配置的eureka;
- 處於不同節點的eureka通過Replicate進行資料同步
- Application Service為服務提供者
- Application Client為服務消費者
- Make Remote Call完成一次服務呼叫
服務啟動後向Eureka註冊,Eureka Server會將註冊資訊向其他Eureka Server進行同步,當服務消費者要呼叫服務提供者,則向服務註冊中心獲取服務提供者地址,然後會將服務提供者地址快取在本地,下次再呼叫時,則直接從本地快取中取,完成一次呼叫。
當服務註冊中心Eureka Server檢測到服務提供者因為宕機、網路原因不可用時,則在服務註冊中心將服務置為DOWN
狀態,並把當前服務提供者狀態向訂閱者釋出,訂閱過的服務消費者更新本地快取。
服務提供者在啟動後,週期性(預設30秒)向Eureka Server傳送心跳,以證明當前服務是可用狀態。Eureka Server在一定的時間(預設90秒)未收到客戶端的心跳,則認為服務宕機,登出該例項。
Eureka的自我保護機制
在預設配置中,Eureka Server在預設90s沒有得到客戶端的心跳,則登出該例項,但是往往因為微服務跨程序呼叫,網路通訊往往會面臨著各種問題,比如微服務狀態正常,但是因為網路分割槽故障時,Eureka Server登出服務例項則會讓大部分微服務不可用,這很危險,因為服務明明沒有問題。
為了解決這個問題,Eureka 有自我保護機制,通過在Eureka Server配置如下引數,可啟動保護機制
eureka.server.enable-self-preservation=true
- 1
它的原理是,當Eureka Server節點在短時間內丟失過多的客戶端時(可能傳送了網路故障),那麼這個節點將進入自我保護模式,不再登出任何微服務,當網路故障回覆後,該節點會自動退出自我保護模式。
自我保護模式的架構哲學是寧可放過一個,決不可錯殺一千
Eureka Server高可用叢集
理論上來講,因為服務消費者本地快取了服務提供者的地址,即使Eureka Server宕機,也不會影響服務之間的呼叫,但是一旦新服務上線,已經在快取在本地的服務提供者不可用了,服務消費者也無法知道,所以保證Eureka Server的高可用還是很有必要的。
在分散式系統中,任何的地方存在單點,整個體系就不是高可用的,Eureka 也一樣,在上面的架構圖中Eureka Server不是以單點存在的,而是以叢集的方式對外提供服務。
這節我們說說如何將Eureka Server進行叢集配置(在本地搭建一個偽叢集)。
本地示例程式碼:discovery-cluster
- 配置系統的hosts(linux作業系統)
127.0.0.1 discovery1 discovery2
- 1
- 配置檔案application.yml
spring:
application:
name: discovery-cluster
---
spring:
profiles: discovery1
server:
port: 8761
eureka:
instance:
hostname: discovery1
client:
service-url:
default-zone: http://discovery2:8762/eureka
---
spring:
profiles: discovery2
server:
port: 8762
eureka:
instance:
hostname: discovery2
client:
service-url:
default-zone: http://discovery1:8761/eureka
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
配置檔案是通過兩個Eureka Server互相註冊,這裡有三段配置,第一段配置為公共配置,配置了應用名稱,第二段為名discovery1
的配置,第三段為discovery2
的配置。在專案啟動可以通過 --spring.profiles.active={配置名稱}
來啟動不同的配置。
- 測試
1)在discovery-cluster目錄下,使用mvn package打包專案
2)使用下面命令啟動兩個Eureka Server節點java -jar discovery-cluster-0.0.1-SNAPSHOT.jar --spring.profiles.active=discovery1
java -jar discovery-cluster-0.0.1-SNAPSHOT.jar --spring.profiles.active=discovery2
3)在瀏覽器上分別輸入http://discovery1:8761和http://discovery2:8762檢視註冊的服務。
- 客戶端修改
客戶端要把自己註冊到叢集中,只需在default-zone配置兩個地址即可
eureka:
client:
service-url:
default-zone:http://discovery1:8761/eureka,http://discovery2:8762/eureka
- 1
- 2
- 3
- 4
非Java服務註冊到Eureak Server
作為服務註冊中心,應該是語言無關的,使用其他語言的服務也可以通過呼叫Eureka Server的Rest API 註冊服務,這裡不詳細展開
原文出自 https://blog.csdn.net/jrn1012/article/details/77837671
總結:
需要在客戶端配置檔案中修改default-zone欄位,有幾個Eureka註冊中心就需要default-zone加入幾個地址