提起 Spring Cloud 的限流降级组件,通常首先想到的是 Netflix 的 Hystrix。git
不过就在2018年末,Netflix 宣布再也不积极开发 Hystrix,该项目将处于维护模式。官方表示 1.5.18 版本的 Hystrix 已经足够稳定,能够知足 Netflix 现有应用的需求,因此接下来其会把焦点转向对于自适应的实现,更多关注对应用程序的实时性能作出响应。对于新应用的熔断需求,将采用其它项目实现,Netflix 推荐了 Resilience4j。github
做为 Spring Cloud Netflix 重要套件,Hystrix已经成为保障微服务稳定性的首选应用。其实除了 Netflix 和 Resilience4j,限流降级还有一个新的选择,就是阿里巴巴的Sentinel组件。网络
2018年8月,阿里巴巴宣布将 Sentinel 进行开源,同时推出告终合Dubbo的适配器,捐赠给了Apache Dubbo社区。架构
2012 年,Sentinel 诞生,主要功能为入口流量控制。
2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了全部的核心场景。Sentinel 也所以积累了大量的流量归整场景以及生产实践。
2018 年,Sentinel 开源,并持续演进。并发
Sentinel 分为两个部分:负载均衡
核心库(Java 客户端)不依赖任何框架/库,可以运行于全部 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后能够直接运行,不须要额外的 Tomcat 等应用容器。框架
Sentinel适配目前多种的主流框架,包括Spring Cloud,Dubbo等。Sentinel的开源丰富了阿里巴巴微服务开源体系,对稳定性组件提供了更多的解决方案。微服务
在大规模微服务架构的场景下,避免服务出现雪崩,要减小停机时间,要尽量的提升服务可用性。限流和降级是一个很是重要的手段,具体实施方法能够概括为八字箴言,分别是限流,降级,熔断和隔离。
Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。性能
限流顾名思义,提早对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,再也不调用后续资源。
Sentinel提供了两种流量统计方式,一种是统计并发线程数,另一种则是统计 QPS,当并发线程数超出某个设定的阀值,新的请求会被当即拒绝,当QPS超出某个设定的阀值,系统能够经过直接拒绝、冷启动、匀速器三种方式来应对,从而起流量控制的做用。插件
若是某个目标服务调用慢或者有大量超时,此时熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。熔断通常须要设置不一样的恢复策略,若是目标服务状况好转则恢复调用。
服务之间会有相互依赖关系,例如服务A作到了1秒上万个QPS,但这时候服务B并没有法知足1秒上万个QPS,那么如何保证服务A在高频调用服务B时,服务B仍能正常工做呢?
一种比较常见的状况是,服务A调用服务B时,服务B因没法知足高频调用出现响应时间过长的状况,致使服务A也出现响应过长的状况,进而产生连锁反应影响整个依赖链上的全部应用,这时候就须要熔断和降级的方法。Sentinel经过并发线程数进行限制和响应时间对资源进行降级两种手段来对服务进行熔断或降级。
一般咱们遇到的流量具备随机性、不规则、不受控的特色,但系统的处理能力每每是有限的,咱们须要根据系统的处理能力对流量进行塑形,即规则化,从而根据咱们的须要来处理流量。
下面这张图片对流量整形作了一个很好的演示:
Sentinel经过资源的调用关系、运行指标、控制的效果三个维度来对流量进行控制,使用中能够自行灵活组合。
微服务很是容易出现雪崩效应,须要避免服务宕机这种最危险的状况发生。
防止雪崩,是系统防御中重要的一环。当系统负载较高的时候,若是还持续让请求进入,可能会致使系统崩溃,没法响应。
Sentinel 同时提供系统维度的自适应保护能力,在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。
Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量能够承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
Sentinel 同时提供实时的监控功能。您能够在控制台中看到接入应用的单台机器秒级数据,甚至 500 台如下规模的集群的汇总运行状况。
Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只须要引入相应的依赖并进行简单的配置便可快速地接入 Sentinel。
Sentinel 提供简单易用、完善的 SPI 扩展接口。您能够经过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel支持当前的主流微服务开发套件,特别对Dubbo和Spring Cloud 作了比较好的支持,而且做为 Spring Cloud Alibaba套件的重要实现。
Hystrix 的关注点在于以 隔离 和 熔断 为主的容错机制,超时或被熔断的调用将会快速失败,并能够提供 fallback 机制。
而 Sentinel 的侧重点在于:
一图胜前言,对 Sentinel和Hystrix的特性作一个表格来对比。
功能 | Sentinel | Hystrix | resilience4j |
---|---|---|---|
隔离策略 | 信号量隔离(并发线程数限流) | 线程池隔离/信号量隔离 | 信号量隔离 |
熔断降级策略 | 基于响应时间、异常比率、异常数 | 基于异常比率 | 基于异常比率、响应时间 |
实时统计实现 | 滑动窗口(LeapArray) | 滑动窗口(基于 RxJava) | Ring Bit Buffer |
动态规则配置 | 支持多种数据源 | 支持多种数据源 | 有限支持 |
扩展性 | 多个扩展点 | 插件的形式 | 接口的形式 |
基于注解的支持 | 支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于调用关系的限流 | 有限的支持 | Rate Limiter |
流量整形 | 支持预热模式、匀速器模式、预热排队模式(流量规则处可配置) | 不支持 | 不支持 |
系统自适应保护 | 支持 | 不支持 | 不支持 |
控制台 | 开箱即用的控制台,可配置规则、查看秒级监控、机器发现 | 简单的监控查看 | 不提供控制台,可对接其它监控系统 |