溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Springcloud配置優(yōu)化方案

發(fā)布時(shí)間:2020-07-20 14:18:17 來源:網(wǎng)絡(luò) 閱讀:698 作者:沙漏半杯 欄目:編程語言

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?



向AI問一下細(xì)節(jié)

免責(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)容。

AI