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