提起 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 等框架也有較好的支持。
控制台(Dashboard)基於 Spring Boot 開發,打包后可以直接運行,不需要額外的 Tomcat 等應用容器。
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 |
| 流量整形 | 支持預熱模式、勻速器模式、預熱排隊模式(流量規則處可配置) | 不支持 | 不支持 |
| 系統自適應保護 | 支持 | 不支持 | 不支持 |
| 控制台 | 開箱即用的控制台,可配置規則、查看秒級監控、機器發現 | 簡單的監控查看 | 不提供控制台,可對接其它監控系統 |
