Eureka常見問題匯總及注意事項

作者:xcbeyond
瘋狂源自夢想,技術成就輝煌!微信公眾號:《程序猿技術大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗,樂于技術輸出、分享,現(xiàn)階段從事微服務架構項目的研發(fā)工作,涉及架構設計、技術選型、業(yè)務研發(fā)等工作。對于Java、微服務、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗。

0、前言      
      在Spring Cloud中,Eureka是接觸和使用最多的組件,也是最重要的一個組件,在使用過程中經(jīng)常會遇到各類突發(fā)問題,來的莫名奇妙?,F(xiàn)把一些常見問題、注意事項,與大家進行分享。

     Eureka一般出現(xiàn)問題原因分為兩類:

Eureka版本不同帶來的問題
Eureka參數(shù)配置問題
生產(chǎn)環(huán)境下,Eureka參數(shù)配置建議使用默認配置,除非明確清楚或明確有這樣修改默認配置的需求。

1、EnableEurekaClient和EnableDiscoveryClient
      在不同的應用程序中,有人使用EnableEurekaClient,有人使用EnableDiscoveryClient,都能作為Eureka Client的注解。有何區(qū)別呢?

     服務發(fā)現(xiàn)是有多實現(xiàn)方式,即:多種組件可以作為注冊中心,eureka,consul,zookeeper,@EnableEurekaClient是在spring-cloud-netflix中,僅僅適合于Eureka注冊中心。@EnableDiscoveryClient是在spring-cloud-commons中,適合Eureka、Consul、Zookeeper注冊中心。在使用時要注意使用依賴的包,否則會發(fā)現(xiàn)找不到該注解。

參考:https://stackoverflow.com/questions/31976236/whats-the-difference-between-enableeurekaclient-and-enablediscoveryclient

2、已停止的微服務不注銷或注銷有延遲
     在使用Eureka Client時,可能會發(fā)現(xiàn)當微服務(Eureka Client)已經(jīng)停止了,而注冊中心仍然顯示該服務處于正常狀態(tài),或者過段時間才會注銷。然而,這種情況在實際應用中是大家不太希望看見的,希望一旦服務發(fā)生異?;蝈礄C,注冊中心應該理解體現(xiàn)出來。

     這是由于Eureka Server注銷無效節(jié)點周期、自我保護模式的因素造成的,因此會出現(xiàn)服務不注銷或注銷有延遲。解決辦法如下:

Eureka Server
關閉自我保護模式,并配置注銷無效節(jié)點周期時間間隔。

# 默認值為true。設為false, 關閉自我保護, 從而保證會注銷微服務
eureka.server.enable-self-preservation=false
 
# 清理間隔(單位毫秒,默認是60 * 1000)。根據(jù)需求將時間間隔設置短些,例如:設置1秒,一旦down掉,則會立即注銷
eureka.server.eviction-interval-timer-in-ms=1000
Eureka自我保護模式:

    主要用于一組客戶端和Eureka Server之間存在網(wǎng)絡分區(qū)場景下的保護。一旦進入保護模式,Eureka Server將會嘗試保護其服務注冊表中的信息,不再刪除服務注冊表中的數(shù)據(jù)(也就是不會注銷任何微服務)。

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

參考:https://github.com/spring-cloud/spring-cloud-netflix/issues/1322

Eureka Client
當Client端開啟健康檢查時,可以適當?shù)陌葱枧渲美m(xù)約更新時間和到期時間。這樣做智能在一定程度上緩解注銷延遲的程度,但不能真正解決立即注銷,可以在進行微服務(Eureka Client)異?;蜿P機時,主動調(diào)用Eureka Rest API來注銷該服務,注銷接口:http://localhost:8761/eureka/apps的DELETE 請求方式。

# 默認值為false。設為true,開啟健康檢查(需要spring-boot-starter-actuator 依賴)
eureka.client.healthcheck.enabled=true
 
# 續(xù)約更新時間間隔(默認是30秒)
eureka.instance.lease-renewal-interval-in-seconds=?
 
# 續(xù)約到期時間(默認90秒)
eureka.instance.lease-expiration-duration-in-seconds=?
參考:https://stackoverflow.com/questions/39661399/eureka-slow-to-remove-instances

3、Eureka的UNKNOWN 問題
      注冊中心(Eureka Server)中服務狀態(tài),常見的有UP、DOWN,但有時會出現(xiàn)另外一種UNKNOWN狀態(tài),或者UNKNOWN服務名。

UNKNOWN服務名
     問題顯而易見,只需在服務(Eureka Client)配置中配置明確的服務名即可。配置參數(shù)為spring.application.name 或者 eureka.instance.appname ,如果這兩個參數(shù)都不配置,則將會出現(xiàn)UNKNOWN服務名。溫馨提示:為了程序的可讀性,極力推薦配置明確的服務名。

UNKNOWN狀態(tài)
    服務為UNKNOWN狀態(tài),是很少見的問題。服務狀態(tài)用于辨別服務是否可用(可調(diào)用),來源于對服務的健康檢查(需要spring-boot-starter-actuator的依賴)所致。

    當服務(Eureka Client)配置參數(shù)eureka.client.healthcheck.enabled=true時,必須要配置在application.yml或application.properties配置文件中,而不能配置在bootstrap.yml或bootstrap.properties中,否則在一些情況下可能會出現(xiàn)UNKNOWN狀態(tài)的問題。

參考:https://github.com/spring-cloud/spring-cloud-netflix/issues/1276