失效剔除
有些時(shí)候,我們的服務(wù)實(shí)例并不一定會(huì)正常下線,可能由于內(nèi)存溢出、網(wǎng)絡(luò)故障氣因使得服務(wù)不能正常工作,而服務(wù)注冊(cè)中心并未收到“服務(wù)下線”的請(qǐng)求。為了從服務(wù)表中將這些無法提供服務(wù)的實(shí)例剔除,Eureka Server 在啟動(dòng)的時(shí)候會(huì)創(chuàng)建一個(gè)定時(shí)任多默認(rèn)每隔一一段時(shí)間(默認(rèn)為60秒)將當(dāng)前清單中超時(shí)(默認(rèn)為90秒)沒有續(xù)約的服務(wù)除出去-
自我保護(hù)
當(dāng)我們?cè)诒镜卣{(diào)試基于Eureka的程序時(shí),基本上都會(huì)碰到這樣-一個(gè)問題, 在服務(wù)主中心的信息面板中出現(xiàn)類似下面的紅色警告信息EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY 'RERENENALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIREDTO BE SAFE.
實(shí)際上,該警告就是觸發(fā)了Eureka Server的自我保護(hù)機(jī)制。之前我們介紹過,服務(wù)注冊(cè)到Eureka Server之后,會(huì)維護(hù)個(gè)心跳連接, 告訴Eureka Server自己還活 著。Eureka Server在運(yùn)行期間,會(huì)統(tǒng)計(jì)心跳失敗的比例在15分鐘之內(nèi)是否低于85%如果出現(xiàn)低于的情況單機(jī)調(diào)試的時(shí)候很容易滿足,實(shí)際在生產(chǎn)環(huán)境上通常是由于網(wǎng)絡(luò)不穩(wěn)定導(dǎo)致),EuServer會(huì)將當(dāng)前的實(shí)例注冊(cè)信息保護(hù)起來,讓這些實(shí)例不會(huì)過期,盡可能保護(hù)這些注冊(cè)信-息。但是,在這段保護(hù)期間內(nèi)實(shí)例若出現(xiàn)問題,那么客戶端很容易拿到實(shí)際已經(jīng)不存服務(wù)實(shí)例,會(huì)出現(xiàn)調(diào)用失敗的情況,所以客戶端必須要有容錯(cuò)機(jī)制,比如可以使用請(qǐng)使用重試、斷路器等機(jī)制。
由于本地調(diào)試很容易觸發(fā)注冊(cè)中心的保護(hù)機(jī)制,這會(huì)使得注冊(cè)中心維護(hù)的服務(wù)實(shí)仍那么準(zhǔn)確。所以,我們?cè)诒镜剡M(jìn)行開發(fā)的時(shí)候,可以使用eureka . server . enablself preservation=false參數(shù)來關(guān)閉保護(hù)機(jī)制,以確保注冊(cè)中心可以將不可用的例正確剔除。
- 關(guān)閉服務(wù)保護(hù)
服務(wù)端配置
###服務(wù)端口號(hào)
server:
port: 8100
##定義服務(wù)名稱
spring:
application:
name: app-itmayiedu-eureka
eureka:
instance:
###注冊(cè)中心ip地址
hostname: 127.0.0.1
client:
serviceUrl:
##注冊(cè)地址
defaultZone: http://${eureka.instance.hostname}:8100/eureka/
####因?yàn)樽约菏亲?cè)中心,是否需要將自己注冊(cè)給自己的注冊(cè)中心(集群的時(shí)候是需要是為true)
register-with-eureka: false
###因?yàn)樽约菏亲?cè)中心, 不需要去檢索服務(wù)信息
fetch-registry: false
###保護(hù)關(guān)閉配置。本地開發(fā)建議關(guān)閉
server:
# 測試時(shí)關(guān)閉自我保護(hù)機(jī)制,保證不可用服務(wù)及時(shí)踢出
enable-self-preservation: false
eviction-interval-timer-in-ms: 2000
客戶端配置
###訂單服務(wù)的端口號(hào)
server:
port: 8001
###服務(wù)別名----服務(wù)注冊(cè)到注冊(cè)中心名稱
spring:
application:
name: app-itmayiedu-order
eureka:
client:
service-url:
##### 當(dāng)前會(huì)員服務(wù)注冊(cè)到eureka服務(wù)地址
defaultZone: http://localhost:8100/eureka
### 需要將我的服務(wù)注冊(cè)到eureka上
register-with-eureka: true
####需要檢索服務(wù)
fetch-registry: true
registry-fetch-interval-seconds: 30
# 心跳檢測檢測與續(xù)約時(shí)間
# 測試時(shí)將值設(shè)置設(shè)置小些,保證服務(wù)關(guān)閉后注冊(cè)中心能及時(shí)踢出服務(wù)
instance:
###Eureka客戶端向服務(wù)端發(fā)送心跳的時(shí)間間隔,單位為秒(客戶端告訴服務(wù)端自己會(huì)按照該規(guī)則)
lease-renewal-interval-in-seconds: 1
####Eureka服務(wù)端在收到最后一次心跳之后等待的時(shí)間上限,單位為秒,超過則剔除(客戶端告訴服務(wù)端按照此規(guī)則等待自己)
lease-expiration-duration-in-seconds: 2