Eureka常見(jiàn)問(wèn)題匯總及注意事項(xiàng)
作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專(zhuān)注后端開(kāi)發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂(lè)于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫(kù)、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。
0、前言
在Spring Cloud中,Eureka是接觸和使用最多的組件,也是最重要的一個(gè)組件,在使用過(guò)程中經(jīng)常會(huì)遇到各類(lèi)突發(fā)問(wèn)題,來(lái)的莫名奇妙。現(xiàn)把一些常見(jiàn)問(wèn)題、注意事項(xiàng),與大家進(jìn)行分享。
Eureka一般出現(xiàn)問(wèn)題原因分為兩類(lèi):
Eureka版本不同帶來(lái)的問(wèn)題
Eureka參數(shù)配置問(wèn)題
生產(chǎn)環(huán)境下,Eureka參數(shù)配置建議使用默認(rèn)配置,除非明確清楚或明確有這樣修改默認(rèn)配置的需求。
1、EnableEurekaClient和EnableDiscoveryClient
在不同的應(yīng)用程序中,有人使用EnableEurekaClient,有人使用EnableDiscoveryClient,都能作為Eureka Client的注解。有何區(qū)別呢?
服務(wù)發(fā)現(xiàn)是有多實(shí)現(xiàn)方式,即:多種組件可以作為注冊(cè)中心,eureka,consul,zookeeper,@EnableEurekaClient是在spring-cloud-netflix中,僅僅適合于Eureka注冊(cè)中心。@EnableDiscoveryClient是在spring-cloud-commons中,適合Eureka、Consul、Zookeeper注冊(cè)中心。在使用時(shí)要注意使用依賴(lài)的包,否則會(huì)發(fā)現(xiàn)找不到該注解。
參考:https://stackoverflow.com/questions/31976236/whats-the-difference-between-enableeurekaclient-and-enablediscoveryclient
2、已停止的微服務(wù)不注銷(xiāo)或注銷(xiāo)有延遲
在使用Eureka Client時(shí),可能會(huì)發(fā)現(xiàn)當(dāng)微服務(wù)(Eureka Client)已經(jīng)停止了,而注冊(cè)中心仍然顯示該服務(wù)處于正常狀態(tài),或者過(guò)段時(shí)間才會(huì)注銷(xiāo)。然而,這種情況在實(shí)際應(yīng)用中是大家不太希望看見(jiàn)的,希望一旦服務(wù)發(fā)生異?;蝈礄C(jī),注冊(cè)中心應(yīng)該理解體現(xiàn)出來(lái)。
這是由于Eureka Server注銷(xiāo)無(wú)效節(jié)點(diǎn)周期、自我保護(hù)模式的因素造成的,因此會(huì)出現(xiàn)服務(wù)不注銷(xiāo)或注銷(xiāo)有延遲。解決辦法如下:
Eureka Server
關(guān)閉自我保護(hù)模式,并配置注銷(xiāo)無(wú)效節(jié)點(diǎn)周期時(shí)間間隔。
# 默認(rèn)值為true。設(shè)為false, 關(guān)閉自我保護(hù), 從而保證會(huì)注銷(xiāo)微服務(wù)
eureka.server.enable-self-preservation=false
# 清理間隔(單位毫秒,默認(rèn)是60 * 1000)。根據(jù)需求將時(shí)間間隔設(shè)置短些,例如:設(shè)置1秒,一旦down掉,則會(huì)立即注銷(xiāo)
eureka.server.eviction-interval-timer-in-ms=1000
Eureka自我保護(hù)模式:
主要用于一組客戶(hù)端和Eureka Server之間存在網(wǎng)絡(luò)分區(qū)場(chǎng)景下的保護(hù)。一旦進(jìn)入保護(hù)模式,Eureka Server將會(huì)嘗試保護(hù)其服務(wù)注冊(cè)表中的信息,不再刪除服務(wù)注冊(cè)表中的數(shù)據(jù)(也就是不會(huì)注銷(xiāo)任何微服務(wù))。
參考:https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication
參考:https://github.com/spring-cloud/spring-cloud-netflix/issues/1322
Eureka Client
當(dāng)Client端開(kāi)啟健康檢查時(shí),可以適當(dāng)?shù)陌葱枧渲美m(xù)約更新時(shí)間和到期時(shí)間。這樣做智能在一定程度上緩解注銷(xiāo)延遲的程度,但不能真正解決立即注銷(xiāo),可以在進(jìn)行微服務(wù)(Eureka Client)異?;蜿P(guān)機(jī)時(shí),主動(dòng)調(diào)用Eureka Rest API來(lái)注銷(xiāo)該服務(wù),注銷(xiāo)接口:http://localhost:8761/eureka/apps的DELETE 請(qǐng)求方式。
# 默認(rèn)值為false。設(shè)為true,開(kāi)啟健康檢查(需要spring-boot-starter-actuator 依賴(lài))
eureka.client.healthcheck.enabled=true
# 續(xù)約更新時(shí)間間隔(默認(rèn)是30秒)
eureka.instance.lease-renewal-interval-in-seconds=?
# 續(xù)約到期時(shí)間(默認(rèn)90秒)
eureka.instance.lease-expiration-duration-in-seconds=?
參考:https://stackoverflow.com/questions/39661399/eureka-slow-to-remove-instances
3、Eureka的UNKNOWN 問(wèn)題
注冊(cè)中心(Eureka Server)中服務(wù)狀態(tài),常見(jiàn)的有UP、DOWN,但有時(shí)會(huì)出現(xiàn)另外一種UNKNOWN狀態(tài),或者UNKNOWN服務(wù)名。
UNKNOWN服務(wù)名
問(wèn)題顯而易見(jiàn),只需在服務(wù)(Eureka Client)配置中配置明確的服務(wù)名即可。配置參數(shù)為spring.application.name 或者 eureka.instance.appname ,如果這兩個(gè)參數(shù)都不配置,則將會(huì)出現(xiàn)UNKNOWN服務(wù)名。溫馨提示:為了程序的可讀性,極力推薦配置明確的服務(wù)名。
UNKNOWN狀態(tài)
服務(wù)為UNKNOWN狀態(tài),是很少見(jiàn)的問(wèn)題。服務(wù)狀態(tài)用于辨別服務(wù)是否可用(可調(diào)用),來(lái)源于對(duì)服務(wù)的健康檢查(需要spring-boot-starter-actuator的依賴(lài))所致。
當(dāng)服務(wù)(Eureka Client)配置參數(shù)eureka.client.healthcheck.enabled=true時(shí),必須要配置在application.yml或application.properties配置文件中,而不能配置在bootstrap.yml或bootstrap.properties中,否則在一些情況下可能會(huì)出現(xiàn)UNKNOWN狀態(tài)的問(wèn)題。
參考:https://github.com/spring-cloud/spring-cloud-netflix/issues/1276