2

我試圖用絲帶 + 假死 + 春季啓動(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的結果,而不是預期的成功(功能區應該在其他服務上重試,不是嗎?),直到功能區服務器列表已更新。

任何人都可以解釋它是如何在一起工作的?

回答

1

這可能是你在找什麼:https://stackoverflow.com/a/29171396/873590

如果您使用的色帶,您可以設置類似 性能以下(替換爲您服務ID「localapp」):

localapp.ribbon.MaxAutoRetries=5 
localapp.ribbon.MaxAutoRetriesNextServer=5 
localapp.ribbon.OkToRetryOnAllOperations=true 
0

有幾件事情需要檢查。

首先,檢查你的maven/gradle文件是否具有spring-retry依賴關係。 Feign + Ribbon重試需要spring-retry,現在它是可選的依賴關係。因此,如果您的應用程序沒有spring-retry,則不支持重試。

如果在應用spring-retry後沒有發生重試,則需要檢查原始異常消息。要做到這一點,請刪除回退並檢查信息。 如果消息有myservice timed-out,則表示發生了hystrix超時異常。

Hystrix timeout是默認的1000ms,有時如果您的讀取/連接超時時間過長,則不足以重試http請求。如果是這樣,請嘗試像下面那樣調整hystrix超時。

hystrix: 
    command: 
    default: 
     execution: 
     isolation: 
      thread: 
      timeoutInMilliseconds: 10000 

上述屬性會將您的hystrix的所有默認超時更改爲10秒,並且通常足夠大。您需要使用正確的值設置此值,以便有足夠的時間進行重試。

您還可以更改特定斷路器的hystrix超時。在Feign的情況下,每種方法都會有自己的斷路器,它的名稱就像下面的例子。

MyServiceClient#foo(Object) 

所以你可以像下面那樣改變你的斷路器的超時時間。

hystrix: 
    command: 
    MyServiceClient#foo(Object): 
     execution: 
     isolation: 
      thread: 
      timeoutInMilliseconds: 10000 
+0

Thx,我找到了這個配置。但在我看來,它在微服務環境中可能會有點問題。如果我有5個「服務」,其中2個很慢,它不會解決我的問題:或者我將禁用所有「服務」組件(通過Hystrix)或禁用hystrix。經過一番思考,我決定解決它不同的問題:爲了改善健康指標,所以「不好的服務」將被標記爲不健康快速,並且將通過列表中的服務發現而被移除。我仍然遇到服務速度慢的「問題」,但也許我應該定義什麼是緩慢的,並再次將其標記爲「糟糕的」服務。 –

相關問題