SpringCloudAlibaba - @SentinelResource注解的使用

前言

@SentinelResource用于定义Sentinel资源


具体使用

简单示例

  • SentinelResourceController.java
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description @SentinelResource 使用示例
 */
@RestController
@RequestMapping("/sentinel_resource")
@Slf4j
public class SentinelResourceController {

    @GetMapping("/test")
    @SentinelResource(value = "sentinel_resource_test", blockHandler = "block")
    public String test(@RequestParam(required = false) String name) {
        if (StringUtils.isBlank(name)) {
            throw new IllegalArgumentException("name不能为空");
        }
        return name;
    }

	/**
     * 处理限流或降级
     * @param a
     * @param e
     * @return
     */
    public String block(String a, BlockException e) {
        log.warn("限流,或者降级了", e);
        return "限流,或者降级了 block";
    }

	/**
     * 处理降级
     * @param a
     * @return
     */
    public String fallback(String a) {
        log.warn("限流,或者降级了 fallback");
        return "限流,或者降级了 fallback";
    }

}
  • /sentinel_resource/test接口访问

在这里插入图片描述


  • 新增一条降级规则,异常比例阈值为0.1

在这里插入图片描述

  • 不传递参数频繁调用

在这里插入图片描述


  • 删除降级规则新增一条QPS1的流控规则

在这里插入图片描述

  • 频繁访问接口导致限流

在这里插入图片描述



blockHandlerClass 单独配置

  • TestBlockHandler.java
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class TestBlockHandler {
    /**
     * 处理限流或者降级
     * @param name
     * @param e
     * @return
     */
    public static String block(String name, BlockException e) {
        log.warn("限流,或者降级了 block", e);
        return "限流,或者降级了 block";
    }
}
  • SentinelResourceController.java
@GetMapping("/test")
@SentinelResource(
        value = "sentinel_resource_test",
        blockHandler = "block",
        blockHandlerClass = TestBlockHandler.class,
        fallback = "fallback"
)
public String test(@RequestParam(required = false) String name) {
    if (StringUtils.isBlank(name)) {
        throw new IllegalArgumentException("name不能为空");
    }
    return name;
}

注解属性

属性 作用 是否必须
value 资源名称
entryType entry类型,标记流量的方向,取值IN/OUT,默认是OUT
blockHandler 处理BlockException的函数名称,函数要求:
1. 必须是 public
2.返回类型与原方法一致
3. 参数类型需要和原方法相匹配,并在最后加 BlockException 类型的参数。
4. 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 blockHandlerClass ,并指定blockHandlerClass里面的方法
blockHandlerClass 存放blockHandler的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同blockHandler。
fallback 用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。函数要求:
1. 返回类型与原方法一致
2. 参数类型需要和原方法相匹配,Sentinel 1.6开始,也可在方法最后加 Throwable 类型的参数。
3.默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定fallbackClass里面的方法。
fallbackClass 存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。
defaultFallback 用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:
1. 返回类型与原方法一致
2. 方法参数列表为空,或者有一个 Throwable 类型的参数。
3. 默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定 fallbackClass 里面的方法。
exceptionsToIgnore 指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。
exceptionsToTrace 需要trace的异常 Throwable

注:若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandler、fallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出。



- End -
白嫖有风险
点赞加收藏
posted @ 2021-09-26 16:42  Maggieq8324  阅读(138)  评论(0编辑  收藏  举报