Hystrix-多级降级

通常情况下,我们在command里的getFallback()做降级处理。在getFallback()里,我们可以再套一个command作为第一级降级策略,而这个command的fallback就是第二级降级策略。下面我们直接通过代码来看下多级降级的实现。

一、创建command

public class CommandMultiLevelFallback extends HystrixCommand {
  private String tag;

  public CommandMultiLevelFallback(String tag) {
    super(HystrixCommandGroupKey.Factory.asKey("CommandMultiLevelFallback"));
    this.tag = tag;
  }

  @Override
  protected String run() throws Exception {
    if ("error".equals(tag)) {
      throw new Exception("CommandMultiLevelFallback执行失败,降级处理");
    }
    return "成功";
  }

  @Override
  protected String getFallback() {
    return new FirstLevelFallbackCommand(tag).execute();
  }

  private static class FirstLevelFallbackCommand extends HystrixCommand {

    private String tag;

    public FirstLevelFallbackCommand(String tag) {
      // 第一级的降级策略,因为这个command是运行在fallback中的
      // 所以至关重要的一点是,在做多级降级的时候,要将降级command的线程池单独做一个出来
      // 如果主流程的command都失败了,可能线程池都已经被占满了
      // 降级command必须用自己的独立的线程池
      super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("FirstLevelFallbackCommand")));
      this.tag = tag;
    }

    @Override
    protected String run() throws Exception {
      if ("error".equals(tag)) {
        throw new Exception("一级降级失败,二级降级处理");
      }
      return "成功";
    }

    @Override
    protected String getFallback() {
      // 第二级降级策略,第一级降级策略,都失败了。实际项目中,通常会在这里做残缺降级。
      System.out.println("二级降级执行成功");
      return "成功";
    }

  }

}

二、执行command

public class CommandMultiLevelFallbackTest {

  public static void main(String[] args) {
    CommandMultiLevelFallback multiLevelFallback = new CommandMultiLevelFallback("error");
    multiLevelFallback.execute();
  }
}

三、执行结果

 

 

你可能感兴趣的:(SpringCloud)