• 【SpringCloud】Spring Cloud Alibaba 之 Sentinel熔断降级(三十一)


    Sentinel熔断降级

      Sentinel除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

    降级策略

      通常用以下几种方式来衡量资源是否处于稳定的状态:

    • 平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 N 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。
    • 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
    • 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

    示例

      示例代码搭建参考:Spring Cloud Alibaba 之 Sentinel哨兵介绍入门(二十九) 

    平均响应时间

      1、编辑项目Controller中的代码,增加方法testD

    1 @GetMapping("/testD")
    2 public String testD(){
    3     try {
    4         Thread.sleep(800);
    5     } catch (InterruptedException e) {
    6         e.printStackTrace();
    7     }
    8     return "--------testD";
    9 }

      2、在Sentinel控制台,增加降级规则

        

      3、降级规则,设置testD的平均响应时长为200毫秒,时间窗口为1s,如下:

        

      4、测试

        1)启动项目(启动项目-访问testD-设置规则-测试)

        2)访问地址:http://localhost:8401/testD,正常访问

        3)使用JMeter 1s内并发10个请求到地址,循环执行,http://localhost:8401/testD

        4)使用浏览器访问,http://localhost:8401/testD,服务被熔断

          

    异常比例

      1、编辑项目Controller中的代码,修改方法testD,使testD方法每次请求都异常

    @GetMapping("/testD")
    public String testD(){
        int n = 10/0;
        return "--------testD";
    }

      2、降级规则,设置testD的异常比例为0.2,时间窗口为1s,如下:

        

      3、测试

        1)启动项目(启动项目-访问testD-设置规则-测试)

        2)访问地址:http://localhost:8401/testD,出现异常界面Error Page

          

        3)使用JMeter 1s内并发10个请求到地址,循环执行,http://localhost:8401/testD

        4)使用浏览器访问,http://localhost:8401/testD,服务被熔断

    异常数

      1、编辑项目Controller中的代码,修改方法testD,使testD方法每次请求都异常

    1 @GetMapping("/testD")
    2 public String testD(){
    3     int n = 10/0;
    4     return "--------testD";
    5 }

      2、降级规则,设置testD的异常数为5,时间窗口为70s,如下:

        

      3、测试

        1)启动项目(启动项目-访问testD-设置规则-测试)

        2)访问地址:http://localhost:8401/testD,出现异常界面Error Page

        3)使用JMeter 1s内并发10个请求到地址,循环执行,http://localhost:8401/testD

        4)使用浏览器访问,http://localhost:8401/testD,服务被熔断

        5)停止JMeter,70秒后,访问地址:http://localhost:8401/testD,出现异常界面Error Page

  • 相关阅读:
    四十四 常用内建模块 struct
    四十三 常用内建模块 base64
    Django Haystack 全文检索与关键词高亮
    python实现简单tftp(基于udp)
    多线程socket UDP收发数据
    Python 线程复习
    python 进程复习
    python pdb 调试
    Linux 复习
    Django 博客
  • 原文地址:https://www.cnblogs.com/h--d/p/12943916.html
Copyright © 2020-2023  润新知