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
.
我在我的 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
.