開始吧
現象:
簡單理解:EurekaServer不會將EurekaClient服務及時剔除
解釋:默認情況下,如果Eureka在一定時間內沒有收到某個微服務實例的心跳,EurekaServer將會注銷該實例(默認90秒)。但是當網絡分區發生故障(延時,卡頓,擁擠)
作用:如果EurekaClient可以正常運行,但是與Eureka網絡不通情況下,EurekaServer不會立刻將EurekaClient服務剔除。
概述
保護模式主要用於一組客戶端和Eureka Server之間存在網絡分區場景下的保護。一旦進入保護模式,Eureka Server將會嘗試保護其服務注冊表中的信息,不再刪除服務注冊表中的數據,也就是不會注銷任何微服務。
為什么會產生Eureka自我保護機制
為了防止EurekaClient可以正常運行,但是與Eureka網絡不通情況下,EurekaServer不會立刻將EurekaClient服務剔除。
什么是自我保護模式
默認情況下,如果EurekaServer在一定時間內沒有接受到某個微服務實例的心跳,EurekaServer將會注銷該實例(默認90秒)。但是當網絡分區故障發生(延時、卡頓、擁擠)時,微服務與EurekaServer之間無法正常通信,以上行為可能變得非常危險--因為微服務本身其實是健康的,此時本不應該注銷這個微服務。Eureka通過“自我保護模式”來解決這個問題--當EurekaServer節點在短時間內丟失過多客戶端時(可能發生了網絡分區故障),那么這個節點就會進入自我保護模式。
自我保護機制
默認情況下EurekaClient定時向EurekaServer端發送心跳包
如果Eureka在server端在一定時間內(默認90秒)沒有收到EurekaClient發送心跳包,便會直接從服務注冊列表中剔除該服務,但是在短時間(90秒中)內丟失了大量的服務實例心跳,這時候EurekaServer會開啟自我保護機制,不會剔除該服務(該現象可能出現在如果網絡不通,但是EurekaClient未出現宕機,此時如果換做別的注冊中心如果一定時間內沒有收到心跳會將剔除該服務,這樣就出現了嚴重失誤,因為客戶端還能正常發送心跳,只是網絡延遲問題,而保護機制是為了解決此問題而產生的)
禁止自我保護設置(默認是開啟)
代碼實現
1、 Eureka服務器端添加配置信息
eureka:
instance:
hostname: eureka7001.com # eureka 服務器的實例名稱
client:
# false 代表不向服務注冊中心注冊自己,因為它本身就是服務中心
register-with-eureka: false
# false 代表自己就是服務注冊中心,自己的作用就是維護服務實例,並不需要去檢索服務
fetch-registry: false
service-url:
# 設置與 Eureka Server 交互的地址,查詢服務 和 注冊服務都依賴這個地址
defaultZone: http://eureka7001.com:7001/eureka/ #Eureka單機
# defaultZone: http://eureka7002.com:7002/eureka/ # Eureka集群
server:
# 關閉自我保護機制,保證不可用服務及時剔除
enable-self-preservation: false
# 設置剔除間隔毫秒:2秒內微服務沒有心跳就剔除,默認是90s的
eviction-interval-timer-in-ms: 2000
2、 Eureka客戶端添加配置信息
eureka:
client:
# 注冊進 Eureka 的服務中心
register-with-eureka: true
# 檢索 服務中心 的其它服務
fetch-registry: true
service-url:
# 設置與 Eureka Server 交互的地址
defaultZone: http://localhost:7001/eureka/ # 單機版
# defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/ # 集群版
instance:
# 修改在Eureka 注冊中心顯示的 主機名
instance-id: payment8001
# 顯示微服務所在的主機地址
prefer-ip-address: true
# Eureka客戶端向服務端發送心跳時間的間隔,單位為秒(默認是30秒)
lease-renewal-interval-in-seconds: 1
# Eureka服務端在收到最后一次心跳后等待時間的一個上限,單位為秒(默認是90秒),超市將剔除服務
lease-expiration-duration-in-seconds: 2