本文对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/