SpringCloudAlibaba系列(二)Sentinel-中

166 阅读3分钟

这是我参与更文挑战的第 19 天,活动详情查看: 更文挑战

Sentinel

四、Sentinel降级

image-20201222153819784

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

平均响应时间(RT)

新建一个带sleep的请求方法。

@GetMapping("/testD")
public String testD() {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("testD");
    return "testD";
}

配置RT

image-20201222163809535

使用JMeter测试

使用JMeter一秒钟打进10个线程(请求),处理每个请求的时间为1秒,阈值设定的200毫秒,在未来的一秒钟时间窗口内,断路器打开微服务不可用。

异常比例

设置异常比例后,当异常数达到异常比例且,会开启断路器,微服务不可用。

异常数

当资源近 1 分钟的异常数目超过阈值之后会进行熔断。

五、热点Key限流

image-20201222235038737

代码

@GetMapping("/testHotKey")
//@SentinelResource类似@HystrixCommand,value:设置一个唯一标识用于设置资源,blockHandler:如果触发了热点限流规则就会回调的兜底方法
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                         @RequestParam(value = "p2",required = false) String p2) {
    System.out.println("testHotKey");
    return "testHotKey";
}

public String deal_testHotKey(String p1, String p2, BlockException e) {
    System.out.println("deal_testHotKey");
    return "deal_testHotKey";
}

配置

image-20201223104439941

此时访问第1个热点参数的请求http://localhost:8401/testHotKey?p1=1,如果QPS(每秒的请求数)大于1,就会调用deal_testHotKey方法,如果没有配置该方法,就会给出一个异常页面。如果请求中没有第一个参数p1就不会受到限制。

参数例外项

image-20201223110258084

如果第一个参数p1的值是5,QPS就会变为200,不等于5就会应用上面的设置。

注意:SentinelResource指定的兜底方案只会在sentienl控制中的生效,Java的异常不会触发。