Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了 AspectJ 的扩展用于自动定义资源、处理 BlockException 等。
注意:注解方式埋点不支持 private 方法。
官网地址:注解埋点支持
本文代码版本:
<spring.boot.version>3.1.7</spring.boot.version>
<spring.cloud.version>2022.0.4</spring.cloud.version>
<spring.cloud.alibaba.version>2022.0.0.0-RC2</spring.cloud.alibaba.version>
【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)
。
【2】抽离blockHandler
也就是将blockHandler处理从业务类抽离出来,单独放在一个异常处理类比如CustomerBlockHandler。
如下所示修改业务方法:
@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",
blockHandlerClass =