您好,登錄后才能下訂單哦!
1.解決Eureka注冊(cè)服務(wù)慢的問題
(1)調(diào)整客戶端心跳時(shí)間
?instance:
? ? # 心跳時(shí)間,即服務(wù)續(xù)約間隔時(shí)間(缺省為30s)
? ? lease-renewal-interval-in-seconds: 5
? ? # 發(fā)呆時(shí)間,即服務(wù)續(xù)約到期時(shí)間(缺省為90s)
? ? lease-expiration-duration-in-seconds: 10
eureka.instance.lease-expiration-duration-in-seconds
leaseExpirationDurationInSeconds,表示eureka server至上一次收到client的心跳之后,等待下一次心跳的超時(shí)時(shí)間,在這個(gè)時(shí)間內(nèi)若沒收到下一次心跳,則將移除該instance。
默認(rèn)為90秒
如果該值太大,則很可能將流量轉(zhuǎn)發(fā)過去的時(shí)候,該instance已經(jīng)不存活了。
如果該值設(shè)置太小了,則instance則很可能因?yàn)榕R時(shí)的網(wǎng)絡(luò)抖動(dòng)而被摘除掉。
該值至少應(yīng)該大于leaseRenewalIntervalInSeconds
eureka.instance.lease-renewal-interval-in-seconds
leaseRenewalIntervalInSeconds,表示eureka client發(fā)送心跳給server端的頻率。如果在leaseExpirationDurationInSeconds后,server端沒有收到client的心跳,則將摘除該instance。除此之外,如果該instance實(shí)現(xiàn)了HealthCheckCallback,并決定讓自己unavailable的話,則該instance也不會(huì)接收到流量。
默認(rèn)30秒
作為實(shí)例還涉及到與注冊(cè)中心的周期性心跳,默認(rèn)持續(xù)時(shí)間為30秒(通過serviceUrl)。在實(shí)例、服務(wù)器、客戶端都在本地緩存中具有相同的元數(shù)據(jù)之前,服務(wù)不可用于客戶端發(fā)現(xiàn)(所以可能需要3次心跳)。你可以使用eureka.instance.leaseRenewalIntervalInSeconds 配置,這將加快客戶端連接到其他服務(wù)的過程。在生產(chǎn)中,最好堅(jiān)持使用默認(rèn)值,因?yàn)樵诜?wù)器內(nèi)部有一些計(jì)算,他們對(duì)續(xù)約做出假設(shè)。
(2) Eureka的自我保護(hù)模式
?
如果在Eureka Server的首頁(yè)看到以下這段提示,則說明Eureka已經(jīng)進(jìn)入了保護(hù)模式。
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.
配置
?server:
? #開啟Eureka的自我保護(hù)機(jī)制
? ? enable-self-preservation: true
? ? #清理無效節(jié)點(diǎn)的時(shí)間間隔
? ? eviction-interval-timer-in-ms: 5000? ?
eureka.server.enable-self-preservation
是否開啟自我保護(hù)模式,默認(rèn)為true。
默認(rèn)情況下,如果Eureka Server在一定時(shí)間內(nèi)沒有接收到某個(gè)微服務(wù)實(shí)例的心跳,Eureka Server將會(huì)注銷該實(shí)例(默認(rèn)90秒)。但是當(dāng)網(wǎng)絡(luò)分區(qū)故障發(fā)生時(shí),微服務(wù)與Eureka Server之間無法正常通信,以上行為可能變得非常危險(xiǎn)了——因?yàn)槲⒎?wù)本身其實(shí)是健康的,此時(shí)本不應(yīng)該注銷這個(gè)微服務(wù)。
Eureka通過“自我保護(hù)模式”來解決這個(gè)問題——當(dāng)Eureka Server節(jié)點(diǎn)在短時(shí)間內(nèi)丟失過多客戶端時(shí)(可能發(fā)生了網(wǎng)絡(luò)分區(qū)故障),那么這個(gè)節(jié)點(diǎn)就會(huì)進(jìn)入自我保護(hù)模式。一旦進(jìn)入該模式,Eureka Server就會(huì)保護(hù)服務(wù)注冊(cè)表中的信息,不再刪除服務(wù)注冊(cè)表中的數(shù)據(jù)(也就是不會(huì)注銷任何微服務(wù))。當(dāng)網(wǎng)絡(luò)故障恢復(fù)后,該Eureka Server節(jié)點(diǎn)會(huì)自動(dòng)退出自我保護(hù)模式。
綜上,自我保護(hù)模式是一種應(yīng)對(duì)網(wǎng)絡(luò)異常的安全保護(hù)措施。它的架構(gòu)哲學(xué)是寧可同時(shí)保留所有微服務(wù)(健康的微服務(wù)和不健康的微服務(wù)都會(huì)保留),也不盲目注銷任何健康的微服務(wù)。使用自我保護(hù)模式,可以讓Eureka集群更加的健壯、穩(wěn)定。
eureka.server.eviction-interval-timer-in-ms
eureka server清理無效節(jié)點(diǎn)的時(shí)間間隔,默認(rèn)60000毫秒,即60秒
?
(3)如何解決Eureka Server不踢出已關(guān)停的節(jié)點(diǎn)的問題
在開發(fā)過程中,我們常常希望Eureka Server能夠迅速有效地踢出已關(guān)停的節(jié)點(diǎn),但是新手由于Eureka自我保護(hù)模式,以及心跳周期長(zhǎng)的原因,常常會(huì)遇到Eureka Server不踢出已關(guān)停的節(jié)點(diǎn)的問題。解決方法如下:
(1) Eureka Server端:配置關(guān)閉自我保護(hù),并按需配置Eureka Server清理無效節(jié)點(diǎn)的時(shí)間間隔。
eureka.server.enable-self-preservation # 設(shè)為false,關(guān)閉自我保護(hù)
eureka.server.eviction-interval-timer-in-ms # 清理間隔(單位毫秒,默認(rèn)是60*1000)
(2) Eureka Client端:配置開啟健康檢查,并按需配置續(xù)約更新時(shí)間和到期時(shí)間。
eureka.client.healthcheck.enabled # 開啟健康檢查(需要spring-boot-starter-actuator依賴)
eureka.instance.lease-renewal-interval-in-seconds # 續(xù)約更新時(shí)間間隔(默認(rèn)30秒)
eureka.instance.lease-expiration-duration-in-seconds # 續(xù)約到期時(shí)間(默認(rèn)90秒)
(4)zuul間隔多久去拉取注冊(cè)服務(wù)的信息
eureka.client.registry-fetch-interval-seconds
表示eureka client間隔多久去拉取服務(wù)注冊(cè)信息,默認(rèn)為30秒,對(duì)于api-gateway,如果要迅速獲取服務(wù)注冊(cè)狀態(tài),可以縮小該值,比如5秒
(5)ribbon的饑餓加載
意為Spring Cloud為每個(gè)Ribbon客戶端維護(hù)了一個(gè)相對(duì)的子應(yīng)用環(huán)境的上下文,應(yīng)用的上下文在第一次請(qǐng)求到指定客戶端的時(shí)候懶加載。不過可以通過如下配置進(jìn)行修改
ribbon:?
? eager-load:
? ? enabled: true
? ? clients:?
? ? -? callback,service-cache,service-singlepoint
?
按照如上的配置之后,發(fā)現(xiàn)鑒權(quán)服務(wù)啟動(dòng)時(shí)就將user服務(wù)的Ribbon客戶端進(jìn)行了加載。
(6)zuul的饑餓加載
上面小節(jié)解決了auth-Service調(diào)用user-Service的Ribbon客戶端啟動(dòng)時(shí)饑餓加載。網(wǎng)關(guān)作為對(duì)外請(qǐng)求的入口,zuul內(nèi)部使用Ribbon調(diào)用其他服務(wù),Spring Cloud默認(rèn)在第一次調(diào)用時(shí)懶加載Ribbon客戶端。zuul同樣需要維護(hù)一個(gè)相對(duì)的子應(yīng)用環(huán)境的上下文,所以也需要啟動(dòng)時(shí)饑餓加載。
zuul:
? ribbon:?
? ? eager-load:
? ? ? enabled: true?
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。