SpringCloudAlibaba之Sentinel 自定义限流逻辑处理

文章介绍了如何使用@SentinelResource注解在SpringCloud中进行资源和URL限流,并展示了如何通过blockHandler属性定义自定义的限流处理逻辑。当未配置blockHandler时,系统会采用默认的限流处理。为了解决耦合和代码膨胀问题,文章提出了使用blockHandlerClass属性引用静态方法进行全局处理的方案,并给出了示例代码。
摘要由CSDN通过智能技术生成

@SentinelResource 自定义限流逻辑处理

​Sentinel 提供了@SentinelResource注解用于定义资源,并提供了AspectJ的扩展用于自定义资源,处理BlockException等。

案例复习

之前我们用过这个注解,同时了解了它的两个属性:

  • value:资源名称,必须项(唯一,不能为空)
  • blockHandler:对应处理BlockException的函数名称可选项.blockHandler函数访问需要public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为BlockException.blockHandler 函数默认需要和原方法在同一个类中

我们之前利用这个注解完成了热点规则的学习,同时做了一个案例,我们简单复习一下,这个案例的核心思想就是我们传递一个指定参数,然后通过注解@SentinelResource注解标注资源进行限流,当出现限流以后,通过blockHandler属性设置限流以后的解决方法。

在这里插入图片描述

其实这个注解不仅仅可以用到热点规则上,还可以用到流控上,我们可以做一个资源的流控和一个请求的流控,通过此注解来解决限流之后问题。

@SentinelResource 资源限流

核心点: 使用@SentinelResource注解的blockHandler属性,定义出现限流效果时的解决方法。

编写一个新的控制器类型SentinelResourceTestController,使用@SentinelResource注解同时使用blockHandler属性

@GetMapping("/byResource")
@SentinelResource(value = "byResource",blockHandler = "handler_resource")
public String byResource(){
    return "-----byResource";
}

public String handler_resource(BlockException exception){
    return "系统繁忙";
}

这里要注意一定要给byResource资源添加流控

在这里插入图片描述

具体规则

测试,测试我们去快速访问http://localhost:8401/byResource,就会出现我们使用@SentinelResource注解中blockHandler属性提供的解决限流异常的方法。

在这里插入图片描述

@SentinelResource URL限流

核心点: 使用@SentinelResource注解,但是不使用blockHandler属性,系统会调用默认限流异常处理方法。

其实这个注解,我们还可以更换请求地址为资源,比如我们在新建一个测试接口方法

@GetMapping("/byRest")
@SentinelResource(value = "/byRest")
public String byRest(){
    return "-----byRest";
}

给这个接口地址添加流控

在这里插入图片描述

此时如果没有自己定义限流处理方法,会走系统默认的

在这里插入图片描述

结论

  1. @SentinelResource 既可以配置资源名称也可以配置URL
  2. 如果配置了@SentinelResource的blockHandler属性对应方法,出现限流会调用对应方法
  3. 如果没有配置@SentinelResource的blockHandler属性,系统会走默认的限流处理。

自定义限流处理逻辑

其实我们在使用@SentinelResource注解这两种方案的时候,会出现一些问题:

  1. 没有体现我们自己的业务要求。
  2. 自定义处理方法和业务代码耦合在一起。
  3. 每个业务方法都添加一个限流处理方法,代码将会加剧膨胀。
  4. 无法实现统一全局处理。

解决:@SentinelResource除了blockHandler可以设置自定义限流处理逻辑方法以外,还提供另外一个属性来设置限流处理逻辑类型blockHandlerClass属性,此属性中设置的方法必需为 static 函数,否则无法解析。

具体逻辑

第一步

创建CustomerBlockHandler类型用于处理自定义限流处理逻辑,首先创建myhandler.CustomerBlockHandler

/**
 * 此类型用来处理限流自定义逻辑
 */
public class CustomerBlockHandler {
    public static String handlerException1(BlockException exception){
        return "handlerException1:系统异常,请稍后重试!";
    }
    public static String handlerException2(BlockException exception){
        return "handlerException2:网络崩溃了,请稍后重试!";
    }
}

第二步

我们在SentinelResourceTestController类型中添加一个接口方法,同时设置@SentinelResource注解和blockHandlerClass属性对应的类型和这个类型中对应的处理方法

/**
* 此方法用到了自定义限流处理类型CustomerBlockHandler
* 中的handlerException1方法来处理限流逻辑。
*/
@GetMapping("/bycustomer")
@SentinelResource(value = "bycustomer",
                  blockHandlerClass = CustomerBlockHandler.class,
                  blockHandler = "handlerException1")
public String bycustomer(){
    return "-----bycustomer";
}

第三步

测试:给bycustomer资源添加限流规则,然后来测试在超过限流阈值时处理方法是否为CustomerBlockHandler中handlerException1来进行处理。

在这里插入图片描述

在这里插入图片描述

添加流控规则以后,我们再来频繁访问http://localhost:8401/bycustomer,就会看见是CustomerBlockHandler类型的handlerException1方法来处理自定义限流逻辑

在这里插入图片描述

对应关系图

localhost:8401/bycustomer,就会看见是CustomerBlockHandler类型的handlerException1方法来处理自定义限流逻辑

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sentinel提供了两种方式来进行自定义限流: 1. 实现自定义限流规则 可以通过实现`com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser`接口来实现自定义限流规则。这个接口提供了一个方法`parseOrigin(HttpServletRequest request)`,通过这个方法可以获取请求的来源,开发者可以根据请求的来源来实现自定义限流规则。例如,可以根据请求的IP地址、用户ID等信息进行限流。 具体实现步骤如下: - 实现`RequestOriginParser`接口。 ```java public class CustomRequestOriginParser implements RequestOriginParser { @Override public String parseOrigin(HttpServletRequest request) { // 根据请求的IP地址限流 return request.getRemoteAddr(); } } ``` - 在`sentinel.properties`配置文件中指定自定义限流规则类。 ``` csp.sentinel.servlet.callback.requestOriginParser=com.example.CustomRequestOriginParser ``` 2. 实现自定义限流策略 Sentinel提供了`com.alibaba.csp.sentinel.slots.block.BlockException`类来表示限流异常,当一个请求被限流时,Sentinel会抛出这个异常。开发者可以通过实现`com.alibaba.csp.sentinel.adapter.servlet.callback.BlockExceptionHandler`接口来自定义限流策略。这个接口提供了一个方法`handle(HttpServletRequest request, HttpServletResponse response, BlockException e)`,通过这个方法可以获取被限流的请求和限流异常信息,开发者可以根据这些信息来实现自定义限流策略。例如,可以返回一个自定义的错误页面或者JSON格式的错误信息。 具体实现步骤如下: - 实现`BlockExceptionHandler`接口。 ```java public class CustomBlockExceptionHandler implements BlockExceptionHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception { // 返回一个自定义的错误页面 response.setContentType("text/html;charset=utf-8"); response.getWriter().write("<h1>请求被限流了,请稍后再试!</h1>"); } } ``` - 在`sentinel.properties`配置文件中指定自定义限流策略类。 ``` csp.sentinel.servlet.callback.blockExceptionHandler=com.example.CustomBlockExceptionHandler ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值