1. 回顧
前面講了很多Eureka的用法,比如Eureka Server、Eureka Server的高可用、Eureka Server的用戶認證(雖然未完全實現)、元數據等,
這章將講解剩下的自我保護模式、IP選擇、健康檢查等。(REST端點暫時用的不多,暫不講解了)
2. Eureka的自我保護模式
如果首頁出現這個警告,就表明已經進入自我保護模式
默認情況下,如果Eureka Server在一定時間內沒有接受到某個微服務實例的心跳,Eureka Server將會注銷該實例(默認90秒)。
但是當網絡分區故障發生時,微服務與Eureka Server之間無法正常通行,以上行為就可能變得非常危險了——因為微服務本身其實是健康的,
此時本不應該注銷這個微服務。
Eureka通過“自我保護模式”來解決這個問題——當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網絡分區故障),
那么這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務注冊表中的信息,不再刪除服務注冊表中的數據
(也就是不會注銷任何微服務)。當網絡故障恢復后,該Eureka Server節點會自動退出自我保護模式。
綜上,自我保護模式是一種應對網絡異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),
也不忙住注銷任何健康的微服務。使用自我保護模式,可以讓Eureka集群更加的健壯、穩定。
在Spring Cloud中,可以使用eureka.server.enable-self-preservation = fase禁用自我保護模式。
eureka:
server:
enable-self-preservation: false
3. 多網卡環境下的IP選擇
指定IP在某些場景下特別有用。例如某台服務器有eht0、eth1、eth2三塊網卡,但是只有eth1可以被其他服務器訪問;
如果Eureka Server將eth0或eth2注冊到Eureka Server上,其他微服務就無法通過這個IP調用這個微服務的接口。
> 忽略指定名稱的網卡
spring:
cloud:
inetutils:
ignored-interfaces: # 忽略docker0網卡以及所有以veth開頭的網卡
- docker0
- veth.*
eureka:
instance:
prefer-ip-address: true
> 使用正則表達式,指定使用的網絡地址
spring:
cloud:
inetutils:
preferred-networks:
- 192.168
- 10.0
eureka:
instance:
prefer-ip-address: true
> 只使用站點本地地址
spring:
cloud:
inetutils:
use-only-site-local-interfaces: true # 強制使用站點本地地址
eureka:
instance:
prefer-ip-address: true
> 手動指定IP地址:在某些極端場景下,可以手動指定注冊到Eureka Server的微服務IP。
eureka:
instance:
prefer-ip-address: true
ip-address: 127.0.0.1
4. Eureka的健康檢查
有圖可見,在Status一欄有個UP,表示應用程序狀態正常。應用狀態還有其他取值:DOWN、OUT_OF_SERVICE、UNKONWN等。只有標記為“UP”的微服務會被請求。
前面講過,Eureka Server和Eureka Client通過心跳機制確定Eureka Client的狀態。
默認情況下,服務器端與客戶端的心跳保持正常,應用程序就會始終保持“UP”狀態,但是該機制並不能完全反應應用程序的狀態。
比如:微服務與Eureka Server的心跳正常,但是該微服務的數據源發生了問題(比如網絡抖動,連不上數據源),根本無法正常工作。
前面說過,Spring Boot Actuator提供了/actuator/health端點,展示應用程序的健康信息。那么如果將該端點的健康狀態傳播到Eureka Server中,會使得狀態更加准確。
要實現這一點,只須啟動Eureka的健康檢查即可。這樣應用程序就會降自己的健康狀態傳播到Eureka Sever。
只須為微服務的application.yml中配置一下內容即可。
eureka:
client:
healthcheck:
enabled: true
某些場景下,可能希望更細粒度地控制健康檢查,此時可實現 com.netflix.appinfo.HealthCheckHandler接口。
5. 總結
至此,Eureka的相關內容已經講解完畢。
后面將開始講解Ribbon實現客戶端側負載均衡相關內容。敬請期待~~~
6. 參考
周立 --- 《Spring Cloud與Docker微服務架構與實戰》