这是我参与更文挑战的第 19 天,活动详情查看: 更文挑战
Sentinel
四、Sentinel降级
- 平均响应时间 (
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
使用JMeter测试
使用JMeter一秒钟打进10个线程(请求),处理每个请求的时间为1秒,阈值设定的200毫秒,在未来的一秒钟时间窗口内,断路器打开微服务不可用。
异常比例
设置异常比例后,当异常数达到异常比例且,会开启断路器,微服务不可用。
异常数
当资源近 1 分钟的异常数目超过阈值之后会进行熔断。
五、热点Key限流
代码
@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";
}
配置
此时访问第1个热点参数的请求http://localhost:8401/testHotKey?p1=1,如果QPS(每秒的请求数)大于1,就会调用deal_testHotKey方法,如果没有配置该方法,就会给出一个异常页面。如果请求中没有第一个参数p1就不会受到限制。
参数例外项
如果第一个参数p1的值是5,QPS就会变为200,不等于5就会应用上面的设置。
注意:SentinelResource指定的兜底方案只会在sentienl控制中的生效,Java的异常不会触发。