@SentinelResource注解在​​Sentinel热点key​​中有出现过!这个注解和HystrixCommand是相似的,废话不多说,开始进入正题

编写测试代码

@RestController
public class RateLimitController
{
@GetMapping("/byResource")
@SentinelResource(value = "byResource",blockHandler = "handleException")
public CommonResult byResource()
{
return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001"));
}
public CommonResult handleException(BlockException exception)
{
return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");
}
}

访问测试

SentinelResource注解配置_处理方法


添加限流

SentinelResource注解配置_限流_02


访问测试

SentinelResource注解配置_处理方法_03


流控生效,这里返回的message中的com.alibaba.csp.sentinel.slots.block.flow.FlowException,这个类就是处理限流后的异常,上面设置的QPS限流阈值是1,也就是1秒钟只允许一个请求访问,如果超过这个阈值后FlowException将会处理这个异常

默认流控返回
添加测试代码

@GetMapping("/rateLimit/byUrl")
@SentinelResource(value = "byUrl")
public CommonResult byUrl()
{
return new CommonResult(200,"按url限流测试OK",new Payment(2020L,"serial002"));
}

这里是没有兜底方法的

添加流控规则

SentinelResource注解配置_处理方法_04


访问测试

SentinelResource注解配置_处理方法_05


超过限制阈值后没有编写兜底方法,那么将采用系统默认的兜底方法返回提示!

集中处理兜底方法
创建CustomerBlockHandler

/**
* @description: 集中处理兜底方法
* @author TAO
* @date 2020/12/29 12:48
*/
public class CustomerBlockHandler {

public static CommonResult handleException(BlockException exception) {
return new CommonResult(2020, "自定义限流处理信息....CustomerBlockHandler");

}
}

controller

@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",
blockHandlerClass = CustomerBlockHandler.class,
blockHandler = "handlerException2")
public CommonResult customerBlockHandler()
{
return new CommonResult(200,"按客戶自定义",new Payment(2020L,"serial003"));
}

blockHandlerClass 设置集中处理的类,blockHandler选择限流处理方法

添加流控规则

SentinelResource注解配置_处理方法_06


访问测试

SentinelResource注解配置_处理方法_07


那么这里就可以让代码接口,防止代码过于臃肿,可以多个请求对应同一个兜底方法详情

SentinelResource注解配置_限流_08


​注解支持​