21、Sentinel熔断降级、热点key限流

系列文章目录

1、父工程创建
2、支付模块构建和热部署
3、消费者订单模块
4、服务注册中心-Eureka
5、zookeeper没学习
6、服务注册中心-Consul
7、Eureka、Consul异同
8、服务调用-Ribbon
9、服务调用-OpenFeign

10、服务降级-Hystrix
11、服务降级-Hystrix(二)
12、服务熔断-Hystrix
13、服务网关-Gateway
14-17 在git上做配置中心,没有学习
17、请求链路跟踪-Sleuth
18、Spring Cloud Alibaba-Nacos注册中心与配置中心
19、Spring Cloud Alibaba-Nacos集群和持久化配置
20、Sentinel流控
21、Sentinel熔断降级、热点key限流
22、SentinelResource配置
23、Sentinel 服务熔断与持久化


1. 理论知识

21、Sentinel熔断降级、热点key限流_第1张图片

  1. 慢调用比例
    请求的响应时间大于RT(最大响应时间)则统计为慢调用。当单位统计时(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。
    时间窗口结束,熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断

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

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

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

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

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

2. 熔断配置实战

2.1 慢调用比例

在cloudalibaba-sentinel-service8401的Controller中新增加一个方法

    @GetMapping("/testD")
    public String testD() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "TestD";
    }

慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。链接

说明:
设置的最大响应时间为200ms
比例阈值为0.5 取值范围为[0.0 ~ 1.0](0% ~ 100%)
熔断时长为 1s(为了更好的观察现象,建议设置大一些)
统计时长 1000ms
最小请求数5

  1. 当请求的时间大于200ms时,视为慢调用
  2. 在1000ms的时间内,请求次数大于5,且慢调用比例大于0.5(50%),就熔断,窗口期为1s

21、Sentinel熔断降级、热点key限流_第2张图片
Postman测试:
21、Sentinel熔断降级、热点key限流_第3张图片
在线程刚运行完后立刻访问http://localhost:8401/testD,显示”Blocked by Sentinel (flow limiting)“,一秒后访问返为”TestD“

2.2 异常比例

添加一个方法

    @GetMapping("/testE")
    public String testE() {
        int a= 10/0;
        log.info("testD 测试RT");
        return "Test E";
    }

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

说明:
比例阈值为0.6 取值范围为[0.0 ~ 1.0](0% ~ 100%)
熔断时长为 3s(设置长一点,更方便看到返回的信息)
统计时长 1000ms
最小请求数5

  1. 在1000ms的时间内,请求次数大于5,且异常比例大于0.6(60%),就熔断。窗口期为3s

21、Sentinel熔断降级、热点key限流_第4张图片

测试:
21、Sentinel熔断降级、热点key限流_第5张图片
结果

在线程刚运行完后立刻访问http://localhost:8401/testE,显示”Blocked by Sentinel (flow limiting)“,三秒后访问返为”There was an unexpected error (type=Internal Server Error, status=500). / by zero“

2.3 异常数

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

说明:
异常数为7
熔断时长为 3s(设置长一点,更方便看到返回的信息)
统计时长 1000ms
最小请求数5

  1. 在1000ms的时间内,当请求发生异常次数大于7,就熔断。窗口期为3s

21、Sentinel熔断降级、热点key限流_第6张图片

3. 热点key

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
21、Sentinel熔断降级、热点key限流_第7张图片
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式

热点限流的内容可以看【com.alibaba.csp.sentinel.slots.block.BlockException】这个类

默认与自定义
之前的例子中,使用的都是sentinel系统默认的提示”Blocked by Sentinel (flow limiting)“

我们也可以自定义:
使用@SentinelResource注解

    /**
     * value:名称唯一,在添加资源时做区分
     * blockHandler : 兜底方法
     */
    @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) {
                             
        return "------testHotKey";
    }

    /**兜底方法*/
    public String deal_testHotKey (String p1, String p2, BlockException exception) {
        return "------deal_testHotKey,o(╥﹏╥)o";
    }

说明:
当方法testHotKey里面第一个参数的QPS超过每秒1次,作降级处理
21、Sentinel熔断降级、热点key限流_第8张图片

测试
当快速点击访问以下两个请求时,会降级处理
http://localhost:8401/testHotKey?p1=a
http://localhost:8401/testHotKey?p1=a&p2=b

当快速点击访问以下请求时,没有任何一场
http://localhost:8401/testHotKey?p2=a

3.1 使用总结

使用热点限流

  1. @SentinelResource(value = “testHotKey”,blockHandler = “deal_testHotKey”)
  2. @SentinelResource(value = “testHotKey”)

这两种都可以完成热点限流,但是一定要使用第一个,自己写兜底方法的。
因为第二个当达到限流条件时,前端访问直接返回ErrorPage

4. 参数例外项

上个例子演示了第一个参数p1,当QPS超过1秒1次点击后马上被限流。

但是现在我们既想这个参数被限流,又想这个参数不被限流(嘿嘿)
我们期望p1参数只有当它是某个特殊值的时候,它的限流值和平时不一样

假如当p1的值等于5时,它的阈值可以达到200
21、Sentinel熔断降级、热点key限流_第9张图片
测试:

http://localhost:8401/testHotKey?p1=5 不降级
http://localhost:8401/testHotKey?p1=3 降级
当p1等于5的时候,阈值变为200
当p1不等于5的时候,阈值就是平常的1

注意:参数必须是基本类型或者String

4.1 注意

  1. @SentinelResource

    1. 处理的是sentinel控制台配置的情况,有blockHandler方法配置的兜底处理;
    2. 但是如果是j出现ava运行时异常,这个不归兜底方法管,访问会直接返回ErrorPage
  2. 在操作的过程中,如果重启cloudalibaba-sentinel-service8401,这时在Sentinel与 服务会断开连接,需要【注销】重新登录即可, 但是Sentinel中配置的规则会消失(现在还没有做持久化)
    21、Sentinel熔断降级、热点key限流_第10张图片

你可能感兴趣的:(spring,cloud)