1 流量控制&熔断降级介绍
1.1 流量控制简介
拿旅游景点举个示例,每个旅游景点通常都会有最大的接待量,不可能无限制的放游客进入,比如故宫每天只卖八万张票,超过八万的游客,无法买票进入,因为如果超过八万人,景点的工作人员可能就忙不过来,过于拥挤的景点也会影响游客的体验和心情,并且还会有安全隐患;只卖N张票,这就是一种限流的手段。
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。在网络传输时,任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。
1.2 熔断降级简介
在调用系统的时候,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积,如下图:
1.3 流量控制&熔断降级实现方案
Hystrix
主页地址:https://github.com/Netflix/Hystrix/
Hystrix源自Netflix API团队于2011年开始的弹性工程工作。2012年,Hystrix不断发展和成熟,Netflix内的许多团队都采用了它。如今,每天在Netflix上通过Hystrix执行数以千亿计的线程隔离和数以千计的信号隔离调用。这大大提高了正常运行时间和弹性。
Resilience4j
主页地址:https://github.com/resilience4j/resilience4j
Resilience4j是受Netflix Hystrix启发的轻量级容错库,但专为Java 8和函数式编程而设计。轻巧,因为该库仅使用Vavr,而Vavr没有任何其他外部库依赖项。相比之下,Netflix Hystrix对Archaius具有编译依赖性,而Archaius具有更多外部库依赖性。
Sentinel
主页地址:https://github.com/alibaba/Sentinel
Sentinel 是阿里巴巴出品的面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来保障微服务的稳定性。
竞品对比
Sentinel
|
Hystrix
|
resilience4j
| |
隔离策略
|
信号量隔离(并发线程数隔离)
|
线程池隔离
/
信 号量隔离
|
信号量隔离
|
熔断降级策略
|
基于响应时间、异常比率、异常数
|
基于异常比率
|
基于异常比率、响应时间
|
实时统计实现
|
滑动窗口
|
滑动窗口
|
Ring Bit Buffffer
|
动态规则配置
|
支持多种数据源
|
支持多种数据源
|
有限支持
|
扩展性
|
多个扩展点
|
插件的形式
|
接口的形式
|
基于注解的支持
|
支持
|
支持
|
支持
|
限流
|
基于
QPS
,支持基于调用关系的限流
|
有限的支持
|
Rate Limiter
|
流量整形
|
支持预热模式、匀速器模式、预热排队模式
|
不支持
|
简单的
Rate Limiter
模式
|
系统自适应保护
|
支持
|
不支持
|
不支持
|
控制台
|
提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等
|
简单的监控查看
|
不提供控制台,可对接其 它监控系统
|
2 Sentinel介绍
2.1 Sentinel简介
Sentinel概述
Sentinel 是阿里巴巴出品的面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护等多个维度来保障微服务的稳定性。
主页地址:https://github.com/alibaba/Sentinel
Sentinel历史
2012年,Sentinel 诞生,主要功能为入口流量控制。
2013-2017年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。
2018年,Sentinel开源,并持续演进。
2019年,Sentinel朝着多语言扩展的方向不断探索,推出C++原生版本,同时针对Service Mesh场景也推出了 Envoy 集群流量控制支持,以解决Service Mesh架构下多语言限流的问题。
2020年,推出Sentinel Go版本,继续朝着云原生方向演进。
Sentinel组成
Sentinel 的使用主要分为两个部分:
核心库:主要指Java 客户端,不依赖任何框架/库,能够运行于 Java 7 及以上的版本的运行时环境,同时对Dubbo / Spring Cloud 等框架也有较好的支持。
控制台:控制台主要负责管理推送规则、监控、集群限流分配管理、机器发现等。
2.2 Sentinel特征
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
2.3 Sentinel特性
2.4 Sentinel开源生态
2.5 Sentinel的相关概念
资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
规则
规则指的是围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
2.6 Sentinel的优势
- 友好的控制面板
- 支持实时监控。
- 支持多种限流。支持QPS限流,线程数限流以及多种限流策略。
- 支持多种降级模式,支持按平均返回时间降级,按多种异常数降级,按异常比率降级等。
- 方便扩展开发,支持SPI模式对chain进行扩展。
- 支持链路的关联,可以实现按链路统计限流,系统保护,热门资源保护等等。