@SentinelResource 配置-上 (按资源名配置限流规则)
1) Sentinel 控制台配置流控规则:
2)java 代码:
@GetMapping("/byResource")
@SentinelResource(value = "byResource", blockHandler = "handException")
public BaseResponse byResource() {
log.info("按资源名限流ok");
return BaseResponse.returnSuccess(new Payment(2023, "serial001"));
}
public BaseResponse handException(BlockException exception) {
return BaseResponse.returnFault(exception.getClass().getCanonicalName() + "\t 服务不可用");
}
3)测试-按资源名限流-提示自定义异常信息:
根据上述配置的流控规则:每秒只支持一个请求访问资源 byResource,超过就会限流;
我们每秒请求2次,系统对请求资源限流,返回自定义的错误信息,而不是默认的流控提示信息;
为什么返回的是自定义的信息呢??
因为 @SentinelResource(value = "byResource", blockHandler = "handException") 中 blockHandler 属性配置的方法 handException是兜底方法;请求不符合流控规则就会触发 blockHandler 属性配置的方法;
http://localhost:8401/byResource
4)测试-提示系统默认的异常信息
也可以直接使用 @SentinelResource(value = "byUrl"),不配置 blockHandler 属性,再对 /rateLimit/byUrl 配置流控规则,请求不符合流控规则提示信息则是Sentinel默认的报错信息,而不是我们类似上面的自定义报错信息;
@GetMapping("/rateLimit/byUrl")
@SentinelResource(value = "byUrl")
public BaseResponse byUrl() {
log.info("按url限流测试ok");
return BaseResponse.returnSuccess(new Payment(2023, "serial002"));
}
@SentinelResource 配置-中、下
blockHandler属性配置的兜底方案面临的问题:
a、没有提现我们自己的业务要求;
b、依照现有条件,我们自定义的处理方法又和业务代码耦合在一块,不直观;
c、每个业务方法都加一个兜底的方法,那代码膨胀加剧;
d、全局统一的方法没有体现;
如何解决上面面临的问题??(自定义统一异常处理逻辑)
1)创建CustomerBlockHandler类用于自定义限流处理逻辑;
(自定义限流处理类 CustomerBlockHandler)
注:@SentinelResource 注解方式代理不支持 private 方法;
public class CustomerBlockHandler {
public static BaseResponse handleException(BlockException exception) {
return BaseResponse.returnSuccess("客户自定义限流处理信息....CustomerBlockHandler");
}
public static BaseResponse handleException2(BlockException exception) {
return BaseResponse.returnSuccess("客户自定义限流处理信息....CustomerBlockHandler2");
}
}
2)修改类 RateLimitController
blockHandlerClass 属性:指定自定义逻辑处理的类;
blockHandler 属性:指定需要处理的方法名;
@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "handleException2")
public BaseResponse CustomerBlockHandler() {
log.info("客户自定义限流处理逻辑");
return BaseResponse.returnSuccess(new Payment(2023, "serial003"));
}
3)配置资源名限流规则并测试
测试的请求地址:http://localhost:8401//rateLimit/customerBlockHandler
每秒请求此接口2次,触发流控规则,马上限流;
注:这里访问的地址就是@GetMapping 配置的请求处理方法,流控规则配置的就是注解@SentinelResource 的资源名(value属性)上的;