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 方法,返回错误信息。

SpringCloud Alibaba Sentinel中@SentinelResource使用实践总结_spring cloud

SpringCloud Alibaba Sentinel中@SentinelResource使用实践总结_处理方法_02

其默认也支持根据URL进行限流,如下图所示,当我们访问了http://localhost:8401/byResource 时,簇点链路界面自动会有两个资源:/byResourcebyResource

不建议同时对URL和自定义命名资源添加规则,会导致混乱。

SpringCloud Alibaba Sentinel中@SentinelResource使用实践总结_sentinel_03

URL流控限制不会使用我们自定义的blockHandler 方法,会返回默认的 Blocked by Sentinel (flow limiting)