一、Eureka自我保護機制概述
Eureka是基於Netflix開源的一個服務發現框架,用於服務的註冊和發現。在一個分散式系統中,服務註冊中心是一個至關重要的角色,因為所有的服務都需要與註冊中心進行交互。如果服務註冊中心出現故障或者網路異常,將會導致整個分散式系統的不可用。Eureka自我保護機制是為了解決這個問題而設計的。
Eureka客戶端會定期向服務端發送消息,確認自己的運行狀況。服務端在一個指定時間內如果沒有接收到客戶端消息,就會將該客戶端從註冊表中剔除。但有時候客戶端和服務端之間出現了網路異常,導致客戶端不能及時與服務端進行通信。如果此時服務端將客戶端從註冊表中剔除,就會導致客戶端不能正常提供服務,整個系統也會出現不可用的情況。Eureka自我保護機制就是為了解決這個問題而設計的。
Eureka自我保護機制的原理是,當服務端在一個服務失效檢查周期內(默認為90秒)內連續出現超過15分鐘(默認為3個周期)的註冊失敗(即沒有收到客戶端的心跳),則會進入自我保護狀態,不再剔除註冊表中未能及時續約的服務,以保證已註冊的服務可以繼續使用。
二、Eureka自我保護機制優缺點
1. 優點
1)保證了不可用的服務實例不會被刪除,降低了服務實例丟失率,保證了可用性。
2)自我保護機制讓客戶端維護者有足夠的時間來解決長時間的服務宕機問題,降低了當出現網路異常或者大量客戶端宕機時整個系統的不可用性。
2. 缺點
1)自我保護機制讓不健康的服務實例繼續存在,雖然可以保證可用性,但可能會降低整體的系統性能。
2)當機器宕機或者網路異常等情況時,該機器不能被及時剔除出註冊表,而需要等待超時時間的到來,這樣用戶不能及時發現系統的問題,而且即使等到了超時時間也只是將機器標記為不可用,後續需要再次發起請求才能將機器剔除,這依然會導致延遲問題。
三、Eureka自我保護機制配置
在Spring Cloud項目中,如果需要啟用Eureka自我保護機制,則需要在客戶端配置文件application.properties中添加如下配置:
# 配置Eureka客戶端向服務端發送心跳的時間間隔,默認30s eureka.client.heartbeatInterval=10 # Eureka服務端在這個時間內沒有收到客戶端的心跳,則視客戶端為下線了,默認90s eureka.server.evictionIntervalTimerInMs=60000 # Eureka服務端在這個時間內最少收到的心跳數量,超出時被視為Eureka存活 eureka.server.renewalPercentThreshold=0.85 # 配置Eureka開啟自我保護,默認為true eureka.server.enable-self-preservation=true # Eureka開啟自我保護的最少剩餘數量,當註冊表中實例低於這個值時,Eureka將開啟自我保護機制,默認為0 eureka.server.min-available-instances=1
四、Eureka自我保護機制代碼實現
下面是一個簡單的Spring Boot工程,演示了Eureka自我保護機制的配置過程。pom.xml文件中包含了Spring Cloud和Eureka相關依賴,application.properties文件中配置了Eureka自我保護機制的相關參數。
// pom.xml文件 <dependencies> <!-- Spring Cloud --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR10</version> <type>pom</type> <scope>import</scope> </dependency> <!-- Eureka Dashboard --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- Eureka Client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> // application.properties文件 # Eureka Server Configuration spring.application.name=eureka-server server.port=8761 eureka.client.register-with-eureka=false eureka.client.fetch-registry=false # 開啟Eureka自我保護機制 eureka.server.enable-self-preservation=true eureka.server.eviction-interval-timer-in-ms=60000 eureka.server.renewal-percent-threshold=0.85 eureka.server.min-available-instances=1
啟動Spring Boot工程後,訪問http://localhost:8761/可以看到Eureka的控制台。在註冊兩個服務提供者後,關閉其中一個服務提供者的應用程序,可以發現服務提供者的狀態為DOWN,並且Eureka的控制台中該服務提供者的狀態為UP。
這是因為Eureka自我保護機制將DOWN的實例保護起來,不會立即將其從註冊表中刪除。如果關閉自我保護,則DOWN的實例會立即從註冊表中刪除。
五、總結
本文從Eureka自我保護機制的概述、優缺點、配置和代碼實現四個方面,對Eureka自我保護機制進行了詳細的闡述。雖然自我保護機制可以保證整個系統的可用性,但也有一定的缺點,需要根據實際場景進行選擇配置。在實際項目中,建議配置一個相對較小的超時時間,避免DEAD INSTANCE長時間佔據註冊表,對整個系統的性能和可用性造成不良影響。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/198206.html