如何在Spring Cloud Gateway中设置超时?

Thi*_*mal 6 java spring spring-boot api-gateway spring-cloud-gateway

如何设置time-outa spring cloud gateway

routeLocatorBuilder.routes()
        .route("test-api", r -> r.path("/api/**")).uri(apiLb))
        .route("test-doc", r -> r.path("/doc/**")).uri(docLb));
Run Code Online (Sandbox Code Playgroud)

有没有办法只为一个人设置一个超时ROUTE- doc.

Thi*_*mal 11

引用自 spring 文档

设置global time-out

spring:
  cloud:
    gateway:
      httpclient:
        connect-timeout: 1000
        response-timeout: 5s
Run Code Online (Sandbox Code Playgroud)

每条路线超时:-

  - id: per_route_timeouts
    uri: https://example.org
    predicates:
      - name: Path
        args:
          pattern: /delay/{timeout}
    metadata:
      response-timeout: 200
      connect-timeout: 200
Run Code Online (Sandbox Code Playgroud)

在 Java 中,添加以下 bean:

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;
}
Run Code Online (Sandbox Code Playgroud)


Dex*_*spi 5

如果您不使用 R4J 断路器或时间限制器,则接受的答案有效...但如果您这样做,上述设置将不够,实际上将被 R4J 设置覆盖。这里这里对此进行了讨论,撰写本文时当前的解决方法可以在这里找到...基本上,您编写一个自定义 bean,以便它将遵循配置设置:

@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;
}
Run Code Online (Sandbox Code Playgroud)