@SentinelResource注解不生效问题
第一步、添加依赖
<!-- 如果要使用@SentinelResource必须添加此依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.8.1</version>
</dependency>
第二步、添加bean(SentinelResourceAspect)【本实例放在了启动类中】
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
第三步、代码实现
/**
* <h1>spring 初始化方法</h1>
* <h1>@PostConstruct是Spring带的,当前这个bean在被spring容器创建的时候,就会自动的调用
* 被@PostConstruct这个注解修饰的方法进行初始化</h1>
*/
@PostConstruct // init-method
private static void initFlowRules() {
// 流控规则
List<FlowRule> rules = new ArrayList<>();
// 流控
FlowRule ruleUser = new FlowRule();
// 为哪个资源进行流控
ruleUser.setResource(USER_NAME);
// 设置流控规则类型 sQPS
ruleUser.setGrade(RuleConstant.FLOW_GRADE_QPS);
// 设置受保护的资源阙值
ruleUser.setCount(1);
rules.add(ruleUser);
// 加载配置好的规则
FlowRuleManager.loadRules(rules);
}
/**
* <h1>
*
* @param id
* @return
* @SentinelResource 改善接口中资源定义和被流控降级后的处理方法
* value 是定义资源
* blockHandler 设置被流控降级后的处理方法(默认该方法必须声明在同一个类中)
* fallback 当接口中出现了异常,就可以交给fallback指定的方法进行处理
*
* </h1>
*/
@RequestMapping(value = "/user")
@SentinelResource(value = USER_NAME, fallback = "fallBackHandleForGetUser", blockHandler = "blockHandlerForGetUser")
public User getUser(@RequestParam("id") String id) {
int a = 1 / 0;
return new User(id);
}
/**
* getUser接口出现了异常,交由他处理
*
* @param id
* @param e
* @return
*/
public User fallBackHandleForGetUser(String id, Throwable e) {
e.printStackTrace();
return new User("异常处理");
}
/**
* <h1>
* 注意:
* 1、一定要是public
* 2、返回值一定要和源方法保证一致,包含源方法的参数
* 3、可以在参数的最后添加BlockException 可以区分是什么规则的处理方法
* </h1>
*
* @param id 源方法的参数
* @param e 异常处理
* @return {@link User}
*/
public User blockHandlerForGetUser(String id, BlockException e) {
e.printStackTrace();
System.out.println(id + "被限流了");
return new User(id + "被限流了");
}
**注意:以上必须满足,之前由于没有添加Bean(SentinelResourceAspect)导致注解@SentinelResource不生效,还有一个问题是@SentinelResource中异常是BlockException,而不是BlockedException,请注意区别 **