2015-11-05 139 views
5

我使用Feign創建REST客戶端。我有我的通話工作,但我想增加一些超時支持,我有一段時間搞清楚如何做到這一點。使用Netflix Feign和Hystrix設置請求超時

Feign的文檔中提到「要將Hystrix與Feign一起使用,請將Hystrix模塊添加到您的類路徑中,然後使用HystrixFeign構建器。」好了,現在我已經得到了這一點:

service = HystrixFeign.builder() 
        .decoder(new GsonDecoder()) 
        .target(ProjectService.class, URL_TO_BE_MOVED_TO_PROPS); 

的我的方法現在所有正在返回HystrixCommands,我可以執行或排隊,但我仍然無法看到它們的配置。

的豪豬維基(https://github.com/Netflix/Hystrix/wiki/Configuration)說,配置應該被添加到HystrixCommand構造是這樣的:

但我的命令,正在興建/通過假死的回報,所以我沒有訪問構造函數。

一個更值得注意的事情是,假死,蝟自述(https://github.com/Netflix/feign/tree/master/hystrix)說:「要以假死使用蝟中,蝟模塊添加到您的類路徑中。然後,配置假死使用HystrixInvocationHandler」,但谷歌搜索HystrixInvocationHandler指向我的非Netflix回購。即使我使用它,我也不知道如何配置Feign來使用它。

請告訴我,我很愚蠢,這是超級簡單的,這會讓我感到高興,我已經過去了這個問題,並且因爲無法自己弄清楚而感到羞恥。

TL; DR:我想設置我的Feign客戶端發出的請求超時。怎麼做?

回答

11

原來,您可以使用com.netflix.config.ConfigurationManager(來自com.netflix.archaius:archaius-core)的實例來設置Hystrix屬性。

假死使用方法名作爲HystrixCommandKeys,這樣你就可以使用這些名稱訪問它們的屬性:

ConfigurationManager.getConfigInstance().setProperty("hystrix.command." + methodName + ".execution.isolation.thread.timeoutInMilliseconds", 1500); 

這是假設你使用HystrixFeign來構建你的客戶端,它封裝在HystrixCommand對象每次調用。

爲了簡化,我創造了我的方法循環,​​這樣我可以申請超時服務範圍:

private void configureHystrix() { 
    Method[] methods = ProjectService.class.getMethods(); 

    String methodName; 
    for(int i = 0; i < methods.length; i++) { 
     methodName = methods[i].getName(); 
     ConfigurationManager.getConfigInstance().setProperty(String.format("hystrix.command.%s.execution.isolation.thread.timeoutInMilliseconds", methodName), config.getTimeoutInMillis()); 
    } 
} 
+0

爲我工作。我設置了默認值而不是特定的方法。 'ConfigurationManager.getConfigInstance()。setProperty(「hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds」,5000);' – n0daft

+0

你究竟在哪裏運行這行代碼?無論我如何設置,我所有假客戶端的超時時間仍爲1000毫秒。 – bitsofinfo

+0

我的'configureHystrix()'方法在我使用HystrixFeign構造我的代理後運行: serviceProxy = HystrixFeign.builder()。client(new OkHttpClient()) .target(ProjectServiceProxy.class,config.getHostURL() ); configureHystrix(); – Disgruntor