本篇继续我们的Sentinel,本篇接着上一篇继续探究一下@SentinelResource注解的其它属性及,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
前几篇中我们在配置限流的时候有使用访问路径为资源名进行配置的,也有是有@SentinelResource注解的value值为资源名进行配置的,接下来我们具体测试下两者的区别。
目录
按照RUL限流
完善测试方法
在FlowLimitController类中增加以下测试方法:
@GetMapping("/byUrl_byResource")
@SentinelResource(value = "byUrl_byResource",blockHandler = "dealHandler_byUrl_byResource")
public String byUrl_byResource() {
return "-----byUrl_byResource";
}
public String dealHandler_byUrl_byResource(BlockException exception) {
return "-----dealHandler_byUrl_byResource";
}
配置
测试
启动服务,浏览器快速访问 http://localhost:8401/byUrl_byResource ,报错如下:
按照资源名限流
配置
使用上面的测试方法,进行如下配置:
测试
启动服务,浏览器快速访问 http://localhost:8401/byUrl_byResource ,报错如下:
小结
按url限流: 配置资源名为访问路径,使用url限流时触发流控规则会报默认错误。
按资源限流: 配置资源名为@SentinelResource注解对应的value值。
如果@SentinelResource
指定了blockHandler 会执行指定的方法 如上dealHandler_byUrl_byResource
没指定blockHandler 会执行默认的方法 返回 Blocked by Sentinel (flow limiting)
@SentinelResource相关属性测试
blockHandler与fallback
完善测试类
在FlowLimitController类中增加以下测试方法:
@GetMapping("/{id}")
@SentinelResource(value = "fallbackAndBlockHandler",blockHandler = "blockHandler")
//@SentinelResource(value = "fallbackAndBlockHandler",fallback = "handlerFallback")
public String fallbackAndBlockHandler(@PathVariable("id") Integer id) {
if (id == 4) {
int i = 9/0;
}
return "SentinelResource";
}
/**
* 兜底方法
*/
public String handlerFallback(@PathVariable Integer id,Throwable e){
return "-----blockHandler,exception内容 "+e.getMessage() + " --- " + e.getCause();
}
/**
* sentinel 违规执行方法
*/
public String blockHandler(@PathVariable Long id,BlockException e) {
return "-----blockHandler,exception内容 "+e.getMessage() + " --- " + e.getCause();
}
配置blockHandler
配置
测试
启动服务,浏览器快速访问 http://localhost:8401/1 ,报错如下:
浏览器访问 http://localhost:8401/4,报错如下:
浏览器快速访问 http://localhost:8401/4,报错如下:
配置fallback
修改测试类
修改FlowLimitController类中的测试方法:
@GetMapping("/{id}")
//@SentinelResource(value = "fallbackAndBlockHandler",blockHandler = "blockHandler")
@SentinelResource(value = "fallbackAndBlockHandler",fallback = "handlerFallback")
public String fallbackAndBlockHandler(@PathVariable("id") Integer id) {
if (id == 4) {
int i = 9/0;
}
return "SentinelResource";
}
配置
同上面的配置
测试
启动服务,浏览器快速访问 http://localhost:8401/1 ,报错如下:
浏览器访问 http://localhost:8401/4,报错如下:
浏览器快速访问 http://localhost:8401/4,报错如下:
配置blockHandler和fallback
修改测试类
修改FlowLimitController类中的测试方法:
@GetMapping("/{id}") @SentinelResource(value = "fallbackAndBlockHandler",fallback = "handlerFallback",blockHandler = "blockHandler") public String fallbackAndBlockHandler(@PathVariable("id") Integer id) { if (id == 4) { int i = 9/0; } return "SentinelResource"; }
配置
同上面的配置
测试
启动服务,浏览器快速访问 http://localhost:8401/1 ,报错如下:
浏览器访问 http://localhost:8401/4,报错如下:
浏览器快速访问 http://localhost:8401/4,报错如下:
blockHandler与fallback小结
配置blockHandler: 触发配置的限流规则时,会执行blockHandler指定的方法,程序运行异常时,会将异常信息直接返回前端,不友好。
配置fallback:触发配置的限流规则和程序运行异常时,都会进入fallback指定的方法。相比上面只配置blockHandler,在触发配置的限流规则时,避免了直接将系统默认的错误返回前端;在运行异常时,避免了将异常信息直接返回前端。
配置blockHandler和fallback:触发配置的限流规则时进入blockHandler指定的方法,程序运行异常时,进入fallback指定的方法。
自定义限流处理
到此为止存在的问题:自定义的处理方法和业务代码耦合在一块,代码臃肿且不利于复用。我们可以通过自定义处理类的方式将这些处理方法提出来以解决这个问题,下面我们看下自定义限流处理的步骤。
自定义限流处理类
public class CustomerBlockHandler {
public static String handleException1(BlockException exception){
return "自定义的限流处理信息......CustomerBlockHandler......1";
}
public static String handleException2(BlockException exception){
return "自定义的限流处理信息......CustomerBlockHandler......2";
}
}
完善测试方法
FlowLimitController类中新增测试方法,我们可以通过blockHandler指定CustomerBlockHandler类中的某个方法作为处理类,如下我们指定CustomerBlockHandler中的handleException2方法为处理类:
@GetMapping("/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",
blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handleException2")
public String customerBlockHandler() {
return "按客户自定义限流处理逻辑";
}
配置
测试
浏览器快速访问 ,报错如下: