Spring Cloud Eureka自我保護機制(服務無法剔除)


說明

自我保護背景

首先對Eureka注冊中心需要了解的是Eureka各個節點都是平等的,沒有ZK中角色的概念, 即使N-1個節點掛掉也不會影響其他節點的正常運行。

默認情況下,如果Eureka Server在一定時間內(默認90秒)沒有接收到某個微服務實例的心跳,Eureka Server將會移除該實例。但是當網絡分區故障發生時,微服務與Eureka Server之間無法正常通信,而微服務本身是正常運行的,此時不應該移除這個微服務,所以引入了自我保護機制。

自我保護機制

官方對於自我保護機制的定義:

https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication

自我保護模式正是一種針對網絡異常波動的安全保護措施,使用自我保護模式能使Eureka集群更加的健壯、穩定的運行。

問題

自我保護機制的工作機制是如果在15分鍾內超過85%的客戶端節點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現了網絡故障,Eureka Server自動進入自我保護機制,此時會出現以下幾種情況:

1、Eureka Server不再從注冊列表中移除因為長時間沒收到心跳而應該過期的服務。

2、Eureka Server仍然能夠接受新服務的注冊和查詢請求,但是不會被同步到其它節點上,保證當前節點依然可用。

3、當網絡穩定時,當前Eureka Server新的注冊信息會被同步到其它節點中。

因此Eureka Server可以很好的應對因網絡故障導致部分節點失聯的情況,而不會像ZK那樣如果有一半不可用的情況會導致整個集群不可用而變成癱瘓。

例如:我們在使用Eureka的時候,如果服務提供者我們沒有讓它正確退出的話(正確測試退出使用IDEA可以點擊左下角的Exit而不是Stop),Eureka控制面板是可以看到提供者依然還在運行(實際已經Down,但顯示Up),這導致了我們在訪問該服務時會出現錯誤

解決方案

1)關閉自我保護開關

Eureka自我保護機制,通過配置 eureka.server.enable-self-preservation來true打開/false禁用自我保護機制,默認打開狀態,建議生產環境打開此配置。

服務端配置:

eureka:
  server:
    # 測試時關閉自我保護機制,保證不可用服務及時踢出
    enable-self-preservation: false

客戶端配置:

# 心跳檢測檢測與續約時間
# 測試時將值設置設置小些,保證服務關閉后注冊中心能及時踢出服務
eureka:
  instance:
    lease-renewal-interval-in-seconds: 1
    lease-expiration-duration-in-seconds: 2

以上配置說明

lease-renewal-interval-in-seconds 每間隔1s,向服務端發送一次心跳,證明自己依然”存活“。

lease-expiration-duration-in-seconds  告訴服務端,如果我2s之內沒有給你發心跳,就代表我“死”了,將我踢出掉。

2)快速切換請求或斷路器

使用負載均衡的方式,設置當一個請求超過多少秒之后,切換請求下一個注冊服務,例如使用Ribbon+Hystrix配置實現負載均衡和斷路器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM