diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java index d621a8213..33adf8ddb 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/DiscoveryClientOptionalArgsConfiguration.java @@ -34,6 +34,7 @@ import org.springframework.boot.autoconfigure.condition.SearchStrategy; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cloud.configuration.SSLContextFactory; import org.springframework.cloud.configuration.TlsProperties; import org.springframework.cloud.netflix.eureka.RestTemplateTimeoutProperties; @@ -69,11 +70,11 @@ public TlsProperties tlsProperties() { @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled", matchIfMissing = true, havingValue = "false") public RestTemplateDiscoveryClientOptionalArgs restTemplateDiscoveryClientOptionalArgs(TlsProperties tlsProperties, - EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier) - throws GeneralSecurityException, IOException { + EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier, + ObjectProvider restTemplateBuilders) throws GeneralSecurityException, IOException { logger.info("Eureka HTTP Client uses RestTemplate."); RestTemplateDiscoveryClientOptionalArgs result = new RestTemplateDiscoveryClientOptionalArgs( - eurekaClientHttpRequestFactorySupplier); + eurekaClientHttpRequestFactorySupplier, restTemplateBuilders::getIfAvailable); setupTLS(result, tlsProperties); return result; } diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java index b9f33cf28..8f97eeca7 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/config/EurekaConfigServerBootstrapConfiguration.java @@ -29,6 +29,7 @@ import org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration; import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cloud.config.client.ConfigServerInstanceProvider; import org.springframework.cloud.config.client.ConfigServicePropertySourceLocator; import org.springframework.cloud.configuration.TlsProperties; @@ -71,9 +72,10 @@ public EurekaClientConfigBean eurekaClientConfigBean() { havingValue = "false") public RestTemplateEurekaHttpClient configDiscoveryRestTemplateEurekaHttpClient(EurekaClientConfigBean config, Environment env, @Nullable TlsProperties properties, - EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier) { + EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier, + ObjectProvider restTemplateBuilders) { return (RestTemplateEurekaHttpClient) new RestTemplateTransportClientFactory(properties, - eurekaClientHttpRequestFactorySupplier) + eurekaClientHttpRequestFactorySupplier, restTemplateBuilders::getIfAvailable) .newClient(HostnameBasedUrlRandomizer.randomEndpoint(config, env)); } diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateDiscoveryClientOptionalArgs.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateDiscoveryClientOptionalArgs.java index 0e74905b4..dbaf2497b 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateDiscoveryClientOptionalArgs.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateDiscoveryClientOptionalArgs.java @@ -16,8 +16,12 @@ package org.springframework.cloud.netflix.eureka.http; +import java.util.function.Supplier; + import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs; +import org.springframework.boot.web.client.RestTemplateBuilder; + /** * @author Daniel Lavoie */ @@ -25,9 +29,18 @@ public class RestTemplateDiscoveryClientOptionalArgs extends AbstractDiscoveryCl protected final EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier; + protected final Supplier restTemplateBuilderSupplier; + public RestTemplateDiscoveryClientOptionalArgs( EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier) { + this(eurekaClientHttpRequestFactorySupplier, RestTemplateBuilder::new); + } + + public RestTemplateDiscoveryClientOptionalArgs( + EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier, + Supplier restTemplateBuilderSupplier) { this.eurekaClientHttpRequestFactorySupplier = eurekaClientHttpRequestFactorySupplier; + this.restTemplateBuilderSupplier = restTemplateBuilderSupplier; } } diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactories.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactories.java index d6f8b0cc0..5706130fd 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactories.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactories.java @@ -42,7 +42,7 @@ public RestTemplateTransportClientFactories(RestTemplateDiscoveryClientOptionalA public TransportClientFactory newTransportClientFactory(EurekaClientConfig clientConfig, Collection additionalFilters, InstanceInfo myInstanceInfo) { return new RestTemplateTransportClientFactory(this.args.getSSLContext(), this.args.getHostnameVerifier(), - this.args.eurekaClientHttpRequestFactorySupplier); + this.args.eurekaClientHttpRequestFactorySupplier, this.args.restTemplateBuilderSupplier); } @Override @@ -50,7 +50,7 @@ public TransportClientFactory newTransportClientFactory(final EurekaClientConfig final Collection additionalFilters, final InstanceInfo myInstanceInfo, final Optional sslContext, final Optional hostnameVerifier) { return new RestTemplateTransportClientFactory(this.args.getSSLContext(), this.args.getHostnameVerifier(), - this.args.eurekaClientHttpRequestFactorySupplier); + this.args.eurekaClientHttpRequestFactorySupplier, this.args.restTemplateBuilderSupplier); } } diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactory.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactory.java index 1ba3cca84..55e8a1bcb 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactory.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactory.java @@ -21,6 +21,7 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.Optional; +import java.util.function.Supplier; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; @@ -44,6 +45,7 @@ import com.netflix.discovery.shared.transport.EurekaHttpClient; import com.netflix.discovery.shared.transport.TransportClientFactory; +import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cloud.configuration.SSLContextFactory; import org.springframework.cloud.configuration.TlsProperties; import org.springframework.http.HttpHeaders; @@ -72,11 +74,20 @@ public class RestTemplateTransportClientFactory implements TransportClientFactor private final EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier; + private final Supplier restTemplateBuilderSupplier; + public RestTemplateTransportClientFactory(TlsProperties tlsProperties, - EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier) { + EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier, + Supplier restTemplateBuilderSupplier) { this.sslContext = context(tlsProperties); this.hostnameVerifier = Optional.empty(); this.eurekaClientHttpRequestFactorySupplier = eurekaClientHttpRequestFactorySupplier; + this.restTemplateBuilderSupplier = restTemplateBuilderSupplier; + } + + public RestTemplateTransportClientFactory(TlsProperties tlsProperties, + EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier) { + this(tlsProperties, eurekaClientHttpRequestFactorySupplier, RestTemplateBuilder::new); } private Optional context(TlsProperties properties) { @@ -93,16 +104,23 @@ private Optional context(TlsProperties properties) { public RestTemplateTransportClientFactory(Optional sslContext, Optional hostnameVerifier, - EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier) { + EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier, + Supplier restTemplateBuilderSupplier) { this.sslContext = sslContext; this.hostnameVerifier = hostnameVerifier; this.eurekaClientHttpRequestFactorySupplier = eurekaClientHttpRequestFactorySupplier; + this.restTemplateBuilderSupplier = restTemplateBuilderSupplier; + } + + public RestTemplateTransportClientFactory(Optional sslContext, + Optional hostnameVerifier, + EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier) { + + this(sslContext, hostnameVerifier, eurekaClientHttpRequestFactorySupplier, RestTemplateBuilder::new); } public RestTemplateTransportClientFactory() { - this.sslContext = Optional.empty(); - this.hostnameVerifier = Optional.empty(); - this.eurekaClientHttpRequestFactorySupplier = new DefaultEurekaClientHttpRequestFactorySupplier(); + this(Optional.empty(), Optional.empty(), new DefaultEurekaClientHttpRequestFactorySupplier()); } @Override @@ -120,7 +138,15 @@ private String stripUserInfo(String serviceUrl) { private RestTemplate restTemplate(String serviceUrl) { ClientHttpRequestFactory requestFactory = this.eurekaClientHttpRequestFactorySupplier .get(this.sslContext.orElse(null), this.hostnameVerifier.orElse(null)); - RestTemplate restTemplate = new RestTemplate(requestFactory); + + RestTemplate restTemplate; + + if (restTemplateBuilderSupplier != null && restTemplateBuilderSupplier.get() != null) { + restTemplate = restTemplateBuilderSupplier.get().requestFactory(() -> requestFactory).build(); + } + else { + restTemplate = new RestTemplate(requestFactory); + } try { URI serviceURI = new URI(serviceUrl);