Reputation: 9536
How to set a time-out
in spring cloud gateway
?
routeLocatorBuilder.routes()
.route("test-api", r -> r.path("/api/**")).uri(apiLb))
.route("test-doc", r -> r.path("/doc/**")).uri(docLb));
Is there a way to set a time out for just one ROUTE
- doc
.
Upvotes: 6
Views: 20145
Reputation: 9536
Referred from spring doc
To set global time-out
spring:
cloud:
gateway:
httpclient:
connect-timeout: 1000
response-timeout: 5s
Per-route timeouts:-
- id: per_route_timeouts
uri: https://example.org
predicates:
- name: Path
args:
pattern: /delay/{timeout}
metadata:
response-timeout: 200
connect-timeout: 200
In Java, add the below bean(s):
import static org.springframework.cloud.gateway.support.RouteMetadataUtils.CONNECT_TIMEOUT_ATTR;
import static org.springframework.cloud.gateway.support.RouteMetadataUtils.RESPONSE_TIMEOUT_ATTR;
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder routeBuilder){
return routeBuilder.routes()
.route("test1", r -> {
return r.host("*.somehost.org").and().path("/somepath")
.filters(f -> f.addRequestHeader("header1", "header-value-1"))
.uri("http://someuri")
.metadata(RESPONSE_TIMEOUT_ATTR, 200)
.metadata(CONNECT_TIMEOUT_ATTR, 200);
})
.build();
}
@Bean
public ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory(
final CircuitBreakerRegistry circuitBreakerRegistry, final TimeLimiterRegistry timeLimiterRegistry) {
ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory = new
ReactiveResilience4JCircuitBreakerFactory(circuitBreakerRegistry, timeLimiterRegistry);
reactiveResilience4JCircuitBreakerFactory.configureDefault(id -> {
CircuitBreakerConfig circuitBreakerConfig = circuitBreakerRegistry.find(id).isPresent()
? circuitBreakerRegistry.find(id).get().getCircuitBreakerConfig()
: circuitBreakerRegistry.getDefaultConfig();
TimeLimiterConfig timeLimiterConfig = timeLimiterRegistry.find(id).isPresent()
? timeLimiterRegistry.find(id).get().getTimeLimiterConfig()
: timeLimiterRegistry.getDefaultConfig();
return new Resilience4JConfigBuilder(id).circuitBreakerConfig(circuitBreakerConfig)
.timeLimiterConfig(timeLimiterConfig).build();
});
return reactiveResilience4JCircuitBreakerFactory;
}
Upvotes: 11
Reputation: 3312
the accepted answer works if you are not using R4J circuitbreakers or timelimiters...but if you do, the above settings will be insufficient and in fact will be overridden by the R4J settings. it is discussed here and here, the current workaround as of this writing can be found here...basically, you write a custom bean so it will honor the configuration settings:
@Bean
public ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory(final CircuitBreakerRegistry circuitBreakerRegistry, final TimeLimiterRegistry timeLimiterRegistry) {
ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory = new ReactiveResilience4JCircuitBreakerFactory();
reactiveResilience4JCircuitBreakerFactory.configureCircuitBreakerRegistry(circuitBreakerRegistry);
reactiveResilience4JCircuitBreakerFactory.configureDefault(id -> {
CircuitBreakerConfig circuitBreakerConfig = circuitBreakerRegistry.find(id).isPresent() ? circuitBreakerRegistry.find(id).get().getCircuitBreakerConfig()
: circuitBreakerRegistry.getDefaultConfig();
TimeLimiterConfig timeLimiterConfig = timeLimiterRegistry.find(id).isPresent() ? timeLimiterRegistry.find(id).get().getTimeLimiterConfig()
: timeLimiterRegistry.getDefaultConfig();
return new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(circuitBreakerConfig)
.timeLimiterConfig(timeLimiterConfig)
.build();
});
return reactiveResilience4JCircuitBreakerFactory;
}
Upvotes: 5