Thirumal
Thirumal

Reputation: 9536

How to set a time out in spring cloud gateway?

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

Answers (2)

Thirumal
Thirumal

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

Dexter Legaspi
Dexter Legaspi

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

Related Questions