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

Posted

技术标签:

【中文标题】OpenFeign + Hystrix - 不同客户端的不同超时【英文标题】:OpenFeign + Hystrix - Different timeout for different clients 【发布时间】:2021-05-27 01:03:57 【问题描述】:

我让 Hystrix 在我的 Spring Boot 应用程序中使用 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>

感谢任何帮助,谢谢!

【问题讨论】:

如果您在依赖(重客户端)级别设置 hystrix 超时,您可以这样做。您可以通过 hystrix 命令键识别重客户端。 Hystrix.command.heavyclient.execution.isolation.thread.timeoutInMilliseconds = 40000 。这里的heavyclient是你的命令键。 嗨@IndraneelBende,我试过了,使用我给@FeignClient 的相同ID,但它不起作用。它仍然使用default 超时 【参考方案1】:

经过周而复始并进行更深入的搜索后,我在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

【讨论】:

【参考方案2】:

CircuitBreakerNameResolver 将 CircuitBreakerNameResolver 命名为 HystrixCommandKey,有一个默认实现 DefaultCircuitBreakerNameResolver,其输出键模式为 HardCodedTarget#methodName(ParamClass),因此您可以自定义 CircuitBreakerNameResolver 而不是 DefaultCircuitBreakerNameResolver。

【讨论】:

以上是关于OpenFeign + Hystrix - 不同客户端的不同超时的主要内容,如果未能解决你的问题,请参考以下文章

OpenFeign 和 Hystrix 的源码解读(原创)

springcloud中openfeign止hystrix的几个问题

springcloud中openfeign止hystrix的几个问题

springcloud中openfeign止hystrix的几个问题

springcloud中openfeign止hystrix的几个问题

springcloud中openfeign止hystrix的几个问题