常見問題
為什么服務下線了,Eureka Server 接口返回的信息還會存在。
為什么服務上線了,Eureka Client 不能及時獲取到。
為什么有時候會出現如下提示:
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 並不是強一致的,因此 registry 中會存留過期的實例信息,這里頭有幾個原因:
應用實例異常掛掉,沒能在掛掉之前告知 Eureka Server 要下線掉該服務實例信息。這個就需要依賴 Eureka Server 的 EvictionTask 去剔除。
應用實例下線時有告知 Eureka Server 下線,但是由於 Eureka Server 的 REST API 有 response cache,因此需要等待緩存過期才能更新。
Eureka Server 由於開啟並引入了 SELF PRESERVATION 模式,導致 registry 的信息不會因為過期而被剔除掉,直到退出 SELF PRESERVATION 模式。
針對 Client 下線沒有通知 Eureka Server 的問題,可以調整 EvictionTask 的調度頻率,比如下面配置將調度間隔從默認的 60 秒,調整為 5 秒:


安全驗證
我們啟動了Eureka Server,然后在瀏覽器中輸入http://localhost:8761/后,直接回車,就進入了spring cloud的服務治理頁面,這么做在生產環境是極不安全的,下面,我們就給Eureka Server加上安全的用戶認證.
(1)pom文件中引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
(2)serviceurl中加入安全校驗信息
eureka.client.serviceUrl.defaultZone=http://<username>:<password>@${eureka.instance.hostname}:${server.port}/eureka/
