From 6b6173de3ae99e9329c71435d6128113e4534ed2 Mon Sep 17 00:00:00 2001 From: ZIRAKrezovic <145535273+ZIRAKrezovic@users.noreply.github.com> Date: Tue, 26 Mar 2024 18:42:50 +0100 Subject: [PATCH] Add support for configuring RestTemplate via RestTemplateBuilder (#4255) (#4262) --- ...coveryClientOptionalArgsConfiguration.java | 7 ++-- ...ekaConfigServerBootstrapConfiguration.java | 6 ++- ...stTemplateDiscoveryClientOptionalArgs.java | 13 +++++++ .../RestTemplateTransportClientFactories.java | 4 +- .../RestTemplateTransportClientFactory.java | 38 ++++++++++++++++--- 5 files changed, 55 insertions(+), 13 deletions(-) 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 d621a82133..33adf8ddbe 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 b9f33cf288..8f97eeca7d 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 0e74905b41..dbaf2497b0 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 d6f8b0cc0b..5706130fd1 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 1ba3cca846..55e8a1bcb5 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);