服务降级
采用 @SentinelResource 注解方式实现, 必要的依赖必须引入 以及 切面Bean
接口代码
java
@RequestMapping("/degrade")
@SentinelResource(value = DEGRADE_RESOURCE_NAME, blockHandler = "blockHandlerForDegrade",
entryType = EntryType.IN)
public User degrade(String id) {
// 异常
throw new RuntimeException("异常");
}
降级处理
注意: 方法的访问权限、参数格式 和 流控的一致
java
public User blockHandlerForDegrade(String id, BlockException be) {
logger.info("++++++++服务降级");
return new User(id, "服务降级了!!!");
}
降级规则
java
@PostConstruct
private static void initDegradeRules() { // 通常设置在服务调用端
List<DegradeRule> degradeRuleList = new ArrayList<>();
DegradeRule degradeRule = new DegradeRule();
// 设置资源名称
degradeRule.setResource(DEGRADE_RESOURCE_NAME);
// 设置规则策略 -> 异常数
degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);
// 触发熔断异常数量
degradeRule.setCount(2);
// 熔断时长 单位:秒
// 一旦触发熔断,再次请求对应的接口会调用降级处理方法
// 熔断时长过后--半开状态: 恢复接口请求调用, 如果一次请求就异常, 再次熔断, 不会根据设置来计算是否熔断
degradeRule.setTimeWindow(10);
// 触发熔断最小请求数
degradeRule.setMinRequestAmount(2);
// 统计时长 单位:毫秒 默认:1000ms
degradeRule.setStatIntervalMs(60 * 1000 );
// 一分钟内: 执行下了两次 出现了两次异常 就会触发熔断
degradeRuleList.add(degradeRule);
DegradeRuleManager.loadRules(degradeRuleList);
}
效果
- 连续三次异常后服务被降级
- 再进行访问还是异常,再次访问直接降级