1. 程式人生 > 其它 >springcloud-05Eureka08-Eureka自我保護

springcloud-05Eureka08-Eureka自我保護

概述
某時刻某一個微服務不可用了,Eureka不會立刻清理,依舊會對該微服務的資訊進行儲存

保護模式主要用於一組客戶端和Eureka Server之間存在網路分割槽場景下的保護。一旦進入保護模式,
Eureka Server將會嘗試保護其服務登錄檔中的資訊,不再刪除服務登錄檔中的資料,也就是不會登出任何微服務。

如果在Eureka Server的首頁看到以下這段提示,則說明Eureka進入了保護模式:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.
RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE

一、原因

為什麼會產生Eureka自我保護機制?

為了防止EurekaClient可以正常執行,但是 與 EurekaServer網路不通情況下,EurekaServer不會立刻將EurekaClient服務剔除

什麼是自我保護模式?

預設情況下,如果EurekaServer在一定時間內沒有接收到某個微服務例項的心跳,EurekaServer將會登出該例項(預設90秒)。但是當網路分割槽故障發生(延時、卡頓、擁擠)時,微服務與EurekaServer之間無法正常通訊,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該登出這個微服務。Eureka通過“自我保護模式”來解決這個問題——當EurekaServer節點在短時間內丟失過多客戶端時(可能發生了網路分割槽故障),那麼這個節點就會進入自我保護模式。

  • 在自我保護模式中,Eureka Server會保護服務登錄檔中的資訊,不再登出任何服務例項。
  • 它的設計哲學就是寧可保留錯誤的服務註冊資訊,也不盲目登出任何可能健康的服務例項。

綜上,自我保護模式是一種應對網路異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留)也不盲目登出任何健康的微服務。使用自我保護模式,可以讓Eureka叢集更加的健壯、穩定。

二、怎麼禁止自我保護

2.1 註冊中心eureakeServer端7001

  1. 預設開啟:eureka.server.enable-self-preservation=true

  2. 修改eureka7001的yml

server:
  port: 7001


eureka:
  instance:
    hostname: eureka7001.com #eureka服務端的例項名稱
  client:
    register-with-eureka: false     #false表示不向註冊中心註冊自己。
    fetch-registry: false     #false表示自己端就是註冊中心,我的職責就是維護服務例項,並不需要去檢索服務
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/

  server:
    #關閉自我保護機制,保證不可用服務被及時踢除
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 2000
  1. 效果

2.2 生產者客戶端eureakeClient端8001

  1. 預設
eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90
server:
  port: 8001

###服務名稱(服務註冊到eureka名稱)
spring:
    application:
        name: cloud-provider-payment

eureka:
  client: #服務提供者provider註冊進eureka服務列表內
    service-url:
      register-with-eureka: true
      fetch-registry: true
      # cluster version
      #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
      # singleton version
      defaultZone: http://eureka7001.com:7001/eureka
#心跳檢測與續約時間
#開發時設定小些,保證服務關閉後註冊中心能即使剔除服務
  instance:
  #Eureka客戶端向服務端傳送心跳的時間間隔,單位為秒(預設是30秒)
    lease-renewal-interval-in-seconds: 1
  #Eureka服務端在收到最後一次心跳後等待時間上限,單位為秒(預設是90秒),超時將剔除服務
    lease-expiration-duration-in-seconds: 2

測試

  • 關閉payment8001
  • payment8001馬上刪除