Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。
注意:注解方式埋点不支持 private 方法。
【1】资源名称限流
① controller方法
@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 服务不可用");
}
这里 blockHandler 指定了超出规则限制后的处理方法handleException。
② 添加流控规则
如下所示,我们对 byResource 这个资源添加规则设置QPS/1。那么当请求QPS>1时,就会触发我们的 blockHandler = handleException 方法,返回错误信息。
其默认也支持根据URL进行限流,如下图所示,当我们访问了http://localhost:8401/byResource 时,簇点链路界面自动会有两个资源:/byResource
和 byResource
。
不建议同时对URL和自定义命名资源添加规则,会导致混乱。
URL流控限制不会使用我们自定义的blockHandler 方法,会返回默认的 Blocked by Sentinel (flow limiting)
。