【问题标题】:How to set a time out in spring cloud gateway?如何在spring cloud gateway中设置超时?
【发布时间】:2020-11-27 17:50:36
【问题描述】:

如何在spring cloud gateway中设置time-out

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

有没有办法为ROUTE - doc 设置一个超时时间。

【问题讨论】:

    标签: java spring spring-boot api-gateway spring-cloud-gateway


    【解决方案1】:

    引用自spring doc

    设置global time-out

    spring:
      cloud:
        gateway:
          httpclient:
            connect-timeout: 1000
            response-timeout: 5s
    

    每条路由超时:-

      - id: per_route_timeouts
        uri: https://example.org
        predicates:
          - name: Path
            args:
              pattern: /delay/{timeout}
        metadata:
          response-timeout: 200
          connect-timeout: 200
    

    在 Java 中:

    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();
          }
    

    【讨论】:

    【解决方案2】:

    接受的答案有效如果您没有使用 R4J 断路器或时间限制器...但如果您这样做,上述设置将不足,实际上将被 R4J 设置覆盖。讨论了herehere,在撰写本文时可以找到当前的解决方法here...基本上,您编写一个自定义 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;
    }
    

    【讨论】:

    • 我认为接受的答案对于香草路线是正确的。如果你插入一个断路器,你还应该检查它的超时时间
    • @TobiaZambon 是的,你是对的,我将编辑答案以添加说明。
    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2021-10-14
    • 2018-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    相关资源
    最近更新 更多