说明
- 本文将探讨 Apache ShenYu 网关 hystrix、sentinel、resilience4j 熔断插件功能、设计、优劣对比。
shenyu 网关以插件的形式将上述三个熔断组件给接入到了网关,使网关具有可选择性的熔断方案,甚至于将来开源出了新的优秀的熔断组件也都可以以插件的形式集成进来。由于 shenyu 网关就是将hystrix、sentinel、resilience4j的核心包给引入进项目集成的,所以我们就以相关组件的本身特性来做分析。
Hystrix
概述
Hystrix 是高可用性保障的一个框架。Netflix的 API 团队从 2011 年开始做一些提升系统可用性和稳定性的工作,Hystrix 就是从那时候开始发展出来的。
设计原则
- 对依赖服务调用时出现的调用延迟和调用失败进行控制和容错保护。
- 在复杂的分布式系统中,阻止某一个依赖服务的故障在整个系统中蔓延。比如某一个服务故障了,导致其它服务也跟着故障。
- 提供 fail-fast(快速失败)和快速恢复的支持。
- 提供 fallback 优雅降级的支持。
- 支持近实时的监控、报警以及运维操作。
Sentinel
概述
Sentinel 是阿里巴巴开源的为微服务提供高可用的组件;Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
特征
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Resilience4j
概述
Resilience4j是一个轻量级容错框架,设计灵感来源于Netflix 的Hystrix框架,为函数式编程所设计。
Resilience4j 提供了一组高阶函数(装饰器),包括断路器,限流器,重试,隔离,可以对任何的函数式接口,lambda表达式,或方法的引用进行增强,并且这些装饰器可以进行叠加。这样做的好处是,你可以根据需要选择特定的装饰器进行组合
与 Hystrix 的区别
- Hystrix使用HystrixCommand来调用外部的系统,而R4j提供了一些高阶函数,例如断路器、限流器、隔离机制等,这些函数作为装饰器对函数式接口、lambda表达式、函数引用进行装饰。此外,R4j库还提供了失败重试和缓存调用结果的装饰器。你可以在函数式接口、lambda表达式、函数引用上叠加地使用一个或多个装饰器,这意味着隔离机制、限流器、重试机制等能够进行组合使用。这么做的优点在于,你可以根据需要选择特定的装饰器。任何被装饰的方法都可以同步或异步执行,异步执行可以采用 CompletableFuture 或RxJava。
- 当有很多超过规定响应时间的请求时,在远程系统没有响应和引发异常之前,断路器将会开启。
- 当Hystrix处于半开状态时,Hystrix根据只执行一次请求的结果来决定是否关闭断路器。而R4j允许执行可配置次数的请求,将请求的结果和配置的阈值进行比较来决定是否关闭断路器。
- R4j提供了自定义的Reactor和Rx Java操作符对断路器、隔离机制、限流器中任何的反应式类型进行装饰。
- Hystrix和R4j都发出一个事件流,系统可以对发出的事件进行监听,得到相关的执行结果和延迟的时间统计数据都是十分有用的。
hystrix、sentinel、resilience4j 功能差异
Hystrix | Sentinel | Resilience4j | |
---|---|---|---|
隔离策略 | 线程池隔离/信号量隔离 | 信号量隔离(并发线程数限流) | 信号量隔离 |
熔断降级策略 | 基于异常比率 | 基于响应时间、异常比率、异常数 | 基于异常比率、响应时间 |
实时统计实现 | 滑动窗口(基于 RxJava) | 滑动窗口(LeapArray) | Ring Bit Buffer |
动态规则配置 | 支持多种数据源 | 支持多种数据源 | 有限支持 |
扩展性 | 插件的形式 | 多个扩展点 | 接口的形式 |
基于注解的支持 | 支持 | 支持 | 支持 |
限流 | 有限的支持 | 基于 QPS,支持基于调用关系的限流( shenyu 网关集成的不支持调用关系限流) | Rate Limiter |
流量模式 | 不支持 | 支持预热模式、匀速器模式、预热排队模式 | 简单的 Rate Limiter 模式 |
系统自适应保护 | 不支持 | 支持 | 不支持 |
控制台 | 提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等 | 简单的监控查看 | 不提供控制台,可对接其它监控系统 |
说明
shenyu 网关并未集成熔断组件原生的控制台。而 shenyu monitor 插件则是网关用来监控自身运行状态(JVM相关),请求的响应迟延,QPS、TPS等相关metrics,可结合prometheus 服务端通过 http 请求 来 拉取 metrics, 再通过Grafana来做监控展示。