我们都知道Sentinel默认的回滚提示是Blocked by Sentinel
而且我也给大家演示了如何写自定义的回滚方法。
image.png
但是这样写还有一些问题:
①依照现有条件,我们自定义的处理方法又和业务代码耦合在一起,不直观。
②每个业务方法都要有一个自定义的回滚方法,很容易使代码膨胀加剧。
③没有体现全局的统一处理方法
针对这几个问题,Sentinel也是有解决方案的
1.新建统一的BlockHandler处理类
public class CustomerBlockHandler {
public static CommonResult handlerException(BlockException exception)
{
return new CommonResult(4444,"按客戶自定义,global handlerException----1");
}
public static CommonResult handlerException2(BlockException exception)
{
return new CommonResult(4444,"按客戶自定义,global handlerException----2");
}
}
CommonResult 是我自己写的自定义的统一返回对象,这个handler里面有两个方法,分别打印的---1和---2。
2.新建一个测试的controller方法
@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",
blockHandlerClass = CustomerBlockHandler.class,
blockHandler = "handlerException2")
public CommonResult customerBlockHandler()
{
return new CommonResult(200,"按客戶自定义",new Payment(2020L,"serial003"));
}
SentinelResource属性说明:
value是资源名,可以通过sentinel控制台直接配置资源名来进行限流
blockHandlerClass是配置我们的全局统一回滚方法的处理类。
blockHandler配置的是具体的方法。
image.png
3.在sentinel控制台新增一个流控规则
image.png
可以看到我们配置是@SentinelResource里面的资源名,而不是GetMapping。
4.测试
正常发送一下是没有问题的
image.png
接下来观察流控的效果
image.png
可以看到返回的是统一回滚方法里面的第二个方法,说明我们的配置是生效的。