【发布时间】:2017-07-23 15:36:28
【问题描述】:
我正在尝试使用 Ribbon + Feign + Hystrixspring-boot (1.5.1) 创建一些服务/strong>(我的服务发现是 spring-boot-zookeeper)并且我不使用 Zuul。
我(天真)认为它应该以下列方式工作:
调用 Feign 方法(由 @FeignClient 注释) - 它将其转换为一些 HTTP 请求,由 Ribbon 以某种方式负载均衡,因此如果发送请求失败,它会尝试(根据 Ribbon 配置,即 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 的结果回退,而不是预期的成功(功能区应该在其他服务上重试,不是吗?),直到功能区服务器列表更新。
任何人都可以解释它是如何一起工作的吗?
【问题讨论】:
标签: spring-boot apache-zookeeper hystrix spring-cloud-feign netflix-ribbon