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