OpenFeign + Hystrix - 不同客户端的不同超时

OpenFeign + Hystrix - Different timeout for different clients

我在我的 Spring 启动应用程序中使用 Hystrix 和 Feign。

我已经将 Hystrix 的默认超时设置为 10000 毫秒:

feign:
  hystrix:
    enabled: true

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

问题是我有一个客户端,我们称它为 HeavyClient,这是一个繁重的调用,有时会花费更多时间并导致断路。 我只想为这个人增加 Hystrix 中的超时上限。可能吗?

我试过使用 Feign 属性,例如:

feign:
  client:
    config:
      HeavyClient:
        connectTimeout: 30000
        readTimeout: 30000

但这不起作用。我猜 Hystrix 不会检查 Feign 属性。

我正在使用:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

感谢任何帮助,谢谢!

在周转和更深入的搜索之后,我在 this GitHub issue 上发现 Hystrix 命令的默认命名有些丑陋,例如 InterfaceName#methodNameSignature()

因此,例如,给出以下 @FeignClient

@FeignClient(name = "heavyClient", url = "${heavyclient.url}")
public interface HeavyClient {
    
    @RequestMapping("/process/{operation}")
    public ResponseEntity<Response> process(@PathVariable("operation") String operation);
    
}

配置为:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000
    HeavyClient#process(String):
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 30000

不幸的是,这对我不起作用...不知道为什么... =s 所以为了解决这个问题,我注册了一个类型为 SetterFactory 的 bean,它将创建给定 @FeignClient 名称的命令键:

    @Bean
    public SetterFactory setterFactory() {
        return (target, method) -> HystrixCommand.Setter
                .withGroupKey(HystrixCommandGroupKey.Factory.asKey(target.name()))
                .andCommandKey(HystrixCommandKey.Factory.asKey(target.name()));
    }

然后我可以像这样简单地使用配置:

hystrix:
  command:
    heavyClient:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 30000

CircuitBreakerNameResolver将电路命名为HystrixCommandKey,有一个默认实现DefaultCircuitBreakerNameResolver,输出键模式是HardCodedTarget#methodName(ParamClass),所以你可以自定义CircuitBreakerNameResolver而不是DefaultCircuitBreakerNameResolver.