Spring cloud alibaba——sentinel(二)——熔断、热点、系统规则

什么是熔断?

在这里插入图片描述

熔断状态

熔断状态有三种状态,非别为OPEN、HALF_OPEN、CLOSED

状态说明
OPEN表示熔断开启,拒绝所有请求
HALF_OPEN探测恢复状态,如果接下来的一个请求顺利通过则表示结束熔断,否则继续熔断
CLOSE表示熔断关闭,请求顺利通过

熔断规则

慢调用比例

在这里插入图片描述

  • 资源命:调用的接口名称
  • 熔断策略:按需要所选择的熔断策略
  • 最大RT:最大的响应时间,如果一个请求访问本服务,从发起请求到得到应答所耗费的时间,如果大于这个值,那么该请求就被定义为慢调用
  • 比例阈值:如果慢调用请求/所有请求的比例大于这个值,则该服务会进入熔断状态
  • 熔断时长:达到熔断条件后,在熔断时长内,服务不能被访问。熔断时长过后,若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断
  • 最小请求数,统计时长:最小请求数/统计时长计算QPS,例如1000ms的统计时长,最小请求数为5,也就是熔断需要满足每秒请求数大于5,才开始统计慢调用比例

工作机制在这里插入图片描述

逻辑流程图慢调用熔断逻辑图

异常比例

当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。
经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

工作机制
在这里插入图片描述

流程图
在这里插入图片描述

异常数

单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入HALF-OPEN 状态,若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

工作机制
在这里插入图片描述
流程图

在这里插入图片描述

热点规则

热点可以理解为经常访问的数据,例如:某商品的id,某用户的id,如果相对这些访问的热点数据进行限制,可以通过热点规则来实现。

sentinel热点规则示意图
在这里插入图片描述

@SentinelResource注解

之前在流控规则为链路时,使用了@SentinelService注解,而@SentinelResource注解是对应热点规则。其参数如下:

  • value:资源名称,使用热点规则限制的时候,通过资源名称来设置规则。
  • blockHandler:对应处理BlockException的方法
    @GetMapping("testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "dealBlock")
    /**
     * blockHandler的参数对应的是捕捉到流控异常后,用什么方法处理,
     * 可以理解为try catch里面的catch代码块
     */
    public String testHotKey(@RequestParam(value="hot1", required = false) String hot1,
                             @RequestParam(value="hot2", required = false) String hot2,
                             @RequestParam(value="hot3", required = false) String hot3){
        return "---------testHotKey";
    }

    /**
     * 异常处理方法中,
     * 1.修饰符必须为public;
     * 2.参数需要和资源方法相同;
     * 3.参数需要多一个BlockException
     * @param hot1
     * @param hot2
     * @param hot3
     * @param e
     * @return
     */
    public String dealBlock(String hot1, String hot2, String hot3, BlockException e){
        return "当前系统繁忙,请稍后重试";
    }

使用blockHandlerClass统一处理

    @GetMapping("byResource")
    /**
     * @SentinelResource注解
     * 即可以针对流控规则和热点规则使用,
     * 为了使抛出BlockException时,统一处理,
     * 可以使用blockHanlderClass属性指定处理的类,
     * blockHandler指定处理的方法
     */
    @SentinelResource(
            value = "byResource",
            blockHandler = "blockExceptionJHandler1",
            blockHandlerClass = BlockExceptionHandler.class
    )
    public String byResource(){
       return "------response with resource";
    }

统一处理BlockException的类


/**
 * 此类型用来处理限流自定义逻辑
 */
public class BlockExceptionHandler {

    /**
     * 统一sentinel控流报错的处理方法,
     * 必须为static方法,且必须含有BlockException参数
     * @param blockException
     * @return
     */
    public static String blockExceptionJHandler1(BlockException blockException){
        return "系统繁忙,请稍后再试";
    }

    public static String blockExceptionHandler2(BlockException blockException){
        return "您访问的资源被占用,请稍后重试";
    }

}

控制台配置

在这里插入图片描述

  • 资源名:对应@SentinelResource(value=“testHotKey”)
  • 参数索引:0指的是第一个参数,1指第二个参数,依此类推
  • 单机阈值:1s内的请求数上限

参数例外项

例如,为参数hot1规定了热点约束,但是希望当hot1为ok的时候不服从该约定,那么就可以设置例外项
在这里插入图片描述

系统规则

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

LOAD自适应

仅对Linux,Unix系统有效,统计一分钟内系统的平均负载,如果超过履职则触发保护。

RT

所有入口的平均RT(请求应答时间)达到阈值(单位为ms),则触发保护

入口QPS

当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护

CPU占用

阈值为0-1,既CPU占用比例,当系统 CPU 使用率超过阈值即触发系统保护,比较灵敏。

并发线程数

当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护

一般情况下,QPS和RT比较常用。

Sentinel持久化到Nacos

在Sentinel Dashboard中配置规则之后重启应用就会丢失,所以实际生产环境中需要配置规则的持久化实现,Sentinel提供多种不同的数据源来持久化规则配置,包括file,redis、nacos、zk。
但是Sentinel Dashboard中配置的规则不能直接作用到nacos中,只能在nacos中设置配置文件,配置文件按照一定的格式,作用到sentinel,具体操作如下:

需要同步流控规则的服务需引入依赖如下:

<!--   持久化配置需要的依赖,使用nacos持久化     -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.1</version>
</dependency>

yml配置文件:

spring:
  application:
    name: naocs-customer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        # sentinel控制台地址
        dashboard: localhost:8080
        # sentinel运行端口,默认为8719,如果被占用会一直+1,直至找到未被占用的端口
        port: 8719
      # 配置Sentinel的持久化
      datasource:
        nacos:
          nacos:
            serverAddr: localhost:8848
            groupId: DEFAULT_GROUP
            dataId: order-sentinel.json
            ruleType: flow

# 在微服务中暴露sentinel的端点
management:
  endpoints:
    web:
      exposure:
        include: '*'

在nacos操作台添加配置文件
在这里插入图片描述

配置文件详解

[   
    {
        "resource": "test1",
        "limitApp": "default",
        "grade": 1,
        "count": 2,
        "strategy": 0,
        "controlBehavior": 0
        "clusterMode": false
    }
]
---------------具体内容含义-----------------
resource:资源名称;
limitApp:来源应用;
grade:阈值类型,0表示线程数,1表示QPS;
count:单机阈r值;
strategy:流控模式,0表示直接,1表示关联,2表示链路;
controlBehavior:流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
clusterMode:是否集群。

关于更多的配置文件对应内容,可以参考com.alibaba.csp.sentinel.slots.block.flow.FlowRule的代码

controller:

  @GetMapping("/order/test1")
  @SentinelResource(value = "test1")
  public String test1() throws InterruptedException {
      return "test1 ";
  }

项目启动后,打开sentinel的dashboard,可以看到具体的流控规则
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值