前言
目前业内常见的微服务系统容错降级方案主要有几个:
这里对几个组件简单介绍一下。
Hystrix
Hystrix [hɪst’rɪks] 是Netflix开源的延迟和容错组件,主要是用于隔离远程系统,服务和第三方组件的一些接口故障,包括无法连接,超时,报错等,实现在复杂的分布式系统中的容错和弹性。
Hystrix基于Java开发,目前最新的版本是1.5.18,支持如下功能:
- 请求限流
- 服务降级
- 服务隔离(舱壁模式)
- 服务熔断
- 调用缓存
Netflix已经宣布不再开发新功能,仅维护现有功能稳定,并且推荐使用新的高可用框架Resilience4j。
Reselience4j
Resilience4j [rɪˈzɪliəns] 是一个函数式编程设计的容错库,是Hystrix停更之后推荐的高可用容错组件,Resilience4j本身是受Hystrix启发而设计开发的,相比于Hystrix更加轻量,少了很多外部依赖,只依赖Vavr。
Resilience4j提供了一些基于装饰器模式的高阶函数,用于增强函数接口和lambda表达式的方法,用于增强断路器,限流器,重试器和舱壁隔离等。Resilience4j的设计思想是按需取用,因为不同功能都区分了模块,主要提供了如下几个核心功能模块:
- resilience4j-circuitbreaker:断路模块,支持熔断功能
- resilience4j-ratelimiter:速率模块,支持限流功能
- resilience4j-bulkhead:舱壁模块,支持服务隔离
- resilience4j-retry:重试模块,支持自动重试
- resilience4j-timelimiter:超时模块,支持超时处理
- resilience4j-cache:缓存模块,支持调用缓冲
Resilience4j目前还在持续发展,社区也有一定的活跃程度,但是目前国内使用比较少。
Sentinel
Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
Sentinel是一个轻量的组件,不依赖任何框架和库,能够运行于Java 8及以上的版本,同时对常见的开源组件有较好的支持,主要的功能包括:
- 流量控制
- 熔断降级
- 系统负载保护
sentinel目前社区活跃,在国内广泛使用,是一个非常受欢迎的容错组件。
组件对比
对比项 | Hystrix | Resilience4j | Sentinel | 对比 |
---|---|---|---|---|
流量控制 | 1.基于信号量 2.基于线程数(官方推荐) |
支持信号量限流 | 1. 基于QPS和并发线程数的限制 2. 基于调用关系的流量控制 |
1. Hystrix对限流的支持功能较弱,比较有限 2. Resilience4j的限流只支持信号量,但限流功能较强 3. Sentinel的限流功能最灵活强大 |
熔断策略 | 基于数量的异常比例 | 1. 基于请求数量的滑动窗口 2. 基于时间的滑动窗口 |
基于滑动时间窗口 | 1. Hystrix熔断策略单一 2. Resilience4j的熔断策略最丰富,但是基于请求数量的滑动窗口策略较少使用 3. Sentinel基于滑动时间窗口的熔断策略功能最灵活 |
服务隔离策略 | 基于线程池隔离 | 1. 基于信号量隔离 2. 基于有界队列和固定的线程池隔离 |
基于信号量隔离 | 1. Hystrix基于线程池的隔离策略较重,并且需要预先设置好各个服务的线程池数量 2. Resilience4j的隔离策略较灵活丰富 3. Sentinel中规中矩,仅支持信号量隔离 |
黑白名单 | 不支持 | 不支持 | 基于来源配置黑白名单 | 黑白名单功能比较少用,只有在极特殊的场景进行动态阻断流量使用 |
指标监控 | 支持实时控制台,需要接入springboot框架 | 支持通过prometheus接入grafana监控 | 支持开箱即用的实时控制台,并且可以通过控制台动态修改降级规则 | 1. Sentinel的实时控制台最强大,但是缺少报警功能 2. resilience4j可以通过接入grafana实现报警功能 3. Hystrix的控制台较弱,只能看数据,并且有框架依赖 |
系统自适应保护 | 不支持 | 不支持 | 支持 | Sentinel可以针对系统负载情况进行自适应保护,防止系统出现集群故障 |
动态规则 | 基于Archaius的动态配置 | 不支持 | 通过控制台动态配置 | 1. Hystrix基于文件的动态配置,需要通过svn/git等工具进行配置文件管理 2. Sentinel可以通过控制台或者接口进行修改 3. Resilience4j需要定制开发实现动态配置 |
规则持久化 | 基于配置文件存储 | 不支持(写在代码中) | Zookeeper Apollo Nacos |
1. Sentinel的配置持久化支持较好,并且可以自主扩展其他持久化存储 2. Resilience4j需要定制开发实现配置持久化 |
主流框架适配 | spring boot spring cloud |
1. spring boot 2. spring cloud 3. 其他(参考文档) |
1. spring boot 2. spring cloud 3. 其他(参考文档) |
1. 实际上几个组件对spring boot/spring cloud体系的集成都是不错的 2. sentinel有更多开源框架的适配 3. sentinel适配spring boot 2.0.x版本的组件已经不再维护,建议升级了 |
基于插件机制 | 基于插件机制 | 通过springboot框架提供的插件机制 | 支持功能槽扩展 内置SPI机制扩展 |
1. Hystrix官网提供了插件机制支持扩展和二次开发 2. Resilience4j官方文档没有提及扩展和二次开发的能力 3. Sentinel的扩展能力最强,设计时已经预留基于责任链模式的扩展槽,并且内置提供了SPI机制用于扩展开发 |
最新稳定版本 | 1.5.8 | 1.7.0 | 1.8.1 |
推荐方案
从上面的对比中可以看出,Hystrix由于已经不在发展了,首先抛弃。对比Resilience4j,Sentinel具有社区更活跃,功能更完整,应用更广泛等明显优势,建议使用Sentinel作为容错降级的首选组件。 但是Sentinel目前的功能还不能完全满足需求,主要缺少如下内容:
控制台存在如下问题:
- 仅支持单机部署,不作为开箱即用的生产环境控制台
- 控制台只能查看最近5分钟的指标数据,缺乏持久化的能力
- 不支持权限划分,所有人登录控制台都能修改所有应用的规则
- 没有开箱即用对接Grafana等报表和监控平台,缺乏有效的报警手段
以上的功能,实际上可以通过SPI机制时间扩展开发。
附:Sentinel版本和springboot版本对应关系:版本说明