高并發(fā)場景下,Spring Cloud Gateway如何抗住百萬并發(fā)?
異步非阻塞模型:百萬并發(fā)的基石
Spring Cloud Gateway 之所以能夠應(yīng)對高并發(fā),其核心就在于其完全的非阻塞式架構(gòu)。
它徹底摒棄了傳統(tǒng) Servlet 容器中,“一個(gè)請求一個(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ā)請求,避免線程阻塞和頻繁切換。
Reactor異步機(jī)制
Spring Cloud Gateway采用Reactor庫,實(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)請求的非阻塞處理、和響應(yīng)。
這種組合使得單個(gè)、或少量線程,即可高效管理成千上萬的網(wǎng)絡(luò)連接。
限流(Rate Limiting)
在高并發(fā)場景下,僅僅依靠異步非阻塞、和響應(yīng)式編程是不夠的。
還需要引入強(qiáng)大的服務(wù)保護(hù)機(jī)制,來防止系統(tǒng)過載、和雪崩效應(yīng)。
比如:限流是指限制在一定時(shí)間內(nèi)對服務(wù)的訪問頻率,在高并發(fā)場景下,它可以防止瞬時(shí)流量過大導(dǎo)致服務(wù)崩潰。
Spring Cloud Gateway通常通過集成外部限流組件(如Redis RateLimiter、Resilience4j、或Sentinel...等等),來實(shí)現(xiàn)限流。
比如:可以使用令牌桶/漏桶算法,來實(shí)現(xiàn)限流。
圖片
令牌桶算法以恒定速率生成令牌,請求需要獲取令牌才能通過;
漏桶算法則以恒定速率處理請求,超出的請求會(huì)被丟棄或排隊(duì)。
熔斷(Circuit Breaking)
熔斷機(jī)制:類似于電路中的熔斷器。
當(dāng)對某個(gè)下游服務(wù)的請求失敗率或響應(yīng)時(shí)間超過預(yù)設(shè)閾值時(shí),網(wǎng)關(guān)會(huì)“熔斷”對該服務(wù)的調(diào)用。
后續(xù)的請求將不再發(fā)送給該服務(wù),而是直接返回錯(cuò)誤或執(zhí)行降級邏輯。
可以 防止因單個(gè)故障服務(wù)導(dǎo)致整個(gè)系統(tǒng)雪崩。
當(dāng)服務(wù)暫時(shí)不可用時(shí),快速失敗可以避免請求堆積,保護(hù)系統(tǒng)資源。
Spring Cloud Gateway通常與Resilience4j或Hystrix(雖然Hystrix已進(jìn)入維護(hù)模式,但仍有項(xiàng)目使用)集成。
圖片
熔斷狀態(tài): 熔斷器有三種狀態(tài):
關(guān)閉(CLOSED): 正常請求;
開啟(OPEN): 觸發(fā)熔斷,請求直接失?。?/p>
半開(HALF_OPEN): 經(jīng)過一段時(shí)間后,嘗試發(fā)送少量請求以檢測服務(wù)是否恢復(fù)。
降級(Degradation)
降級是指當(dāng)系統(tǒng)壓力過大或某些服務(wù)不可用時(shí),犧牲部分非核心功能或返回默認(rèn)值,以保證核心功能的可用性。
與熔斷的關(guān)系,降級通常發(fā)生在熔斷之后。
當(dāng)熔斷器開啟時(shí),可以配置一個(gè)降級方法作為備用方案。

































