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 - 不同客户端的不同超时的主要内容,如果未能解决你的问题,请参考以下文章
springcloud中openfeign止hystrix的几个问题
springcloud中openfeign止hystrix的几个问题
springcloud中openfeign止hystrix的几个问题