查看原文
其他

Spring Cloud Alibaba迁移指南2:一行代码从Hystrix迁移到Sentinel

洛夜 IT牧场 2021-08-10


作者:洛夜,校对:周立

在本博客首发,欢迎转载。

前段时间,Netflix宣布Hystrix进入维护模式,详见Hystrix停止开发,我们该何去何从?,而Spring Cloud亦宣布Spring Cloud Netflix进入维护状态,后续不再进行更新已成为事实。作为开发者的我们,如何使用极简的方式替换Hystrix成为首要解决的问题。

Hystrix宣布停止维护后,社区推荐了Resilience4j( https://github.com/resilience4j/resilience4j ) ,而业界还有Alibaba Sentinel可供选择——3款产品各有优势,具体的功能差异参考下表(该表来自Sentinel Wiki( https://github.com/alibaba/Sentinel/wiki/Guideline:-%E4%BB%8E-Hystrix-%E8%BF%81%E7%A7%BB%E5%88%B0-Sentinel#%E5%8A%9F%E8%83%BD%E5%AF%B9%E6%AF%94 ):


SentinelHystrixresilience4j
隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间
实时统计实现滑动窗口(LeapArray)滑动窗口(基于 RxJava)Ring Bit Buffer
动态规则配置支持多种数据源支持多种数据源有限支持
扩展性多个扩展点插件的形式接口的形式
基于注解的支持支持支持支持
限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
流量整形支持预热模式、匀速器模式、预热排队模式不支持简单的 Rate Limiter 模式
系统自适应保护支持不支持不支持
控制台提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统

目前,Sentinel 在 Spring Cloud Alibaba中已适配Spring Cloud体系,完全可用来替代 Hystrix 的功能。不仅如此,阿里内部很多产品线都已使用Sentinel实现限流降级,Sentinel是经过生产流量大规模验证的。

下面来探讨如何从Hystrix迁移至Sentinel——

Spring Cloud Alibaba Sentinel 代替 Hystrix

要想使用Spring Cloud Alibaba Sentinel,需添加如下依赖,并去除Spring Cloud Netflix Hystrix( spring-cloud-starter-netflix-hystrix )的依赖。

  1. <dependency>

  2.    <groupId>org.springframework.cloud</groupId>

  3.    <artifactId>spring-cloud-alibaba-sentinel</artifactId>

  4.    <version>0.2.1.RELEASE</version>

  5. </dependency>

0代码修改兼容 Feign

加上 Feign 的依赖:

  1. <dependency>

  2.  <groupId>org.springframework.cloud</groupId>

  3.  <artifactId>spring-cloud-starter-openfeign</artifactId>

  4.  <version>${latest.version}</version>

  5. </dependency>

在 application.yml 中添加 feign.sentinel.enabled=true 即可为Feign启用Sentinel支持:

  1. # 去掉

  2. # feign.hystrix.enabled: true

  3. # 改为如下即可

  4. feign.sentinel.enabled: true

Feign Client无需修改:

  1. @FeignClient(name = "service-provider")

  2. public interface EchoService {

  3.    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)

  4.    String echo(@PathVariable("str") String str);


  5.      @RequestMapping(value = "/echo/save", method = RequestMethod.POST)

  6.    String save(Foo foo);

  7. }

对于这个 EchoService,echo方法对应的资源名是 GET:http://service-provider/echo/{str}, save 方法对应的资源名是 POST:http://service-provider/echo/save

只需配置这些规则,限流降级操作即可生效。

一行代码支持RestTemplate

Sentinel与Spring生态的 RestTemplate 也进行了整合,可对 RestTemplate 请求过程进行限流和降级,只需在构造 RestTemplate 的时候加上 @SentinelRestTemplate 注解即可,如下所示:

  1. @Bean

  2. @SentinelRestTemplate

  3. public RestTemplate restTemplate() {

  4.    return new RestTemplate();

  5. }

@SentinelRestTemplate 注解还暴露出了对应的属性可进行限流降级后的自定义错误,默认的行为是返回 "RestTemplate request block by sentinel" 信息。关于 @SentinelRestTemplate 的详细信息可参考Wiki( https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/Sentinel#resttemplate-%E6%94%AF%E6%8C%81 )。

相关热文

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

  • 001:《Java并发与高并发解决方案》学习笔记;

  • 002:《深入JVM内核——原理、诊断与优化》学习笔记;

  • 003:《Java面试宝典》

您的关注是对我最大的支持!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存