Sentinel限流-@SentinelResource注解配置

文章讲述了如何使用Sentinel进行资源名限流规则配置,并通过`@SentinelResource`注解的`blockHandler`属性实现自定义异常处理方法。当流量超过限制时,系统会返回自定义的错误信息。此外,还讨论了blockHandler存在的问题以及如何通过创建自定义处理类来实现全局统一的异常处理逻辑。
摘要由CSDN通过智能技术生成

@SentinelResource 配置-上 (按资源名配置限流规则)

1) Sentinel 控制台配置流控规则:

2)java 代码:

    @GetMapping("/byResource")
    @SentinelResource(value = "byResource", blockHandler = "handException")
    public BaseResponse byResource() {
        log.info("按资源名限流ok");
        return BaseResponse.returnSuccess(new Payment(2023, "serial001"));
    }

    public BaseResponse handException(BlockException exception) {
        return BaseResponse.returnFault(exception.getClass().getCanonicalName() + "\t 服务不可用");
    }

3)测试-按资源名限流-提示自定义异常信息:

根据上述配置的流控规则:每秒只支持一个请求访问资源 byResource,超过就会限流;

我们每秒请求2次,系统对请求资源限流,返回自定义的错误信息,而不是默认的流控提示信息;

为什么返回的是自定义的信息呢??

因为 @SentinelResource(value = "byResource", blockHandler = "handException") 中 blockHandler 属性配置的方法 handException是兜底方法;请求不符合流控规则就会触发 blockHandler 属性配置的方法;

 http://localhost:8401/byResource

4)测试-提示系统默认的异常信息

 也可以直接使用 @SentinelResource(value = "byUrl"),不配置 blockHandler 属性,再对 /rateLimit/byUrl 配置流控规则,请求不符合流控规则提示信息则是Sentinel默认的报错信息,而不是我们类似上面的自定义报错信息;

    @GetMapping("/rateLimit/byUrl")
    @SentinelResource(value = "byUrl")
    public BaseResponse byUrl() {
        log.info("按url限流测试ok");
        return BaseResponse.returnSuccess(new Payment(2023, "serial002"));
    }

 @SentinelResource 配置-中、下

 blockHandler属性配置的兜底方案面临的问题:

a、没有提现我们自己的业务要求;

b、依照现有条件,我们自定义的处理方法又和业务代码耦合在一块,不直观;

c、每个业务方法都加一个兜底的方法,那代码膨胀加剧;

d、全局统一的方法没有体现;

如何解决上面面临的问题??(自定义统一异常处理逻辑)

1)创建CustomerBlockHandler类用于自定义限流处理逻辑;

(自定义限流处理类 CustomerBlockHandler)

注:@SentinelResource 注解方式代理不支持 private 方法;

public class CustomerBlockHandler {

    public static BaseResponse handleException(BlockException exception) {
        return BaseResponse.returnSuccess("客户自定义限流处理信息....CustomerBlockHandler");
    }
    public static BaseResponse handleException2(BlockException exception) {
        return BaseResponse.returnSuccess("客户自定义限流处理信息....CustomerBlockHandler2");
    }
}

2)修改类 RateLimitController

blockHandlerClass 属性:指定自定义逻辑处理的类;

blockHandler 属性:指定需要处理的方法名;

@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",blockHandlerClass = CustomerBlockHandler.class,blockHandler = "handleException2")
public BaseResponse CustomerBlockHandler() {
        log.info("客户自定义限流处理逻辑");
        return BaseResponse.returnSuccess(new Payment(2023, "serial003"));
 }

 3)配置资源名限流规则并测试

 测试的请求地址:http://localhost:8401//rateLimit/customerBlockHandler

 每秒请求此接口2次,触发流控规则,马上限流;

注:这里访问的地址就是@GetMapping 配置的请求处理方法,流控规则配置的就是注解@SentinelResource 的资源名(value属性)上的;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值