服务降级
采用 @SentinelResource 注解方式实现, 必要的 依赖必须引入 以及 切面Bean
接口代码
@RequestMapping("/degrade")@SentinelResource(value = DEGRADE_RESOURCE_NAME, blockHandler = "blockHandlerForDegrade",entryType = EntryType.IN)public User degrade(String id) {// 异常throw new RuntimeException("异常");}
降级处理
注意: 方法的访问权限、参数格式 和 流控的一致
public User blockHandlerForDegrade(String id, BlockException be) {logger.info("++++++++服务降级");return new User(id, "服务降级了!!!");}
降级规则
@PostConstructprivate 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);// 统计时长 单位:毫秒 默认:1000msdegradeRule.setStatIntervalMs(60 * 1000 );// 一分钟内: 执行下了两次 出现了两次异常 就会触发熔断degradeRuleList.add(degradeRule);DegradeRuleManager.loadRules(degradeRuleList);}
效果
- 连续三次异常后服务被降级
- 再进行访问还是异常,再次访问直接降级