由於Eureka擁有自我保護機制,當其注冊表里服務因為網絡或其他原因出現故障而關停時,Eureka不會剔除服務注冊,而是等待其修復。這是AP的一種實現。
自我保護機制:Eureka Server在運行期間,會統計心跳失敗的比例在15分鍾之內是否低於85%,如果出現低於的情況(在單機調試的時候很容易滿足,實際在生產環境上通常是由於網絡不穩定導致),Eureka Server會將當前的實例注冊信息保護起來(該服務一直存在,且為UP狀態),同時提示這個警告: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.
但是在開發過程中,我們常常希望Eureka Server能夠迅速有效地踢出已關停的節點。
常用方法有:
一、關閉自我保護
server端:
eureka.server.enable-self-preservation//(設為false,關閉自我保護主要)
eureka.server.eviction-interval-timer-in-ms//清理間隔(單位毫秒,默認是60*1000)
client端:
eureka.client.healthcheck.enabled = true//開啟健康檢查(需要spring-boot-starter-actuator依賴)
eureka.instance.lease-renewal-interval-in-seconds =10//租期更新時間間隔(默認30秒)
eureka.instance.lease-expiration-duration-in-seconds =30//租期到期時間(默認90秒)
二、利用Eureka的rest管理端點下線服務
eureka界面注冊的服務:
發送DELETE的Restfull請求
注意:由於cloud服務是心跳檢測,所有在eureka進行DELETE后要快速的停止服務,否則服務可能會被重新注冊上。
三、利用Spring Boot Actuato的管理端點(推薦)
1、pom中引用Actuato
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
2、properties中添加如下內容
#啟用shutdown endpoints.shutdown.enabled=true #禁用密碼驗證 endpoints.shutdown.sensitive=false
如果只允許本機訪問,可以添加如下屬性
#(只允許本機訪問)
server.address=localhost
3、在服務器上利用curl發送shutdown命令
curl -X POST http://localhost:8295/shutdown 或者 curl -d "" http://localhost:8295/shutdown