我正在尝试使用Ribbon + Feign + Hystrix使用spring-boot(1.5.1)创建一些服务(并且我的服务发现是 spring -boot- zookeeper)并且我不使用 Zuul。
我(天真)认为它应该以下列方式工作:
调用 Feign 方法(@FeignClient
由myservice.ribbon.MaxAutoRetriesNextServer=2
名称,最后如果所有重试都失败 - 它调用 Hystrix 后备方法。
所以我的 Feign 界面
@FeignClient(value = "myservice", fallbackFactory = HystrixMyServiceFallbackFactory.class)
@RibbonClient(name = "myservice")
public interface MyServiceClient {
@RequestMapping(value = "/foo", method = RequestMethod.POST)
Response foo(Object data);
}
定义 Hystrix FallbackFactory 以返回一些默认响应
public class HystrixMyServiceFallbackFactory implements FallbackFactory<MyServiceClient > {
@Override
public MyServiceClient create(final Throwable throwable) {
return new MyServiceClient () {
@Override
public Response foo(Object data) {
return new Response(-1, "Failed");
}
};
}
}
在我的代码的某处,我有以下几行:
@Autowired
private MyServiceClient myServiceClient;
public Response doSomething() {
return myServiceClient.foo(new Object());
}
当所有服务都启动时(我有 2 个 MyService),Ribbon 可以很好地使用 Round Robbin,但是当我关闭一个 MyService 实例时,Ribbon 继续使用 Round Robbin,所以每第二次尝试,我都会收到 Hystrix Fallback 的结果,而不是预期成功(功能区应该在其他服务上重试,不是吗?),直到功能区服务器列表更新。
任何人都可以解释它是如何一起工作的吗?