Spring Cloud Alibaba遷移指南2:一行代碼從Hystrix遷移到Sentinel

本文對Hystrix、Resilience4j、Sentinel進行對比,並探討如何使用一行代碼將Hystrix遷移到Sentinel。git

做者:洛夜,校對:周立github

在本博客首發,歡迎轉載。spring

前段時間,Netflix宣佈Hystrix進入維護模式,詳見Hystrix中止開發,咱們該何去何從? ,而Spring Cloud亦宣佈Spring Cloud Netflix進入維護狀態,後續再也不進行更新已成爲事實。做爲開發者的咱們,如何使用極簡的方式替換Hystrix成爲首要解決的問題。併發

Hystrix宣佈中止維護 後,社區推薦了Resilience4j ,而業界還有Alibaba Sentinel可供選擇——3款產品各有優點,具體的功能差別參考下表(該表來自 Sentinel Wikiapp

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 代替 Hystrix

要想使用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>

0代碼修改兼容Feign

加上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

只需配置這些規則,限流降級操做便可生效。

一行代碼支持RestTemplate

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/

相關文章
相關標籤/搜索