高并發(fā)場(chǎng)景下,Spring Cloud Gateway如何抗住百萬(wàn)并發(fā)?
異步非阻塞模型:百萬(wàn)并發(fā)的基石
Spring Cloud Gateway 之所以能夠應(yīng)對(duì)高并發(fā),其核心就在于其完全的非阻塞式架構(gòu)。
它徹底摒棄了傳統(tǒng) Servlet 容器中,“一個(gè)請(qǐng)求一個(gè)線程”的阻塞模型。
轉(zhuǎn)而擁抱事件驅(qū)動(dòng)和響應(yīng)式編程,從而極大地提升了系統(tǒng)的并發(fā)處理能力和資源利用率。
在傳統(tǒng)的阻塞 I/O 模型中,當(dāng)服務(wù)器接收到一個(gè)連接后,會(huì)為這個(gè)連接創(chuàng)建一個(gè)獨(dú)立的線程。
圖片
比如:從網(wǎng)絡(luò)讀取數(shù)據(jù)或?qū)懭霐?shù)據(jù)到網(wǎng)絡(luò)時(shí),如果數(shù)據(jù)尚未準(zhǔn)備好,該線程就會(huì)被阻塞,直到 I/O 操作完成。
這意味著,如果有大量的并發(fā)連接,就需要?jiǎng)?chuàng)建大量的線程。
每個(gè)阻塞的線程都會(huì)消耗寶貴的系統(tǒng)資源(內(nèi)存、CPU 時(shí)間片),導(dǎo)致上下文切換頻繁,最終限制了并發(fā)能力。
而Spring Cloud Gateway采用了基于Reactor響應(yīng)式編程模型的非阻塞I/O架構(gòu),底層使用高性能的Netty服務(wù)器。
實(shí)現(xiàn)了,少量線程即可處理大量并發(fā)請(qǐng)求,避免線程阻塞和頻繁切換。
Reactor異步機(jī)制
Spring Cloud Gateway采用Reactor庫(kù),實(shí)現(xiàn)異步非阻塞處理,核心是事件驅(qū)動(dòng)、和回調(diào)機(jī)制。
Spring Cloud Gateway的核心,是基于Project Reactor的異步機(jī)制。
圖片
Reactor通常與Netty結(jié)合使用,Netty負(fù)責(zé)底層非阻塞網(wǎng)絡(luò)I/O,基于Java NIO的Selector實(shí)現(xiàn)多路復(fù)用。
Reactor框架在Netty事件循環(huán)中調(diào)度異步任務(wù),實(shí)現(xiàn)請(qǐng)求的非阻塞處理、和響應(yīng)。
這種組合使得單個(gè)、或少量線程,即可高效管理成千上萬(wàn)的網(wǎng)絡(luò)連接。
限流(Rate Limiting)
在高并發(fā)場(chǎng)景下,僅僅依靠異步非阻塞、和響應(yīng)式編程是不夠的。
還需要引入強(qiáng)大的服務(wù)保護(hù)機(jī)制,來(lái)防止系統(tǒng)過(guò)載、和雪崩效應(yīng)。
比如:限流是指限制在一定時(shí)間內(nèi)對(duì)服務(wù)的訪問(wèn)頻率,在高并發(fā)場(chǎng)景下,它可以防止瞬時(shí)流量過(guò)大導(dǎo)致服務(wù)崩潰。
Spring Cloud Gateway通常通過(guò)集成外部限流組件(如Redis RateLimiter、Resilience4j、或Sentinel...等等),來(lái)實(shí)現(xiàn)限流。
比如:可以使用令牌桶/漏桶算法,來(lái)實(shí)現(xiàn)限流。
圖片
令牌桶算法以恒定速率生成令牌,請(qǐng)求需要獲取令牌才能通過(guò);
漏桶算法則以恒定速率處理請(qǐng)求,超出的請(qǐng)求會(huì)被丟棄或排隊(duì)。
熔斷(Circuit Breaking)
熔斷機(jī)制:類(lèi)似于電路中的熔斷器。
當(dāng)對(duì)某個(gè)下游服務(wù)的請(qǐng)求失敗率或響應(yīng)時(shí)間超過(guò)預(yù)設(shè)閾值時(shí),網(wǎng)關(guān)會(huì)“熔斷”對(duì)該服務(wù)的調(diào)用。
后續(xù)的請(qǐng)求將不再發(fā)送給該服務(wù),而是直接返回錯(cuò)誤或執(zhí)行降級(jí)邏輯。
可以 防止因單個(gè)故障服務(wù)導(dǎo)致整個(gè)系統(tǒng)雪崩。
當(dāng)服務(wù)暫時(shí)不可用時(shí),快速失敗可以避免請(qǐng)求堆積,保護(hù)系統(tǒng)資源。
Spring Cloud Gateway通常與Resilience4j或Hystrix(雖然Hystrix已進(jìn)入維護(hù)模式,但仍有項(xiàng)目使用)集成。
圖片
熔斷狀態(tài): 熔斷器有三種狀態(tài):
關(guān)閉(CLOSED): 正常請(qǐng)求;
開(kāi)啟(OPEN): 觸發(fā)熔斷,請(qǐng)求直接失敗;
半開(kāi)(HALF_OPEN): 經(jīng)過(guò)一段時(shí)間后,嘗試發(fā)送少量請(qǐng)求以檢測(cè)服務(wù)是否恢復(fù)。
降級(jí)(Degradation)
降級(jí)是指當(dāng)系統(tǒng)壓力過(guò)大或某些服務(wù)不可用時(shí),犧牲部分非核心功能或返回默認(rèn)值,以保證核心功能的可用性。
與熔斷的關(guān)系,降級(jí)通常發(fā)生在熔斷之后。
當(dāng)熔斷器開(kāi)啟時(shí),可以配置一個(gè)降級(jí)方法作為備用方案。

































