SpringCloud学习:服务熔断降级之Sentinel

系列文章目录

一、服务容错方案

1)隔离方案
它是指将系统按照一定的原则划分为若干个服务模块,各个模块之间相互独立,无强依赖。当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不涉及其他模块,不影响整体的系统服务。常见的隔离方式有:线程隔离 和信号量隔离:
2)超时方案
在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间下游服务还没响应,那么就断开连接,释放掉线程。
3)限流方案
限流就是限制系统的输入和输出流量已达到保护系统的目的。为了保证系统的稳固运行,一旦达到需要限制的阈值,就需要限制流量并采用少量措施完成限制流量的目的
4)熔断方案
在互联网系统中,当下游服务因访问压力过大而相应变慢或失败的时候,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。这种牺牲局部,保全整体的措施就叫做熔断。
其中熔断有分为三种状态:

熔断关闭状态(Closed)
服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制

熔断开启状态(Open)
后续对该服务接口的调用不再经过网络,直接执行本地的 fallback 方法

半熔断状态(Half-Open)
尝试恢复服务调用,允许有限的流量调用该服务,并监控成功率。如果成功率达到预期,则说明服务已经恢复,进入熔断关闭状态;如果成功率依然很低,则重新进入熔断关闭状态
5)降级方案
服务降级一般是指在服务器压力剧增的时候,根据实际业务使用情况以及流量,对一些服务和页面有策略的不处理或者用一种简单的方式进行处理,从而释放服务器资源的资源以保证核心业务的正常高效运行。

二、容错组件

1)Hystrix
Hystrix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程系统,服务或者第三方库,防止级联失败,从而提升系统的可用性和容错性

2)Resilience4J
Resilience4J是一款非常轻量,简单,并且文档非常清晰,丰富的熔断工具,这是 Hystrix 官方推荐的替代品。它支持 SpringBoot 1.x/2.x 版本,而且监控也支持和 prometheus 等多款主流产品进行整合

3)Sentinel
Sentinel 是阿里开源的一款断路器的实现,在阿里巴巴内部也已经大规模采用,可以说是非常稳定

功能SentinelHystrixresilience4j
隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于响应时间,异常比率,异常数基于异常比率基于异常比率,响应时间
实时统计实现时间滑动窗口(LeapArray)时间滑动窗口(基于Rxjava)Ring Bit Buffer
动态规则配置支持多种数据源支持多种数据源有限支持
扩展性多个扩展点插件的形式接口的形式
基于注解的支持支持支持支持
限流基于 QPS,支持基于调用关系的限流有限的支持Rate LImiter
流量整形支持预热模式,匀速器模式,预热排队模式不支持简单的 Rate Limiter模式
系统自适应保护支持不支持不支持
控制台提供即用的控制台,可配置规则,查看秒级监控,机器发现等简单的监控查看不提供控制台,可对接其他监控系统

三、sentinel

sentinel官网地址
1)什么是Sentinel
Sentinel(分布式系统的流量防卫兵)是阿里开源的一套用于 服务容错 的综合性解决方案。它以流量为切入点,从 流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。
2)特性
丰富的应用场景:Sentinel 承接了阿里巴巴近10年的双十一大促的流量的核心场景。在秒杀、消息削峰填谷,集群流量控制、实时熔断下游不可用应用等场景游刃有余
完备的实时监控: Sentinel 提供了实时的监控功能。通过控制台可以看到接入应用的单台机器的数据,甚至500台以下规模的集群的汇总情况
广泛的开源生态: Sentinel 提供开箱即用的与其他开源框架整合模块,只需要引入相关的依赖进行简单的配置即可快速接入
完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展接口。可以通过扩展接口来快速定制逻辑。例如定制规则管理,适配动态数据源等
3)组成部分
核心库(Java客户端):不依赖任何框架/库,能够运行于所有的Java运行环境,同时对 Dubbo和SpringCloud 有很好的支持
控制台(Dashboard):基于SpringBoot开发, 打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

四、控制台使用

4.1、流控规则

重要属性:

Field说明默认值
resource资源名,资源名是限流规则的作用对象
count限流阈值
grade限流阈值类型,QPS 或线程数模式QPS 模式
limitApp流控针对的调用来源default,代表不区分调用来源
strategy调用关系限流策略:直接、链路、关联根据资源本身(直接)
controlBehavior流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流直接拒绝

同一个资源可以同时有多个限流规则。
流控规则示例

其中 流控模式 分为 三种:
1、直接(默认):接口达到限流条件时,开启限流
2、关联:当关联的资源达到限流条件是,开启限流(适合做应用让步)
3、链路: 当从某个接口过来的资源达到限流条件时,开启限流
流控效果有如下三种:
1、快速失败: 该方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝。
2、Warm Up: 预热模式,该效果是随着设置的预热时长慢慢的增加限流阈值,直到设置的阈值。
3、排队等待: 匀速排队访问接口。

4.2、熔断规则

Sentinel 提供以下几种熔断策略:
1、慢调用比例:
当资源的平均相应时间超过阈值(单位 ms)之后,资源进入准降级的状态。如果接下来1s内持续进入5个请求,它们的RT都持续超过这个阈值,那么在接下来的时间窗口(单位 s)之内,就会对这个方法进行降级。
慢调用比例
2、异常比例:
当资源的每秒异常总数/占通过量的比率超过阈值之后,资源就会进入降低状态,即在接下的时间窗口(单位 s)之内,对这个方法的调用都会自动的返回。异常比率的赋值范围为 [0.0, 1.0]
异常比例
3、异常数:
当资源近1分钟的异常数目超过阈值之后就会直接进行降级。但是这里需要注意的是,由于统计时间窗口是分钟级别的,若时间窗口小于60s,则结束熔断状态后仍可能再进入熔断状态。
异常数

熔断包含一下重要属性:

Field说明默认值
resource资源名,即规则的作用对象
grade 熔断策略,支持慢调用比例/异常比例/异常数策略慢调用比例
count 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
timeWindow熔断时长,单位为 s
minRequestAmount熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)5
statIntervalMs统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)1000 ms
slowRatioThreshold慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)00

4.3、热点规则限流

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
下图表示:对索引为0的参数,QPS大于1进行限流,限流阈值为1,若参数值为123则限流阈值为5。
热点参数限流规则
热点规则属性如下所示:

属性说明默认值
resource资源名,必填
count限流阈值,必填
grade 限流模式QPS 模式
durationInSec统计窗口时间长度(单位为秒),1.6.0 版本开始支持1s
controlBehavior流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持快速失败
maxQueueingTimeMs最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持0ms
paramIdx热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
paramFlowItemList参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型
clusterMode是否是集群参数流控规则false
clusterConfig集群流控相关配置

4.4、授权规则

授权规则

黑白名单规则(AuthorityRule)非常简单,主要有以下配置项:

**resource:**资源名,即限流规则的作用对象
**limitApp:**对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB
**strategy:**限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式

4.5、系统规则

系统保护规则是从应用级别的入口流量进行控制,从单台机器总体的 Load、RT、线程数、入口QPS、CPU 使用率五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统规则

  • Load: 仅对 Linux/Unix 有效。当系统的 load
    超过阈值时,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量是由系统的 maxQPS * minRT
    计算而出,设定的参考值可以参考 CPU 核数 * 2.5
  • RT: 当单台机器上所有入口流量的平均 RT 达到阈值就会触发系统保护,单位是毫秒
  • 线程数: 当单台机器上所有入口流量的并发线程数达到阈值是就会触发保护
  • 入口QPS: 当单台机器上所有入口流量的QPS达到阈值就会触发系统保护
  • CPU使用率: 当单台机器上所有入口流量的CPU使用率达到阈值就会触发系统保护

4.6、@SentinelResource

该注解的作用就是用来定义资源点。当我们定义了资源点之后,就可以通过 Sentinel 控制台来设置限流和降级策略来对资源点进行保护。同时还可以通过该注解来指定出现异常时候的处理策略。
主要属性如下所示:

  • value:资源名称,必需项(不能为空)
  • entryType:entry 类型,可选项(默认为 EntryType.OUT)
  • blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException
    的函数名称,可选项。blockHandler 函数访问范围需要是public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为
    BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
    1、返回值类型必须与原函数返回值类型一致;
    2、 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable类型的参数用于接收对应的异常。
    3、fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所以类型的异常(除了 exceptionsToIgnore里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback会生效。defaultFallback 函数签名要求:
    1、返回值类型必须与原函数返回值类型一致;
    2、方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
    3、defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback逻辑中,而是会原样抛出。

4.7、持久化

以nacos为例进行持久化,如下配置文件:

server:
  port: 8401
spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        enabled: true
        server-addr: 192.168.149.139:5555
    sentinel:
      filter:
        enabled: true
      transport:
        #配置Sentinel dashboard地址
        dashboard: 127.0.0.1:8080
        #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
        port: 8719
      datasource:
        ds1:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-flow
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow #流控规则
        ds2:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-degrade
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: degrade #降级规则
        ds3:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-paramFlow
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: param-flow #热点参数限流规则
        ds4:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-system
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: system #系统规则
        ds5:
          nacos:
            server-addr: ${spring.cloud.nacos.discovery.server-addr}
            dataId: ${spring.application.name}-authority
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: authority #系统规则


management:
  endpoints:
    web:
      exposure:
        include: '*'
feign:
  sentinel:
    enabled: true
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值