[英]Multiple Feign client timeout configurations
如果您更喜欢使用配置属性来配置所有 @FeignClient,则可以使用默认 feign 名称创建配置属性。 也可以通过命名客户端来为每个特定客户端设置这些超时。 而且,我们当然可以毫无问题地列出全局设置和每个客户端的覆盖。
我的客户:
@FeignClient( contextId = "fooFeignClient", name = "foo-client", url = "${foo.url}",
fallbackFactory = FooFallBackFactory.class,
configuration = FooFeignConfiguration.class)
我正在尝试这样做,并且我希望 foo-client.readTimeout 在使用 foo-client 时覆盖 default.readTimeout:
feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 3000
readTimeout: 3000
loggerLevel: full
foo-client:
connectTimeout: 3000
readTimeout: 5000
hystrix:
command:
default:
execution:
timeout:
enabled: "false"
isolation:
strategy: "THREAD"
thread:
timeoutInMilliseconds: "3000"
但这并没有发生。 我不确定 Hystrix 的 timeoutInMilliseconds 是否会产生影响,但从我的测试来看,它不会产生影响。 我希望 feign.readTimeout 仅为 foo 客户端的 5000,而不是其他客户端。 但看起来它忽略了这个 foo-client 配置并且只使用了默认配置。
我知道这不是 @Configuration class 问题,因为 Feign 文档说如果我们同时创建 @Configuration bean 和配置属性,配置属性将会获胜。
正如您在文档中看到的,您可以为每个特定客户端设置超时。 但是您只为 feign 客户端配置了它,而不是为 hystrix 命令配置它。 请记住,它们有独立的超时。
我建议使用配置 class 而不是编辑您的 application.yml 以使用 hystrix 处理多个 feign 客户端。 以下示例设置了一个 Feign.Builder,其中为 Feign 客户端和 Hystrix 命令注入了超时。
# application.yml
microservices:
foo:
feign:
url: xxxx
connect-timeout: 5s
read-timeout: 5s
hystrix:
enabled: true
timeout: 5s
@FeignClient(name = "foo",
url = "${microservice.foo.feign.url}",
configuration = FooFeignConfiguration.class)
public interface FooFeignRepository {
}
@Configuration
@RequiredArgsConstructor
public class FooFeignConfiguration {
@Value("${microservice.foo.hystrix.enabled:true}")
private final Boolean hystrixEnabled;
@DurationUnit(value = ChronoUnit.MILLIS)
@Value("${microservice.foo.feign.connect-timeout:5000}")
private final Duration feignConnectTimeout;
@DurationUnit(value = ChronoUnit.MILLIS)
@Value("${microservice.foo.feign.read-timeout:5000}")
private final Duration feignReadTimeout;
@DurationUnit(value = ChronoUnit.MILLIS)
@Value("${microservice.foo.hystrix.timeout:5000}")
private final Duration hystrixTimeout;
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder() {
return (hystrixEnabled ?
HystrixFeign.builder()
.options(new Request.Options(
(int) feignConnectTimeout.toMillis(),
(int) feignReadTimeout.toMillis()))
.setterFactory((target, method) -> {
return new SetterFactory.Default()
.create(target, method)
.andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
.withExecutionTimeoutInMilliseconds((int) hystrixTimeout.toMillis()));
}):
Feign.builder())
.retryer(Retryer.NEVER_RETRY);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.