diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java index 282f4d50..b936e620 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java @@ -20,6 +20,16 @@ package org.springframework.cloud.gateway.config; import java.util.List; import java.util.function.Consumer; +import com.netflix.hystrix.HystrixObservableCommand; +import io.netty.channel.ChannelOption; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; +import reactor.core.publisher.Flux; +import reactor.ipc.netty.http.client.HttpClient; +import reactor.ipc.netty.http.client.HttpClientOptions; +import reactor.ipc.netty.options.ClientProxyOptions; +import reactor.ipc.netty.resources.PoolResources; +import rx.RxReactiveStreams; + import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; @@ -38,11 +48,11 @@ import org.springframework.cloud.gateway.filter.AdaptCachedBodyGlobalFilter; import org.springframework.cloud.gateway.filter.ForwardPathFilter; import org.springframework.cloud.gateway.filter.ForwardRoutingFilter; import org.springframework.cloud.gateway.filter.GlobalFilter; -import org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter; import org.springframework.cloud.gateway.filter.NettyRoutingFilter; import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter; import org.springframework.cloud.gateway.filter.RouteToRequestUrlFilter; import org.springframework.cloud.gateway.filter.WebsocketRoutingFilter; +import org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter; import org.springframework.cloud.gateway.filter.factory.AddRequestHeaderGatewayFilterFactory; import org.springframework.cloud.gateway.filter.factory.AddRequestParameterGatewayFilterFactory; import org.springframework.cloud.gateway.filter.factory.AddResponseHeaderGatewayFilterFactory; @@ -115,19 +125,9 @@ import org.springframework.web.reactive.socket.client.WebSocketClient; import org.springframework.web.reactive.socket.server.WebSocketService; import org.springframework.web.reactive.socket.server.support.HandshakeWebSocketService; -import com.netflix.hystrix.HystrixObservableCommand; - import static org.springframework.cloud.gateway.config.HttpClientProperties.Pool.PoolType.DISABLED; import static org.springframework.cloud.gateway.config.HttpClientProperties.Pool.PoolType.FIXED; -import io.netty.handler.ssl.util.InsecureTrustManagerFactory; -import reactor.core.publisher.Flux; -import reactor.ipc.netty.http.client.HttpClient; -import reactor.ipc.netty.http.client.HttpClientOptions; -import reactor.ipc.netty.options.ClientProxyOptions; -import reactor.ipc.netty.resources.PoolResources; -import rx.RxReactiveStreams; - /** * @author Spencer Gibb */ @@ -152,6 +152,10 @@ public class GatewayAutoConfiguration { public Consumer nettyClientOptions(HttpClientProperties properties) { return opts -> { + if (properties.getConnectTimeout() != null) { + opts.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, properties.getConnectTimeout()); + } + // configure ssl HttpClientProperties.Ssl ssl = properties.getSsl(); diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java index 92c151b3..ef627a59 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/HttpClientProperties.java @@ -26,6 +26,9 @@ import reactor.ipc.netty.resources.PoolResources; @ConfigurationProperties("spring.cloud.gateway.httpclient") public class HttpClientProperties { + /** The connect timeout in millis, the default is 45s. */ + private Integer connectTimeout; + /** Pool configuration for Netty HttpClient */ private Pool pool = new Pool(); @@ -35,6 +38,14 @@ public class HttpClientProperties { /** SSL configuration for Netty HttpClient */ private Ssl ssl = new Ssl(); + public Integer getConnectTimeout() { + return connectTimeout; + } + + public void setConnectTimeout(Integer connectTimeout) { + this.connectTimeout = connectTimeout; + } + public Pool getPool() { return pool; } @@ -208,8 +219,10 @@ public class HttpClientProperties { @Override public String toString() { return "HttpClientProperties{" + - "pool=" + pool + + "connectTimeout=" + connectTimeout + + ", pool=" + pool + ", proxy=" + proxy + + ", ssl=" + ssl + '}'; } } diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java index cd1f02e8..7161b145 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/config/GatewayAutoConfigurationTests.java @@ -20,13 +20,13 @@ package org.springframework.cloud.gateway.config; import io.netty.handler.ssl.SslContext; import org.junit.Test; import reactor.ipc.netty.http.client.HttpClient; +import reactor.ipc.netty.http.client.HttpClientOptions; +import reactor.ipc.netty.options.ClientProxyOptions; +import reactor.ipc.netty.resources.PoolResources; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; -import reactor.ipc.netty.http.client.HttpClientOptions; -import reactor.ipc.netty.options.ClientProxyOptions; -import reactor.ipc.netty.resources.PoolResources; import static org.assertj.core.api.Assertions.assertThat; @@ -61,6 +61,7 @@ public class GatewayAutoConfigurationTests { .withConfiguration(AutoConfigurations.of(WebFluxAutoConfiguration.class, GatewayAutoConfiguration.class)) .withPropertyValues("spring.cloud.gateway.httpclient.ssl.use-insecure-trust-manager=true", + "spring.cloud.gateway.httpclient.connect-timeout=10", "spring.cloud.gateway.httpclient.pool.type=fixed", "spring.cloud.gateway.httpclient.proxy.host=myhost") .run(context -> {