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
- 不传递参数频繁调用
- 删除降级规则新增一条
QPS
为1
的流控规则
- 频繁访问接口导致限流
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;
}
注解属性
@SentinelResource
注解属性- 出自:https://www.itmuch.com/spring-cloud-alibaba/sentinel-resoure-annotation/
属性 | 作用 | 是否必须 |
---|---|---|
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 直接抛出。