使用Netflix Feign和Hystrix设置请求超时

时间:2015-11-05 18:04:27

标签: hystrix netflix-feign

我正在使用Feign创建一个REST客户端。我的呼叫工作正常,但是我想添加一些超时支持,而且我很想知道如何做到这一点。

Feign的文档说“要使用带有Feign的Hystrix,请将Hystrix模块添加到类路径中。然后使用HystrixFeign构建器。”好的,现在我有了这个:

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

现在我的所有方法都返回HystrixCommands,我可以执行或排队,但我仍然看不到如何配置它们。

Hystrix wiki(https://github.com/Netflix/Hystrix/wiki/Configuration)表示应该将配置添加到HystrixCommand构造函数中,如下所示:

public HystrixCommandInstance(int id) {
super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
        .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
               .withExecutionTimeoutInMilliseconds(500)));
this.id = id;

但我的命令是由Feign构建/返回的,所以我无法访问构造函数。

另外值得注意的是Feign-Hystrix自述文件(https://github.com/Netflix/feign/tree/master/hystrix)说“要使用带有Feign的Hystrix,请将Hystrix模块添加到类路径中。然后,配置Feign以使用HystrixInvocationHandler”,但是谷歌搜索HystrixInvocationHandler指向非Netflix回购。即使我使用它,我也看不到如何配置Feign来使用它。

请告诉我,我是愚蠢的,这是非常简单的,这会让我感到高兴,因为我已经过了这个问题,并且因为无法自己解决而感到羞耻。

TL; DR:我想对我的Feign客户端提出的请求设置超时。怎么办?

1 个答案:

答案 0 :(得分:13)

事实证明,您可以使用com.netflix.config.ConfigurationManager(来自com.netflix.archaius:archaius-core)的实例设置Hystrix属性。

Feign使用方法名称作为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());
    }
}