SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)

5、降级规则

  • 官网

    https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7

  • 基本介绍

    SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第1张图片

    RT(平均响应时间,秒级)
    平均响应时间 超出阈值 且 在时间窗口内通过的请求>=5,两个条件同时满足后触发降级
    窗口期过后关闭断路器
    RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)

    • 进一步说明

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

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

    • Sentinel的断路器是没有半开状态的

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

      • 复习Hystrix

        SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第2张图片

  • 降级策略实战

    • RT

      • 是什么

        SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第3张图片

        SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第4张图片

      • 测试

        • 代码

          @GetMapping("/testD")
          public String testD()
          {
              //暂停几秒钟线程
              try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
              log.info("testD 测试RT");
              return "------testD";
          }
          
          
        • 配置

          SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第5张图片

        • jmeter压测

          SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第6张图片

        • 结论

          SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第7张图片

          SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第8张图片

    按照上述配置,

    永远一秒钟打进来10个线程(大于5个了)调用testD,我们希望200毫秒处理完本次任务,
    如果超过200毫秒还没处理完,在未来1秒钟的时间窗口内,断路器打开(保险丝跳闸)微服务不可用,保险丝跳闸断电了

    后续我停止jmeter,没有这么大的访问量了,断路器关闭(保险丝恢复),微服务恢复OK

    • 异常比例

      • 是什么

        在这里插入图片描述

        SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第9张图片

      • 测试

        • 代码

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

          SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第10张图片

        • jmeter

          SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第11张图片

        • 结论

          按照上述配置,
          单独访问一次,必然来一次报错一次(int age = 10/0),调一次错一次;

          在这里插入图片描述

          开启jmeter后,直接高并发发送请求,多次调用达到我们的配置条件了。
          断路器开启(保险丝跳闸),微服务不可用了,不再报错error而是服务降级了。

    • 异常数

      • 是什么

        在这里插入图片描述

        时间窗口一定要大于等于60秒。

        SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第12张图片

      • 异常数是按照分钟统计的

      • 测试

        • 代码

          @GetMapping("/testE")
          public String testE()
          {
              log.info("testE 测试异常比例");
              int age = 10/0;
              return "------testE 测试异常比例";
          }
          
          
        • 配置

          SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第13张图片

          http://localhost:8401/testE,第一次访问绝对报错,因为除数不能为零,
          我们看到error窗口,但是达到5次报错后,进入熔断后降级。

        • jmeter

          SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第14张图片

6、热点key限流

  • 基本介绍

    何为热点
    热点即经常访问的数据,很多时候我们希望统计或者限制某个热点数据中访问频次最高的TopN数据,并对其访问进行限流或者其它操作

    SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第15张图片

  • 官网

    https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81

  • 承上启下复习

    兜底方法
    分为系统默认和客户自定义,两种

    • 之前的case,限流出问题后,都是用sentinel系统默认的提示:Blocked by Sentinel (flow limiting)

    • 我们能不能自定?类似hystrix,某个方法出问题了,就找对应的兜底降级方法?

    结论
    从HystrixCommand 到@SentinelResource

  • 代码

     
    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "dealHandler_testHotKey")
    public String testHotKey(@RequestParam(value = "p1",required = false) String p1, 
                             @RequestParam(value = "p2",required = false) String p2){
        return "------testHotKey";
    }
    public String dealHandler_testHotKey(String p1,String p2,BlockException exception)
    {
        return "-----dealHandler_testHotKey";
    }
     
     
    

    sentinel系统默认的提示:Blocked by Sentinel (flow limiting)

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

  • 配置

    SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第16张图片

    限流模式只支持QPS模式,固定写死了。(这才叫热点)
    @SentinelResource注解的方法参数索引,0代表第一个参数,1代表第二个参数,以此类推
    单机阀值以及统计窗口时长表示在此窗口时间超过阀值就限流。
    上面的抓图就是第一个参数有值的话,1秒的QPS为1,超过就限流,限流后调用dealHandler_testHotKey支持方法。

    在这里插入图片描述

    • @SentinelResource(value = “testHotKey”) 异常打到了前台用户界面看到,不友好
    • @SentinelResource(value = “testHotKey”,blockHandler = “dealHandler_testHotKey”)方法testHotKey里面第一个参数只要QPS超过每秒1次,马上降级处理,用了我们自己定义的
  • 测试

    • error http://localhost:8401/testHotKey?p1=abc
    • error http://localhost:8401/testHotKey?p1=abc&p2=33
    • right http://localhost:8401/testHotKey?p2=abc
  • 参数例外项

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

    • 特例情况

      • 普通 , 超过1秒钟一个后,达到阈值1后马上被限流
      • 我们期望p1参数当它是某个特殊值时,它的限流值和平时不一样
      • 特例, 假如当p1的值等于5时,它的阈值可以达到200
    • 配置

      SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第17张图片

    • 测试

      • http://localhost:8401/testHotKey?p1=5 right
      • http://localhost:8401/testHotKey?p1=3 error
      • 当p1等于5的时候,阈值变为200
      • 当p1不等于5的时候,阈值就是平常的1
    • 前提条件 热点参数的注意点,参数必须是基本类型或者String

  • 其它

    手贱添加异常看看…/(ㄒoㄒ)/~~

    后面说

    @SentinelResource
    处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理;

    RuntimeException
    int age = 10/0,这个是java运行时报出的运行时异常RunTimeException,@SentinelResource不管

    总结
    @SentinelResource主管配置出错,运行出错该走异常走异常

7、系统规则

  • 是什么

    https://github.com/alibaba/Sentinel/wiki/%E7%B3%BB%E7%BB%9F%E8%87%AA%E9%80%82%E5%BA%94%E9%99%90%E6%B5%81

  • 各项配置参数说明

    SpringCloud第十八章AlibabaSentinel实现熔断与限流(降级规则、热点key限流、系统规则)_第18张图片

  • 配置全局QPS

你可能感兴趣的:(分布式,spring,cloud,alibaba)