本文對Hystrix、Resilience4j、Sentinel進行對比,並探討如何使用一行代碼將Hystrix遷移到Sentinel。git
做者:洛夜,校對:周立github
在本博客首發,歡迎轉載。spring
前段時間,Netflix宣佈Hystrix進入維護模式,詳見Hystrix中止開發,咱們該何去何從? ,而Spring Cloud亦宣佈Spring Cloud Netflix進入維護狀態,後續再也不進行更新已成爲事實。做爲開發者的咱們,如何使用極簡的方式替換Hystrix成爲首要解決的問題。併發
Hystrix宣佈中止維護 後,社區推薦了Resilience4j ,而業界還有Alibaba Sentinel可供選擇——3款產品各有優點,具體的功能差別參考下表(該表來自 Sentinel Wiki :app
Sentinel | Hystrix | resilience4j | |
---|---|---|---|
隔離策略 | 信號量隔離(併發線程數限流) | 線程池隔離/信號量隔離 | 信號量隔離 |
熔斷降級策略 | 基於響應時間、異常比率、異常數 | 基於異常比率 | 基於異常比率、響應時間 |
實時統計實現 | 滑動窗口(LeapArray) | 滑動窗口(基於 RxJava) | Ring Bit Buffer |
動態規則配置 | 支持多種數據源 | 支持多種數據源 | 有限支持 |
擴展性 | 多個擴展點 | 插件的形式 | 接口的形式 |
基於註解的支持 | 支持 | 支持 | 支持 |
限流 | 基於 QPS,支持基於調用關係的限流 | 有限的支持 | Rate Limiter |
流量整形 | 支持預熱模式、勻速器模式、預熱排隊模式 | 不支持 | 簡單的 Rate Limiter 模式 |
系統自適應保護 | 支持 | 不支持 | 不支持 |
控制檯 | 提供開箱即用的控制檯,可配置規則、查看秒級監控、機器發現等 | 簡單的監控查看 | 不提供控制檯,可對接其它監控系統 |
目前,Sentinel 在 Spring Cloud Alibaba中已適配Spring Cloud體系,徹底可用來替代 Hystrix 的功能。不只如此,阿里內部不少產品線都已使用Sentinel實現限流降級,Sentinel是通過生產流量大規模驗證的。ide
下面來探討如何從Hystrix遷移至Sentinel——ui
要想使用Spring Cloud Alibaba Sentinel,需添加以下依賴,並去除Spring Cloud Netflix Hystrix( spring-cloud-starter-netflix-hystrix
)的依賴。插件
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel</artifactId> <version>0.2.1.RELEASE</version> </dependency>
加上Feign的依賴:線程
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>${latest.version}</version> </dependency>
在application.yml
中添加feign.sentinel.enabled=true
便可爲Feign啓用Sentinel支持:rest
# 去掉 # feign.hystrix.enabled: true # 改成以下便可 feign.sentinel.enabled: true
Feign Client無需修改:
@FeignClient(name = "service-provider") public interface EchoService { @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); @RequestMapping(value = "/echo/save", method = RequestMethod.POST) String save(Foo foo); }
對於這個 EchoService
,echo方法對應的資源名是 GET:http://service-provider/echo/{str}
, save 方法對應的資源名是 POST:http://service-provider/echo/save
。
只需配置這些規則,限流降級操做便可生效。
Sentinel與Spring生態的 RestTemplate
也進行了整合,可對 RestTemplate
請求過程進行限流和降級,只需在構造 RestTemplate 的時候加上 @SentinelRestTemplate
註解便可,以下所示:
@Bean @SentinelRestTemplate public RestTemplate restTemplate() { return new RestTemplate(); }
@SentinelRestTemplate
註解還暴露出了對應的屬性可進行限流降級後的自定義錯誤,默認的行爲是返回 「RestTemplate request block by sentinel」 信息。關於 @SentinelRestTemplate
的詳細信息能夠參考 Wiki。
http://www.itmuch.com/spring-cloud-alibaba-migration/spring-cloud-alibaba-2/