1. 程式人生 > 其它 >Eureka的自我保護機制與如何禁用

Eureka的自我保護機制與如何禁用

場景

SpringCloud中整合Eureka實現服務註冊(單機Eureka構建):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124688609

在上面進行服務註冊時,在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.

注:

部落格:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程式猿
獲取程式設計相關電子書、教程推送與免費下載。

實現

1、Eureka的自我保護

保護模式主要用於一組客戶端和Eureka Server之間存在網路分割槽場景下的保護。一旦進入保護模式

Eureka Server將會嘗試保護其服務登錄檔中的資訊,不再刪除服務登錄檔中的資料,也就是不會登出任何微服務。

如果看到如上的提示,就是進入了保護模式。

2、導致原因

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

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

3、什麼是自我保護模式

預設情況下,如果EurekaServer在一定時間內沒有收到某個微服務例項的心跳,Eureka Server將會登出該例項(預設90秒)。

但是當網路故障發生(延時、卡頓、擁擠)時,微服務與Eureka Server之間無法正常通訊,以上行為就變得非常危險,因為

微服務本身其實是健康的,此時不應該登出這個微服務。Eureka通過“自我保護模式”來解決這個問題,當Eureka Server

節點在短時間內丟失過多客戶端時(可能發生了網路分割槽故障),那麼這個節點就會進入自我保護模式。

在自我保護模式中,Eureka Server 會保護服務登錄檔中的資訊,不再登出任何服務例項。

它的設計哲學就是並可保留錯誤的服務註冊資訊,也不可能盲目登出任何可能健康的服務例項。

4、禁用自我保護機制

首先在Eureka Server的服務端的配置檔案中進行關閉

將eureka.server.enable-self-preservation設定為false,並調小時間間隔為2秒

完整配置檔案

server:
  port: 7001


eureka:
  instance:
    hostname: eureka7001.com #eureka服務端的例項名稱
  client:
    register-with-eureka: false     #false表示不向註冊中心註冊自己。
    fetch-registry: false     #false表示自己端就是註冊中心,我的職責就是維護服務例項,並不需要去檢索服務
    service-url:
      #叢集指向其它eureka
      #defaultZone: http://eureka7002.com:7002/eureka/
      #單機指向自己
      defaultZone: http://eureka7001.com:7001/eureka/
  server:
    #關閉自我保護機制,保證不可用服務被及時踢除
    enable-self-preservation: false
    eviction-interval-timer-in-ms: 2000

然後修改Eureka Client的配置檔案

將Eureka客戶端向服務端傳送心跳的時間間隔(預設是30秒)修改為1秒。

lease-renewal-interval-in-seconds

將Eureka服務端在收到最後一次心跳後等待時間上限(預設是90秒)超時將剔除服務時間修改為2秒。

lease-expiration-duration-in-seconds

完整配置檔案

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service

  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 當前資料來源操作型別
    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驅動包
    url: jdbc:mysql://localhost:3306/springclouddemo?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456

eureka:
  client:
    #表示是否將自己註冊進EurekaServer預設為true。
    register-with-eureka: true
    #是否從EurekaServer抓取已有的註冊資訊,預設為true。單節點無所謂,叢集必須設定為true才能配合ribbon使用負載均衡
    fetchRegistry: true
    service-url:
      #單機版
      defaultZone: http://localhost:7001/eureka
      #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka

  instance:
    instance-id: payment8001
    #訪問路徑可以顯示IP地址
    prefer-ip-address: true
    #Eureka客戶端向服務端傳送心跳的時間間隔,單位為秒(預設是30秒)
    lease-renewal-interval-in-seconds: 1
    #Eureka服務端在收到最後一次心跳後等待時間上限,單位為秒(預設是90秒),超時將剔除服務
    lease-expiration-duration-in-seconds: 2

mybatis:
  mapperLocations: classpath:mapper/*.xml
  type-aliases-package: com.badao.springclouddemo.entities    # 所有Entity別名類所在包

5、修改之後可以看到Eureka中明顯的提示