Spring Cloud :Eureka生產(chǎn)環(huán)境優(yōu)化

先看張圖

image.png

一,自我保護(hù)優(yōu)化

自我保護(hù)常用配置

eureka:
  server:
    # 自我保護(hù)開關(guān),默認(rèn)開啟
    enable-self-preservation: true
    # 自我保護(hù)閾值,默認(rèn)0.85
    renewal-percent-threshold: 0.85
    # 自我保護(hù)剔除時(shí)間間隔,單位毫秒,默認(rèn)60s
    eviction-interval-timer-in-ms: 60000
    # 客戶端續(xù)約時(shí)間間隔,默認(rèn)30s
    expected-client-renewal-interval-seconds: 30
    # 閾值更新的時(shí)間間隔,單位為毫秒,默認(rèn)為15 * 60 * 1000
    renewal-threshold-update-interval-ms: 900000
場(chǎng)景 服務(wù)數(shù) 失去心跳 剔除后的閾值 默認(rèn)閾值 要開自我保護(hù)嗎?
場(chǎng)景一 10個(gè)/比較少 3個(gè) 70% 85% 不開啟
場(chǎng)景二 1000個(gè)/比較大 3個(gè) 99.7% 85% 開啟

由于服務(wù)數(shù)本來(lái)就只有10個(gè),如果因?yàn)?個(gè)斷了,如果開啟了自我保護(hù)機(jī)制,大量請(qǐng)求可能就會(huì)訪問壞的三個(gè)服務(wù),這樣肯定是不行的,所以要關(guān)閉,相當(dāng)于斷了,就要將其剔除;雖然關(guān)閉了自我保護(hù)機(jī)制,也會(huì)有剔除服務(wù)時(shí)間間隔,來(lái)保障服務(wù)重連的情況,可以將eviction-interval-timer-in-ms參數(shù)設(shè)置短一點(diǎn),以免讓客戶端放問斷開的服務(wù),該參數(shù)默認(rèn)是60s,相當(dāng)于快速下線。

場(chǎng)景二:

服務(wù)數(shù)比較大,斷了3個(gè)也問題不大,所以建議開啟保護(hù)機(jī)制,如果3個(gè)失去心跳的服務(wù)是由于網(wǎng)絡(luò)抖動(dòng)導(dǎo)致的,開啟之后還給了他們復(fù)活重連的機(jī)會(huì)。

二,三級(jí)緩存優(yōu)化

什么是三級(jí)緩存
Eureka Server 存在三個(gè)變量:registry、readWriteCacheMap、readOnlyCacheMap 保存服務(wù)注冊(cè)信息。

public abstract class AbstractInstanceRegistry implements InstanceRegistry {
    // 三級(jí)
    private final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>> registry
            = new ConcurrentHashMap<String, Map<String, Lease<InstanceInfo>>>();
}
public class ResponseCacheImpl implements ResponseCache {
    
    // 二級(jí)
    private final ConcurrentMap<Key, Value> readOnlyCacheMap = new ConcurrentHashMap<Key, Value>();
    // 一級(jí)
    private final LoadingCache<Key, Value> readWriteCacheMap;
}

三級(jí)緩存工作流程
默認(rèn)情況下定時(shí)任務(wù)每 30s 將 readWriteCacheMap 同步至 readOnlyCacheMap,每 60s 清理超過 90s 未續(xù)約的節(jié)點(diǎn),Eureka Client 每 30s 從 readOnlyCacheMap 拉取服務(wù)注冊(cè)信息,而服務(wù)的注冊(cè)則在 registry 更新信息。

三級(jí)緩存的優(yōu)點(diǎn)
盡可能保證了內(nèi)存注冊(cè)表中的數(shù)據(jù)不會(huì)出現(xiàn)頻繁的讀寫沖突問題,并且進(jìn)一步保證了對(duì)EurekaServer大量請(qǐng)求,都是快速?gòu)膬?nèi)存中取,性能極高。

生產(chǎn)環(huán)境中優(yōu)化
由于我們?nèi)~@取服務(wù)時(shí),默認(rèn)從readOnlyCacheMap中讀取,由于readWriteCacheMap每隔30s才同步到readOnlyCacheMap,數(shù)據(jù)不是強(qiáng)一致性的,所以這是Eureka只實(shí)現(xiàn)了AP,沒有實(shí)現(xiàn)C的原因。

CAP:

1.Consistency(一致性):等同于所有節(jié)點(diǎn)訪問同一份最新的數(shù)據(jù)副本。
2.Availability(可用性):每次請(qǐng)求都能獲取到正確的響應(yīng),但是不保證獲取的數(shù)據(jù)為最新的數(shù)據(jù)。
3.Partition tolerance(分區(qū)兼容性):以實(shí)際效果而言,分區(qū)相當(dāng)于對(duì)通信的時(shí)限要求,系統(tǒng)如果不能在時(shí)限內(nèi)達(dá)成數(shù)據(jù)一致性,就意味著發(fā)生了分區(qū)的情況,必須就當(dāng)前操作在C和A之間作出選擇。
優(yōu)化:

eureka:
  server:
    # 關(guān)閉從readOnly讀注冊(cè)表,直接去readWriteCacheMap中讀
    use-read-only-response-cache: false
    # readWrite 和 readOnly 減少同步時(shí)間間隔。
    response-cache-update-interval-ms: 1000

use-read-only-response-cache默認(rèn)這個(gè)參數(shù)是true,去readOnlyCacheMap中讀,設(shè)置成false之后去readWriteCache中讀,這樣會(huì)快一點(diǎn)。

三,定時(shí)器Timer優(yōu)化
Eureka源碼用了大量的Timer定時(shí)任務(wù),由于Timer定時(shí)器存在以下缺陷:

Timer缺陷:
1.Timer在執(zhí)行所有定時(shí)任務(wù)時(shí)只會(huì)創(chuàng)建一個(gè)線程,當(dāng)存在多個(gè)任務(wù)時(shí),其任務(wù)是串行執(zhí)行的。
2.由于Timer只會(huì)創(chuàng)建一個(gè)線程,那么在TimerTask拋出了一個(gè)未檢出的異常,那么Timer線程就會(huì)被終止掉,導(dǎo)致其它任務(wù)都停止。
3.Timer執(zhí)行周期任務(wù)時(shí)依賴系統(tǒng)時(shí)間,如果當(dāng)前系統(tǒng)時(shí)間發(fā)生變化會(huì)出現(xiàn)一些執(zhí)行上的變化。
建議使用ScheduledExecutorService

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容