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