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

系列文章目录

文章目录

  • 系列文章目录
  • 一、服务容错方案
  • 二、容错组件
  • 三、sentinel
  • 四、控制台使用
    • 4.1、流控规则
    • 4.2、熔断规则
    • 4.3、热点规则限流
    • 4.4、授权规则
    • 4.5、系统规则
    • 4.6、@SentinelResource
    • 4.7、持久化

一、服务容错方案

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 是阿里开源的一款断路器的实现,在阿里巴巴内部也已经大规模采用,可以说是非常稳定

功能 Sentinel Hystrix resilience4j
隔离策略 信号量隔离(并发线程数限流) 线程池隔离/信号量隔离 信号量隔离
熔断降级策略 基于响应时间,异常比率,异常数 基于异常比率 基于异常比率,响应时间
实时统计实现 时间滑动窗口(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 流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流 直接拒绝

同一个资源可以同时有多个限流规则。
SpringCloud学习:服务熔断降级之Sentinel_第1张图片

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

4.2、熔断规则

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

熔断包含一下重要属性:

Field 说明 默认值
resource 资源名,即规则的作用对象
grad e 熔断策略,支持慢调用比例/异常比例/异常数策略 慢调用比例
coun t 慢调用比例模式下为慢调用临界 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。
SpringCloud学习:服务熔断降级之Sentinel_第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、授权规则

SpringCloud学习:服务熔断降级之Sentinel_第6张图片

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

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

4.5、系统规则

系统保护规则是从应用级别的入口流量进行控制,从单台机器总体的 Load、RT、线程数、入口QPS、CPU 使用率五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
SpringCloud学习:服务熔断降级之Sentinel_第7张图片

  • 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

你可能感兴趣的:(SpringCloud,spring,cloud,java,微服务)