Hystrix class 每个命令?

Hystrix class per command?

我的应用有一组可配置(在运行时)的外部端点来调用:

/foo
/bar

并用于使用 apache HttpClient 进行 http 调用。

我想在这里使用 Hystrix 包装 HttpClient,但我想为每个端点分开断路器,这样如果一个失败,它不会影响其他。

我可以通过 2 classes:

FooCommand extends HystrixCommand<...> {
}

BarCommand extends HystrixCommand<...> {
}

但这是一个硬编码的解决方案,阻止我在运行时动态配置它。

我如何构建单个 hystrix 命令 class 来实现此目的?

理想情况下是这样的:

class MyHystrixHttpClient extends HystrixCommand<Data> {
    public MyHystrixHttpClient(String endpoint) {
        // here somehow tell hystrix to use "endpoint" string getHash() as a grouping key
    }
}

那么我可以这样使用它:

new MyHystrixHttpClient("/foo").execute(); // (1)
new MyHystrixHttpClient("/bar").execute(); // (2)

如果 (1) 失败,(2) 仍将被单独执行和处理

您可以在构造函数中设置命令键。像这样。

public class HttpCommand extends HystrixCommand<HttpResponse> {

  private final HttpClient httpClient;
  private final HttpRequestBase request;

  public HttpCommand(String commandKey, HttpClient httpClient, HttpRequestBase request) {
    super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("HttpGroup"))
        .andCommandKey(HystrixCommandKey.Factory.asKey(commandKey)));
    this.httpClient = httpClient;
    this.request = request;
  }

  @Override
  protected HttpResponse run() throws Exception {
    return httpClient.execute(request);
  }

}