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中明顯的提示