Sentinel | 降级

2020-07-23  本文已影响0人  乌鲁木齐001号程序员

下游服务挂了造成雪崩

微服务间的依赖.png

熔断器

熔断器的加入.png

熔断器详解图

熔断器详解图.png

降级

用代码配置 Sentinel 的熔断规则

Sentinel 的三种失败指标
代码
@Component
public class SentinelConfig implements ApplicationListener<ContextRefreshedEvent> {

    /**
     * 整个系统启动好了之后,会这行整个方法;
     * 这里要声明一个规则;
     * 这里是用代码的方式控制规则的制定,这种方式的控制程度是最高的,所有的细节都可以控制,缺点就是麻烦;
     * @param contextRefreshedEvent
     */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        fusingRule();
    }

    /**
     * 熔断规则
     */
    private void fusingRule() {
        DegradeRule rule = new DegradeRule();
        rule.setResource("createOrder");

        // 1s 内的请求数超过 5 的情况下,响应时间超过多少,打开熔断器;
        rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);

        // 如果响应时间超过 10ms,就记一次数;如果 1s 内有 5 个请求,5 个请求都超时了,就熔断;
        rule.setCount(10);

        // 熔断的持续时间为 10s,熔断时间超过 10s 就进入半打开状态;
        rule.setTimeWindow(10);

        List<DegradeRule> degradeRules = new ArrayList<>();
        degradeRules.add(rule);
        DegradeRuleManager.loadRules(degradeRules);
    }

}

使用 Sentinel 实现降级

正常的业务方法
@PostMapping
@PreAuthorize("hasRole('ROLE_ADMIN')")
@SentinelResource(value = "createOrder", blockHandler = "doOnBlock")
public OrderInfo create(@RequestBody OrderInfo info, @AuthenticationPrincipal String username)
        throws InterruptedException {

    // 这里的代码就是资源 createOrder
    log.info("user is " + username);

    Thread.sleep(50);

    return info;
}
发生熔断后的降级方法
/**
 * 降级方法:一定是 public,返回值和参数要和
 * @SentinelResource(value = "createOrder", blockHandler = "doOnBlock") 标记的方法一样,只是多出一个参数;
 * @param info
 * @param username
 * @param exception
 * @return
 * @throws InterruptedException
 */
public OrderInfo doOnBlock(@RequestBody OrderInfo info,
                           @AuthenticationPrincipal String username,
                           BlockException exception) throws InterruptedException {

    // 降级逻辑,比如返回预先准备好的数据啥的
    log.info("Blocked by : " + exception.getClass().getSimpleName());

    return info;
}
上一篇 下一篇

猜你喜欢

热点阅读