SpringCloud系列六:Eureka的自我保護模式、IP選擇、健康檢查


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微服務架構與實戰》


免責聲明!

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



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