Reputation: 31
If you prefer using configuration properties to configured all @FeignClient, you can create configuration properties with default feign name. It's also possible to set these timeouts per specific client by naming the client. And, we could, of course, list a global setting and also per-client overrides together without a problem.
My client:
@FeignClient( contextId = "fooFeignClient", name = "foo-client", url = "${foo.url}",
fallbackFactory = FooFallBackFactory.class,
configuration = FooFeignConfiguration.class)
I'm trying to do this and I want foo-client.readTimeout to override default.readTimeout when I'm using foo-client:
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"
But this is not happening. I'm not sure if Hystrix's timeoutInMilliseconds could be impacting, but from my tests, it's not interfering. I want the feign.readTimeout to be 5000 only for the foo-client, not for the other clients. But it looks like it is ignoring this foo-client configuration and using only the default configuration.
I know it's not a @Configuration class problem because the Feign documentation says that if we create both @Configuration bean and configuration properties, configuration properties will win.
Upvotes: 3
Views: 10977
Reputation: 686
This config works for me.
Feign client:
@FeignClient(name="test", value = "test", url = "https://api.test.com")
public interface TestClient {
@GetMapping("/test")
ResponseEntity<Test> getProducts();
}
application.yml:
spring:
cloud:
openfeign:
client:
config:
default:
connectTimeout: 20000
readTimeout: 60000
test:
connectTimeout: 2000
readTimeout: 3000
pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>4.1.1</version>
</dependency>
</dependencies>
Upvotes: 0
Reputation: 1070
As you have seen in the documentation, you can set timeouts per specific client. But you have only configured it for feign client, not for hystrix command. Remember that they have independent timeouts.
I would recommend to use a configuration class instead of editing your application.yml in order to handle multiples feign clients with hystrix. The following example sets up a Feign.Builder where timeouts are being injected for Feign client and Hystrix command.
# 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);
}
}
Upvotes: 3