默认是直接模式,直接模式的单机阈值是做用到资源名上的。也就是/testA。
但如果是关联模式。单机阈值是做用到关联资源上的。也就是/testB。
也就是说qps1是做用到/testB上。
关联模式就是当关联资源超出阈值时。也就是qps超过1时。资源名会被禁止访问。
可以验证一下。
利用Postman发送一20个请求,每隔0.3秒。也就是大概每秒发送3个请求。也就是qps=3
点击run。这时/testB做为关联资源超出我们之前设置的qps=1的阈值。/testA也就被禁止访问了。
超过这个阈值的请求,不会被直接禁止访问,直接禁止访问的是快速失败,排队等待的是请求会排队处理,在你这个阈值的上限上。
用postman发一个请求,小于1秒一次。
观察控制台可以看到,而服务线程依旧是以最高的设置阈值qps=1,1秒一次来处理请求的。有点像消息队列。
降级策略
1。RT
RT图示
简单来说就是,当qps>5时,平均请求响应时间>RT值时,图示的是200 ms,也就是平均请求响应时间大于200ms时,这时,触发降级,也就是断路器打开了,熔断了。此时资源在时间窗口的时间内不允许访问,图示的时间窗口值是1也就是1s内不允许访问,这时访问会报错。也就是熔断了。要等1s后才可以访问。
图示
上面这个例子的意思是,/testD这个资源,错误比例大于20%这个资源就会报错,在一秒的窗口期内不允许访问.
代码故意弄错
@GetMapping("/testD")
public String testD() {
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// log.info("testD 测试RT");
log.info("testD异常比例");
int age=10/0;
return "----testD";
}
在浏览器在使劲刷新,超过qps=5,又因异常100%超过了设置的异常20%,就会看到以下报错.
热点规则
图示
简单来说就是,对资源的参数进行qps限流qps=1。参数索引就是,参数的顺序.这里是零就是资源的第一个参数.也就是对p1参数进行限流,p2不限流,可以随便访问.
@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,))))))";
}
也就是p1参数为5的时候,阈值为100,高级选项能指定参数的特定值设置一个不同的阈值.