替代 Hystrix,Spring Cloud Alibaba Sentinel 快速入門
提起 Spring Cloud 的限流降級元件,一般首先想到的是 Netflix 的 Hystrix。
不過就在2018年底,Netflix 宣佈不再積極開發 Hystrix,該專案將處於維護模式。官方表示 1.5.18 版本的 Hystrix 已經足夠穩定,可以滿足 Netflix 現有應用的需求,所以接下來其會把焦點轉向對於自適應的實現,更多關注對應用程式的實時效能做出響應。對於新應用的熔斷需求,將採用其它專案實現,Netflix 推薦了 Resilience4j。
作為 Spring Cloud Netflix 重要套件,Hystrix已經成為保障微服務穩定性的首選應用。其實除了 Netflix 和 Resilience4j,限流降級還有一個新的選擇,就是阿里巴巴的Sentinel元件。
一、阿里開源 Sentinel 簡介
2018年8月,阿里巴巴宣佈將 Sentinel 進行開源,同時推出了結合Dubbo的介面卡,捐贈給了Apache Dubbo社群。
1.Sentinel 的歷史
2012 年,Sentinel 誕生,主要功能為入口流量控制。
2013-2017 年,Sentinel 在阿里巴巴集團內部迅速發展,成為基礎技術模組,覆蓋了所有的核心場景。Sentinel 也因此積累了大量的流量歸整場景以及生產實踐。
2018 年,Sentinel 開源,並持續演進。
2.Sentinel對主流框架的適配
Sentinel 分為兩個部分:
核心庫(Java 客戶端)不依賴任何框架/庫,能夠運行於所有 Java 執行時環境,同時對 Dubbo / Spring Cloud 等框架也有較好的支援。
Sentinel適配目前多種的主流框架,包括Spring Cloud,Dubbo等。Sentinel的開源豐富了阿里巴巴微服務開源體系,對穩定性元件提供了更多的解決方案。
二、Sentinal 解決什麼問題
在大規模微服務架構的場景下,避免服務出現雪崩,要減少停機時間,要儘可能的提高服務可用性。限流和降級是一個非常重要的手段,具體實施方法可以歸納為八字箴言,分別是限流,降級,熔斷和隔離。
Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度保護服務的穩定性。
限流
限流顧名思義,提前對各個型別的請求設定最高的QPS閾值,若高於設定的閾值則對該請求直接返回,不再呼叫後續資源。
Sentinel提供了兩種流量統計方式,一種是統計併發執行緒數,另外一種則是統計 QPS,當併發執行緒數超出某個設定的閥值,新的請求會被立即拒絕,當QPS超出某個設定的閥值,系統可以通過直接拒絕、冷啟動、勻速器三種方式來應對,從而起流量控制的作用。
熔斷降級
如果某個目標服務呼叫慢或者有大量超時,此時熔斷該服務的呼叫,對於後續呼叫請求,不在繼續呼叫目標服務,直接返回,快速釋放資源。熔斷一般需要設定不同的恢復策略,如果目標服務情況好轉則恢復呼叫。
服務之間會有相互依賴關係,例如服務A做到了1秒上萬個QPS,但這時候服務B並無法滿足1秒上萬個QPS,那麼如何保證服務A在高頻呼叫服務B時,服務B仍能正常工作呢?
一種比較常見的情況是,服務A呼叫服務B時,服務B因無法滿足高頻調用出現響應時間過長的情況,導致服務A也出現響應過長的情況,進而產生連鎖反應影響整個依賴鏈上的所有應用,這時候就需要熔斷和降級的方法。Sentinel通過併發執行緒數進行限制和響應時間對資源進行降級兩種手段來對服務進行熔斷或降級。
塑形
通常我們遇到的流量具有隨機性、不規則、不受控的特點,但系統的處理能力往往是有限的,我們需要根據系統的處理能力對流量進行塑形,即規則化,從而根據我們的需要來處理流量。
下面這張圖片對流量整形做了一個很好的演示:
Sentinel通過資源的呼叫關係、執行指標、控制的效果三個維度來對流量進行控制,使用中可以自行靈活組合。
系統負載保護
微服務非常容易出現雪崩效應,需要避免服務宕機這種最危險的情況發生。
防止雪崩,是系統防護中重要的一環。當系統負載較高的時候,如果還持續讓請求進入,可能會導致系統崩潰,無法響應。
Sentinel 同時提供系統維度的自適應保護能力,在叢集環境下,網路負載均衡會把本應這臺機器承載的流量轉發到其它的機器上去。
三、Sentinel 主要特性
應用場景
Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的範圍)、訊息削峰填谷、叢集流量控制、實時熔斷下游不可用應用等。
支援實時監控
Sentinel 同時提供實時的監控功能。您可以在控制檯中看到接入應用的單臺機器秒級資料,甚至 500 臺以下規模的叢集的彙總執行情況。
適配多種開源元件
Sentinel 提供開箱即用的與其它開源框架/庫的整合模組,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴並進行簡單的配置即可快速地接入 Sentinel。
支援SPI ,擴充套件簡單
Sentinel 提供簡單易用、完善的 SPI 擴充套件介面。您可以通過實現擴充套件介面來快速地定製邏輯。例如定製規則管理、適配動態資料來源等。
四、Sentinel 開源生態
Sentinel支援當前的主流微服務開發套件,特別對Dubbo和Spring Cloud 做了比較好的支援,並且作為 Spring Cloud Alibaba套件的重要實現。
五、Sentinel對比Hystrix
Hystrix 的關注點在於以 隔離 和 熔斷 為主的容錯機制,超時或被熔斷的呼叫將會快速失敗,並可以提供 fallback 機制。
而 Sentinel 的側重點在於:
- 多樣化的流量控制
- 熔斷降級
- 系統負載保護
- 實時監控和控制檯
一圖勝前言,對 Sentinel和Hystrix的特性做一個表格來對比。
功能 | Sentinel | Hystrix | resilience4j |
---|---|---|---|
隔離策略 | 訊號量隔離(併發執行緒數限流) | 執行緒池隔離/訊號量隔離 | 訊號量隔離 |
熔斷降級策略 | 基於響應時間、異常比率、異常數 | 基於異常比率 | 基於異常比率、響應時間 |
實時統計實現 | 滑動視窗(LeapArray) | 滑動視窗(基於 RxJava) | Ring Bit Buffer |
動態規則配置 | 支援多種資料來源 | 支援多種資料來源 | 有限支援 |
擴充套件性 | 多個擴充套件點 | 外掛的形式 | 介面的形式 |
基於註解的支援 | 支援 | 支援 | 支援 |
限流 | 基於 QPS,支援基於呼叫關係的限流 | 有限的支援 | Rate Limiter |
流量整形 | 支援預熱模式、勻速器模式、預熱排隊模式(流量規則處可配置) | 不支援 | 不支援 |
系統自適應保護 | 支援 | 不支援 | 不支援 |
控制檯 | 開箱即用的控制檯,可配置規則、檢視秒級監控、機器發現 | 簡單的監控檢視 | 不提供控制檯,可對接其它監控系統 |
參考
Sentinel官方文件