我正在维护一种可能与至少80个外部服务进行通信的体系结构,并且我们在这些服务上使用Hystrix。
这些服务有一些共同点:其中一些服务的后端具有相同的后端-意味着与它们通信的方式是相同的,因此我们有一个与它们通信的驱动程序类,唯一改变的是IP地址。我们在该驱动程序中使用一个HystrixCommand。
我的问题从这里开始。如果具有相同后端的那些服务之一变得不稳定,那么Hystrix会破坏所有其他服务,而不是我们想要的那个服务。
据我了解,我实际上需要为其中每个创建一个HystrixCommand。
这实际上是我需要做的?我需要创建80个HystrixCommand实现吗?关于如何避免需要创建所有这80个HystrixCommands的任何建议?
好,所以我设法解决了我的问题。
我犯了一个错误,就是没有命名HystrixCommand。
默认情况下,命令名称是从类名称派生的:
getClass().getSimpleName();
因此,所有服务都有一个HystrixCommand,导致所有这些服务断路。
通过命名HystrixCommand,即使许多不同的服务使用相同的驱动程序类,我也可以通过服务达到我想要的隔离级别。我只需要根据外部服务的名称来命名命令。
要显式定义名称,请通过HystrixCommand或HystrixObservableCommand构造函数将其传入:
public CommandHelloWorld(String name) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
.andCommandKey(HystrixCommandKey.Factory.asKey("HelloWorld")));
this.name = name;
}
来源:https://github.com/Netflix/Hystrix/wiki/How-To-Use#command-name