我試圖用絲帶 + 假死 + 蝟春季啓動(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。經過一番思考,我決定解決它不同的問題:爲了改善健康指標,所以「不好的服務」將被標記爲不健康快速,並且將通過列表中的服務發現而被移除。我仍然遇到服務速度慢的「問題」,但也許我應該定義什麼是緩慢的,並再次將其標記爲「糟糕的」服務。 –