我试图用丝带 + 假死 + 猬春季启动(1.5.1)创建一些服务(和我的服务发现是弹簧boot- 饲养员)和我不't使用Zuul。Spring Boot Cloud + Ribbon + Feign + Hystrix + Zookeeper:重试和失败是怎么回事?
我(幼稚)认为它应该在以下方式工作:
调用假死法(@FeignClient
注解) - 它把它转换成这是负载在由丝带某种方式平衡一些HTTP请求,所以如果发送请求失败,它会尝试(根据功能区配置,即myservice.ribbon.MaxAutoRetriesNextServer=2
)在相同类型/名称的下一个服务上重试,最后如果所有重试失败 - 则调用Hystrix回退方法。
所以我假死接口
@FeignClient(value = "myservice", fallbackFactory = HystrixMyServiceFallbackFactory.class)
@RibbonClient(name = "myservice")
public interface MyServiceClient {
@RequestMapping(value = "/foo", method = RequestMethod.POST)
Response foo(Object data);
}
定义猬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,因此每次尝试都会收到Hystrix Fallback的结果,而不是预期的成功(功能区应该在其他服务上重试,不是吗?),直到功能区服务器列表已更新。
任何人都可以解释它是如何在一起工作的?
Thx,我找到了这个配置。但在我看来,它在微服务环境中可能会有点问题。如果我有5个“服务”,其中2个很慢,它不会解决我的问题:或者我将禁用所有“服务”组件(通过Hystrix)或禁用hystrix。经过一番思考,我决定解决它不同的问题:为了改善健康指标,所以“不好的服务”将被标记为不健康快速,并且将通过列表中的服务发现而被移除。我仍然遇到服务速度慢的“问题”,但也许我应该定义什么是缓慢的,并再次将其标记为“糟糕的”服务。 –