基本原理
上圖是來自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加入幾個地址