Spring Cloud Alibaba Sentinel组件如何实现服务熔断与降级?

2026-05-21 03:473阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2652个文字,预计阅读时间需要11分钟。

Spring Cloud Alibaba Sentinel组件如何实现服务熔断与降级?

服务雪崩效应是一种因服务提供者服务不可用(原因)导致服务调用者服务不可用(结果),并逐渐放大不可用现象的效应。如图所示,形成原因+服务雪崩。

什么是服务雪崩效应

服务雪崩效应是一种因“服务提供者服务的不可用”(原因)导致“服务调用者服务不可用”(结果),并将不可用逐渐放大的现象。如下图所示

形成原因

服务雪崩的过程可以分为三个阶段:

  • 服务提供者不可用;
  • 重试加大请求流量;
  • 服务调用者不可用; 服务雪崩的每个阶段都可能由不同的原因造成,总结如下:

应对策略

常见容错方案:

1、超时 2、限流 3、舱壁模式(如每个controller都有自己独立的线程池,之间互不干扰) 4、断路器模式

全面应对策略:

Sentinel 是什么

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性。

 

大家可能会问:Sentinel 和之前常用的熔断降级库 Netflix Hystrix 有什么异同呢?Sentinel官网有一个对比的文章,这里摘抄一个总结的表格,具体的对比可以点此 链接 查看。

对比内容 Sentinel Hystrix 隔离策略 信号量隔离 线程池隔离/信号量隔离 熔断降级策略 基于响应时间或失败比率 基于失败比率 实时指标实现 滑动窗口 滑动窗口(基于 RxJava) 规则配置 支持多种数据源 支持多种数据源 扩展性 多个扩展点 插件的形式 基于注解的支持 支持 支持 限流 基于 QPS,支持基于调用关系的限流 不支持 流量整形 支持慢启动、匀速器模式 不支持 系统负载保护 支持 不支持 控制台 开箱即用,可配置规则、查看秒级监控、机器发现等 不完善 常见框架的适配 Servlet、Spring Cloud、Dubbo、gRPC 等 Servlet、Spring Cloud Netflix

从对比的表格可以看到,Sentinel比Hystrix在功能性上还要强大一些,本文让我们一起来了解下Sentinel的源码,揭开Sentinel的神秘面纱。

Sentinel功能特点

1、丰富的应用场景:例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等 2、完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。 3、广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 4、完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

开源生态

Sentinel 分为两个部分:

核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

为应用整合Sentinel

引入maven依赖

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!--sentinel整合之后会暴露出/actuator/sentinel--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <!--整合Spring Cloud--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <!--整合Spring Cloud Alibaba--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>0.9.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

加入配置暴露/actuator/sentinel端点

#添加sentinel依赖后 暴露/actuator/sentinel端点 management: endpoints: web: exposure: include: '*'

启动服务访问localhost:port/actuator/sentinel会返回json信息,说明已经整合好了Sentinel

搭建Sentinel控制台

下载Sentinel控制台:github.com/alibaba/Sentinel/releases

Spring Cloud Alibaba Sentinel组件如何实现服务熔断与降级?

为服务整合Sentinel控制台:

spring: cloud: sentinel: filter: #打开/关闭掉对Spring MVC端点的保护 enabled: true transport: port: 8719 #指定sentinel控制台的地址 dashboard: localhost:8080

定义资源:也就是对哪个资源进行流量控制,现在已经提供了注解形式,所以新的接入直接用注解,@SentinelResource

  • 关于SentinelResource注解,这里列出几个好用和必填的参数,具体参考这里

Sentinel控制台配置流控规则

流控模式

  • 直接:当QPS超过阈值就进行限流。
  • 关联:当关联的资源达到阈值,就限流自己。
    • 适用场景:查询和修改同一表的数据,如果是高并发的应用,查询接口的流量过大,就会影响修改接口的性能,反之同理,这就可以根据业务需求,去衡量希望优先读还是优先写。
    • 关联其实是一种保护关联资源的设计。
  • 链路:只记录指定链路上的流量,即指定资源从入口资源进来的流量如果达到阈值就限流。
    • 链路其实是一种细粒度的针对来源,而编辑流控规则中的针对来源输入框是微服务级别的,可以指定指定微服务过来的流量达到阈值就限流。
    • 而链路是api级别的,指定的是api的调用流量达到阈值就限流。

流控效果

  • 快速失败:直接失败,抛异常 相关源码:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
  • Warm Up(预热):根据codeFactor(冷加载因子,默认值为3),从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。 即如果阈值为100,冷加载因子为3,预热时长为10秒,那么就会用100 / 3作为最初的阈值,经过10秒之后才会将阈值达到100,进而进行限流,意思就是让允许通过的流量缓慢增加,在达到一定的时间之后才达到阈值这样会更好的保护微服务
  • 排队等待:匀速排队,让请求以均匀的速度通过,阈值类型必须设置成QPS,否则无效。此种模式可适用于应对突发流量的场景 相关源码:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

Sentinel控制台配置降级规则,即断路器模式,Sentinel目前只有断路器三态中的打开和关闭,没有半开状态

降级策略

  • RT:平均响应时间 注意:Sentinel默认RT最大时间为4900毫秒,可通过-Dcsp.sentinel.statistic.max.rt=xxx修改
  • 异常比例
  • 异常数 注意:时间窗口<60秒可能会出问题 相关源码:com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule

Sentinel控制台配置热点规则,是一种特殊的流控规则,支持对特定的参数和参数的值限流

适用于存在热点参数(某些参数QPS很高),并希望提升API可用性的场景 注意:参数必须是基本类型或者String 相关源码:com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowChecker#passCheck() 加入代码

@GetMapping("/test-hot") @SentinelResource("hot") public String testHot(@RequestParam(required = false) String a, @RequestParam(required = false)String b){ return a + ":" + b; }

Sentinel控制台配置系统规则

阈值类型

  • LOAD 当系统Load1(1分钟的load)超过阈值,且并发线程数超过系统容量时触发,建议配置为CPU核心数*2.5。(仅对Linux/Unix-like 机器生效) 系统容量 = maxQps * minRt maxQps:秒级统计出来的最大QPS minRt:秒级统计出来的最小响应时间 相关源码:com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkBbr()
  • RT:所有入口流量的平均RT达到阈值触发
  • 线程数:所有入口流量的并发线程数达到阈值触发
  • 入口QPS:所有入口流量的QPS达到阈值触发 相关源码:com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkSystem()

Sentinel控制台配置授权规则

  • 白名单:资源名里的资源只允许为白名单里面的流控应用访问。
  • 黑名单:资源名里的资源不允许为黑名单里面的流控应用访问。
  • 授权规则通过调用来源从而实现对服务消费者的授权或者限制。

Sentinel使用Java代码方式配置规则

请点击: Alibaba Sentinel 规则参数总结 Alibaba Sentinel 配置项总结

Sentinel与控制台通信原理剖析

微服务注册到Sentinel控制台和发送心跳源码:com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeartbeatSender 微服务和Sentinel控制台通信API源码:com.alibaba.csp.sentinel.command.CommandHandler接口的实现类

修改控制台规则是如何通知客户端的? 看sentinel-transport-simple-github.com/eacdy/Sentinel-Dashboard-Nacos/releases

github.com/alibaba/Sentinel/wiki/在生产环境中使用-Sentinel#pull模式

参考:

www.jianshu.com/p/0e218ef7f505

blog.csdn.net/sheinenggaosuwo/article/details/86592893

blog.csdn.net/xudawenfighting/article/details/80127279

阿里熔断限流Sentinel研究

阿里sentinel源码研究深入

www.jianshu.com/p/ed57014e1abb

Sentinel-开源版本Dashboard集成Apollo配置中心

阿里Sentinel控制台源码修改-对接Apollo规则持久化

Alibaba Sentinel 配置项总结

SentinelResource注解 属性总结

本文共计2652个文字,预计阅读时间需要11分钟。

Spring Cloud Alibaba Sentinel组件如何实现服务熔断与降级?

服务雪崩效应是一种因服务提供者服务不可用(原因)导致服务调用者服务不可用(结果),并逐渐放大不可用现象的效应。如图所示,形成原因+服务雪崩。

什么是服务雪崩效应

服务雪崩效应是一种因“服务提供者服务的不可用”(原因)导致“服务调用者服务不可用”(结果),并将不可用逐渐放大的现象。如下图所示

形成原因

服务雪崩的过程可以分为三个阶段:

  • 服务提供者不可用;
  • 重试加大请求流量;
  • 服务调用者不可用; 服务雪崩的每个阶段都可能由不同的原因造成,总结如下:

应对策略

常见容错方案:

1、超时 2、限流 3、舱壁模式(如每个controller都有自己独立的线程池,之间互不干扰) 4、断路器模式

全面应对策略:

Sentinel 是什么

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性。

 

大家可能会问:Sentinel 和之前常用的熔断降级库 Netflix Hystrix 有什么异同呢?Sentinel官网有一个对比的文章,这里摘抄一个总结的表格,具体的对比可以点此 链接 查看。

对比内容 Sentinel Hystrix 隔离策略 信号量隔离 线程池隔离/信号量隔离 熔断降级策略 基于响应时间或失败比率 基于失败比率 实时指标实现 滑动窗口 滑动窗口(基于 RxJava) 规则配置 支持多种数据源 支持多种数据源 扩展性 多个扩展点 插件的形式 基于注解的支持 支持 支持 限流 基于 QPS,支持基于调用关系的限流 不支持 流量整形 支持慢启动、匀速器模式 不支持 系统负载保护 支持 不支持 控制台 开箱即用,可配置规则、查看秒级监控、机器发现等 不完善 常见框架的适配 Servlet、Spring Cloud、Dubbo、gRPC 等 Servlet、Spring Cloud Netflix

从对比的表格可以看到,Sentinel比Hystrix在功能性上还要强大一些,本文让我们一起来了解下Sentinel的源码,揭开Sentinel的神秘面纱。

Sentinel功能特点

1、丰富的应用场景:例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等 2、完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。 3、广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 4、完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

开源生态

Sentinel 分为两个部分:

核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

为应用整合Sentinel

引入maven依赖

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!--sentinel整合之后会暴露出/actuator/sentinel--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <!--整合Spring Cloud--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <!--整合Spring Cloud Alibaba--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>0.9.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>

加入配置暴露/actuator/sentinel端点

#添加sentinel依赖后 暴露/actuator/sentinel端点 management: endpoints: web: exposure: include: '*'

启动服务访问localhost:port/actuator/sentinel会返回json信息,说明已经整合好了Sentinel

搭建Sentinel控制台

下载Sentinel控制台:github.com/alibaba/Sentinel/releases

Spring Cloud Alibaba Sentinel组件如何实现服务熔断与降级?

为服务整合Sentinel控制台:

spring: cloud: sentinel: filter: #打开/关闭掉对Spring MVC端点的保护 enabled: true transport: port: 8719 #指定sentinel控制台的地址 dashboard: localhost:8080

定义资源:也就是对哪个资源进行流量控制,现在已经提供了注解形式,所以新的接入直接用注解,@SentinelResource

  • 关于SentinelResource注解,这里列出几个好用和必填的参数,具体参考这里

Sentinel控制台配置流控规则

流控模式

  • 直接:当QPS超过阈值就进行限流。
  • 关联:当关联的资源达到阈值,就限流自己。
    • 适用场景:查询和修改同一表的数据,如果是高并发的应用,查询接口的流量过大,就会影响修改接口的性能,反之同理,这就可以根据业务需求,去衡量希望优先读还是优先写。
    • 关联其实是一种保护关联资源的设计。
  • 链路:只记录指定链路上的流量,即指定资源从入口资源进来的流量如果达到阈值就限流。
    • 链路其实是一种细粒度的针对来源,而编辑流控规则中的针对来源输入框是微服务级别的,可以指定指定微服务过来的流量达到阈值就限流。
    • 而链路是api级别的,指定的是api的调用流量达到阈值就限流。

流控效果

  • 快速失败:直接失败,抛异常 相关源码:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
  • Warm Up(预热):根据codeFactor(冷加载因子,默认值为3),从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值。 即如果阈值为100,冷加载因子为3,预热时长为10秒,那么就会用100 / 3作为最初的阈值,经过10秒之后才会将阈值达到100,进而进行限流,意思就是让允许通过的流量缓慢增加,在达到一定的时间之后才达到阈值这样会更好的保护微服务
  • 排队等待:匀速排队,让请求以均匀的速度通过,阈值类型必须设置成QPS,否则无效。此种模式可适用于应对突发流量的场景 相关源码:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

Sentinel控制台配置降级规则,即断路器模式,Sentinel目前只有断路器三态中的打开和关闭,没有半开状态

降级策略

  • RT:平均响应时间 注意:Sentinel默认RT最大时间为4900毫秒,可通过-Dcsp.sentinel.statistic.max.rt=xxx修改
  • 异常比例
  • 异常数 注意:时间窗口<60秒可能会出问题 相关源码:com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule

Sentinel控制台配置热点规则,是一种特殊的流控规则,支持对特定的参数和参数的值限流

适用于存在热点参数(某些参数QPS很高),并希望提升API可用性的场景 注意:参数必须是基本类型或者String 相关源码:com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowChecker#passCheck() 加入代码

@GetMapping("/test-hot") @SentinelResource("hot") public String testHot(@RequestParam(required = false) String a, @RequestParam(required = false)String b){ return a + ":" + b; }

Sentinel控制台配置系统规则

阈值类型

  • LOAD 当系统Load1(1分钟的load)超过阈值,且并发线程数超过系统容量时触发,建议配置为CPU核心数*2.5。(仅对Linux/Unix-like 机器生效) 系统容量 = maxQps * minRt maxQps:秒级统计出来的最大QPS minRt:秒级统计出来的最小响应时间 相关源码:com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkBbr()
  • RT:所有入口流量的平均RT达到阈值触发
  • 线程数:所有入口流量的并发线程数达到阈值触发
  • 入口QPS:所有入口流量的QPS达到阈值触发 相关源码:com.alibaba.csp.sentinel.slots.system.SystemRuleManager#checkSystem()

Sentinel控制台配置授权规则

  • 白名单:资源名里的资源只允许为白名单里面的流控应用访问。
  • 黑名单:资源名里的资源不允许为黑名单里面的流控应用访问。
  • 授权规则通过调用来源从而实现对服务消费者的授权或者限制。

Sentinel使用Java代码方式配置规则

请点击: Alibaba Sentinel 规则参数总结 Alibaba Sentinel 配置项总结

Sentinel与控制台通信原理剖析

微服务注册到Sentinel控制台和发送心跳源码:com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeartbeatSender 微服务和Sentinel控制台通信API源码:com.alibaba.csp.sentinel.command.CommandHandler接口的实现类

修改控制台规则是如何通知客户端的? 看sentinel-transport-simple-github.com/eacdy/Sentinel-Dashboard-Nacos/releases

github.com/alibaba/Sentinel/wiki/在生产环境中使用-Sentinel#pull模式

参考:

www.jianshu.com/p/0e218ef7f505

blog.csdn.net/sheinenggaosuwo/article/details/86592893

blog.csdn.net/xudawenfighting/article/details/80127279

阿里熔断限流Sentinel研究

阿里sentinel源码研究深入

www.jianshu.com/p/ed57014e1abb

Sentinel-开源版本Dashboard集成Apollo配置中心

阿里Sentinel控制台源码修改-对接Apollo规则持久化

Alibaba Sentinel 配置项总结

SentinelResource注解 属性总结