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);
}
}
我的应用有一组可配置(在运行时)的外部端点来调用:
/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);
}
}