SpringCloud高级(三) ——SpringCloud Alibaba Sentinel篇三

降级规则

基本介绍

在这里插入图片描述

  • RT:平均响应时间,超出阈值且在时间窗口内通过的请求>=5,两个条件同时满足触发降级,窗口期过后关闭断路器。RT最大4900(更大需要通过-Dcsp.sentinel.statistic.max.rt=xxx才能生效)
  • 异常比例(秒级):QPS>=5且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级
  • 异常数(分钟级):异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级

sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(超时或异常比例升高),对这个资源进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误。

当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为抛出异常DegradeException)。

Sentinel的断路器是没有半开状态的,半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。具体可以参考Hystrix

降级策略实战

RT

在这里插入图片描述
在这里插入图片描述
测试:

@GetMapping("/testD")
public String testD()
{
    try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
    log.info("testD 测试RT");

    return "------testD";
}

配置规则:
在这里插入图片描述
jmeter压测:测试是每秒10个请求数,然后每个请求执行的时候都要1秒,那么1秒内持续进入的前5个请求的平均时间必然大于阈值,RT设置的是200毫秒,所以接下来的时间窗口1秒内,必然服务降级。
在这里插入图片描述
在这里插入图片描述
运行jmeter ,访问接口:http://localhost:8401/testD
在这里插入图片描述
关了jmeter ,访问接口:http://localhost:8401/testD,可以正常访问了。

要触发这个RT服务降级得满足两个条件:1秒内进入至少5个请求;持续进入的5个请求的平均响应时间大于阈值;

异常比例

在这里插入图片描述
简单说:1秒内QPS>=5,异常比例大于阈值,窗口期内,资源降级。

测试:
异常比例必然100%

@GetMapping("/testD")
    public String testD()
    {
        log.info("testD 测试RT");
        int age = 10/0;
        return "------testD";
    }

降级规则配置:
在这里插入图片描述
jmeter测试:只循环一次,1秒并发访问10次,每一次访问都是异常,100%的异常比例,必然大于异常比例的阈值
在这里插入图片描述
Jmeter执行完后,迅速的访问:
http://localhost:8401/testD
在这里插入图片描述
3s窗口期后:请求就能进入到接口里了
在这里插入图片描述

异常数

是什么
在这里插入图片描述
在这里插入图片描述
例:一分钟内,异常数大于5个,就服务熔断降级,时间窗口61秒内访问,都服务降级,时间窗口过去后,才能正常访问
在这里插入图片描述
访问接口:http://localhost:8401/testD 这个接口本来就会报错
在这里插入图片描述
连续访问5次后,再次访问:服务就被熔断降级了
在这里插入图片描述
等待61秒时间窗口过去后,再访问:接口又能访问了
在这里插入图片描述

热点参数限流(重点,务必掌握)

是什么
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。
比如:
http://localhost:8401/payment/query?p1 这个接口带有p1热点参数,就限流
http://localhost:8401/payment/query?p2 带p2或者pn 等非热点参数,就不限流

承上启下复习start

在这里插入图片描述

源码出处

com.alibaba.csp.sentinel.slots.block.BlockException

测试

假设p1为热点参数

    //参数p1对应的索引是0,p2是1
    //通过SentinelResource注解指定资源名为testHotKey,不指定的话,默认以接口路径/testHotKey作为资源名
    //指定兜底方法deal_testHotKey
    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
    public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                             @RequestParam(value = "p2",required = false) String p2) {
        //int age = 10/0;
        return "------testHotKey";
    }
    //兜底方法
    public String deal_testHotKey (String p1, String p2, BlockException exception){
        //sentinel的默认提示:Blocked by sentinel(flow limiting)
        return "------deal_testHotKey,o(╥﹏╥)o";
    }

热点参数规则配
注意这里的统计窗口时长,指的是1秒钟统计一次访问次数,如果1秒钟的访问次数大于阈值,就限流
在这里插入图片描述
访问:
1.不带参数,随便访问都是正确的
http://localhost:8401/testHotKey

------testHotKey

2.带参数p1(只要带了都会限)
http://localhost:8401/testHotKey?p1=1
快速访问,会发现一时能正常访问,一时显示的是兜底方法的打印信息 被限流了

注意:p1=1被限流 ,只是p1值为1的时候被限流,p2=2并不会被限流

3.带参数p2
http://localhost:8401/testHotKey?p2=1 怎么访问都是正确的

参数例外项

意思就是当参数的值是指定的值的时候,阈值可以不一样,特殊处理。
这里的是:p1=5时,阈值可以达到200,其他值,阈值为1
在这里插入图片描述
测试:http://localhost:8401/testHotKey?p1=5 怎么点都不限流,其他值刷新的快一点,立马就限流。

系统规则

是什么

之前的配置规则,都是针对某个接口,进行限流,是细粒度的。
系统规则是正对整个系统进行限流。
用官方的话说:Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

各项配置参数说明

系统规则支持以下的模式:

  • Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps *minRt 估算得出。设定参考值一般是 CPU cores * 2.5。
  • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

配置全局QPS

设置整个系统的1秒请求书为1个
在这里插入图片描述
测试:
快速访问/testA接口,会限流
在这里插入图片描述
快速访问/testB接口,也会限流
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42412601/article/details/107303413