diff --git a/spring-cloud-netflix-dependencies/pom.xml b/spring-cloud-netflix-dependencies/pom.xml index 3ed78457f..1cbb74fee 100644 --- a/spring-cloud-netflix-dependencies/pom.xml +++ b/spring-cloud-netflix-dependencies/pom.xml @@ -14,7 +14,7 @@ spring-cloud-netflix-dependencies Spring Cloud Netflix Dependencies - 2.0.0-rc.3 + 2.0.0-rc.4 diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/CloudEurekaClient.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/CloudEurekaClient.java index 7647f1330..a430feb3b 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/CloudEurekaClient.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/CloudEurekaClient.java @@ -28,6 +28,7 @@ import com.netflix.discovery.DiscoveryClient; import com.netflix.discovery.EurekaClientConfig; import com.netflix.discovery.shared.transport.EurekaHttpClient; import com.netflix.discovery.shared.transport.EurekaHttpResponse; +import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -57,13 +58,14 @@ public class CloudEurekaClient extends DiscoveryClient { private final AtomicReference eurekaHttpClient = new AtomicReference<>(); public CloudEurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, - ApplicationEventPublisher publisher) { - this(applicationInfoManager, config, null, publisher); + TransportClientFactories transportClientFactories, ApplicationEventPublisher publisher) { + this(applicationInfoManager, config, transportClientFactories, null, publisher); } public CloudEurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, - AbstractDiscoveryClientOptionalArgs args, ApplicationEventPublisher publisher) { - super(applicationInfoManager, config, args); + TransportClientFactories transportClientFactories, AbstractDiscoveryClientOptionalArgs args, + ApplicationEventPublisher publisher) { + super(applicationInfoManager, config, transportClientFactories, args); this.applicationInfoManager = applicationInfoManager; this.publisher = publisher; this.eurekaTransportField = ReflectionUtils.findField(DiscoveryClient.class, "eurekaTransport"); diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java index 7a8873685..cfcc195bc 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java @@ -47,6 +47,7 @@ import com.netflix.discovery.shared.transport.EurekaHttpResponse; import com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator; import com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient; import com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient; +import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; import org.springframework.aop.support.AopUtils; import org.springframework.aot.hint.MemberCategory; @@ -261,8 +262,9 @@ public class EurekaClientAutoConfiguration { @Bean(destroyMethod = "shutdown") @ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT) - public EurekaClient eurekaClient(ApplicationInfoManager manager, EurekaClientConfig config) { - return new CloudEurekaClient(manager, config, this.optionalArgs, this.context); + public EurekaClient eurekaClient(ApplicationInfoManager manager, EurekaClientConfig config, + TransportClientFactories transportClientFactories) { + return new CloudEurekaClient(manager, config, transportClientFactories, this.optionalArgs, this.context); } @Bean @@ -299,7 +301,8 @@ public class EurekaClientAutoConfiguration { @org.springframework.cloud.context.config.annotation.RefreshScope @Lazy public EurekaClient eurekaClient(ApplicationInfoManager manager, EurekaClientConfig config, - EurekaInstanceConfig instance, @Autowired(required = false) HealthCheckHandler healthCheckHandler) { + EurekaInstanceConfig instance, TransportClientFactories transportClientFactories, + @Autowired(required = false) HealthCheckHandler healthCheckHandler) { // If we use the proxy of the ApplicationInfoManager we could run into a // problem // when shutdown is called on the CloudEurekaClient where the @@ -314,8 +317,8 @@ public class EurekaClientAutoConfiguration { else { appManager = manager; } - CloudEurekaClient cloudEurekaClient = new CloudEurekaClient(appManager, config, this.optionalArgs, - this.context); + CloudEurekaClient cloudEurekaClient = new CloudEurekaClient(appManager, config, transportClientFactories, + this.optionalArgs, this.context); cloudEurekaClient.registerHealthCheck(healthCheckHandler); return cloudEurekaClient; } 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 ef93a22cf..8cc616a45 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 @@ -20,6 +20,7 @@ import java.io.IOException; import java.security.GeneralSecurityException; import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs; +import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -36,7 +37,9 @@ import org.springframework.cloud.configuration.TlsProperties; import org.springframework.cloud.netflix.eureka.http.DefaultEurekaClientHttpRequestFactorySupplier; import org.springframework.cloud.netflix.eureka.http.EurekaClientHttpRequestFactorySupplier; import org.springframework.cloud.netflix.eureka.http.RestTemplateDiscoveryClientOptionalArgs; +import org.springframework.cloud.netflix.eureka.http.RestTemplateTransportClientFactories; import org.springframework.cloud.netflix.eureka.http.WebClientDiscoveryClientOptionalArgs; +import org.springframework.cloud.netflix.eureka.http.WebClientTransportClientFactories; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.reactive.function.client.WebClient; @@ -71,6 +74,17 @@ public class DiscoveryClientOptionalArgsConfiguration { return result; } + @Bean + @ConditionalOnClass(name = "org.springframework.web.client.RestTemplate") + @ConditionalOnMissingClass("com.sun.jersey.api.client.filter.ClientFilter") + @ConditionalOnMissingBean(value = { TransportClientFactories.class }, search = SearchStrategy.CURRENT) + @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled", matchIfMissing = true, + havingValue = "false") + public RestTemplateTransportClientFactories restTemplateTransportClientFactories( + RestTemplateDiscoveryClientOptionalArgs optionalArgs) { + return new RestTemplateTransportClientFactories(optionalArgs); + } + @Bean @ConditionalOnMissingBean @ConditionalOnClass(name = "org.springframework.web.client.RestTemplate") @@ -122,6 +136,13 @@ public class DiscoveryClientOptionalArgsConfiguration { return result; } + @Bean + @ConditionalOnMissingBean(value = TransportClientFactories.class, search = SearchStrategy.CURRENT) + public WebClientTransportClientFactories webClientTransportClientFactories( + ObjectProvider builder) { + return new WebClientTransportClientFactories(builder::getIfAvailable); + } + } @Configuration 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 4101069bb..0e74905b4 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 @@ -28,7 +28,6 @@ public class RestTemplateDiscoveryClientOptionalArgs extends AbstractDiscoveryCl public RestTemplateDiscoveryClientOptionalArgs( EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier) { this.eurekaClientHttpRequestFactorySupplier = eurekaClientHttpRequestFactorySupplier; - setTransportClientFactories(new RestTemplateTransportClientFactories(this)); } } diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java index 84834fe64..552162500 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/WebClientDiscoveryClientOptionalArgs.java @@ -29,7 +29,6 @@ import org.springframework.web.reactive.function.client.WebClient; public class WebClientDiscoveryClientOptionalArgs extends AbstractDiscoveryClientOptionalArgs { public WebClientDiscoveryClientOptionalArgs(Supplier builder) { - setTransportClientFactories(new WebClientTransportClientFactories(builder)); } } diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaRegistration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaRegistration.java index b76c720cc..babd71258 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaRegistration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/serviceregistry/EurekaRegistration.java @@ -25,6 +25,7 @@ import com.netflix.appinfo.HealthCheckHandler; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; import com.netflix.discovery.EurekaClientConfig; +import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -181,6 +182,8 @@ public class EurekaRegistration implements Registration { private ApplicationEventPublisher publisher; + private TransportClientFactories transportClientFactories; + Builder(CloudEurekaInstanceConfig instanceConfig) { this.instanceConfig = instanceConfig; } @@ -200,6 +203,11 @@ public class EurekaRegistration implements Registration { return this; } + public Builder with(TransportClientFactories transportClientFactories) { + this.transportClientFactories = transportClientFactories; + return this; + } + public Builder with(EurekaClientConfig clientConfig, ApplicationEventPublisher publisher) { this.clientConfig = clientConfig; this.publisher = publisher; @@ -216,9 +224,11 @@ public class EurekaRegistration implements Registration { if (this.eurekaClient == null) { Assert.notNull(this.clientConfig, "if eurekaClient is null, EurekaClientConfig may not be null"); Assert.notNull(this.publisher, "if eurekaClient is null, ApplicationEventPublisher may not be null"); + Assert.notNull(this.transportClientFactories, + "if eurekaClient is null, TransportClientFactories may not be null"); this.eurekaClient = new CloudEurekaClient(this.applicationInfoManager, this.clientConfig, - this.publisher); + this.transportClientFactories, this.publisher); } return new EurekaRegistration(instanceConfig, eurekaClient, applicationInfoManager, healthCheckHandler); } diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java index 25697e199..917106c98 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java @@ -26,6 +26,7 @@ import com.netflix.appinfo.HealthCheckHandler; import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs; import com.netflix.discovery.EurekaClient; import com.netflix.discovery.EurekaClientConfig; +import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -671,8 +672,9 @@ class EurekaClientAutoConfigurationTests { @Bean(destroyMethod = "shutdown") @ConditionalOnMissingBean(value = EurekaClient.class, search = SearchStrategy.CURRENT) public EurekaClient eurekaClient(ApplicationInfoManager manager, EurekaClientConfig config, - ApplicationContext context, AbstractDiscoveryClientOptionalArgs optionalArgs) { - return new CloudEurekaClient(manager, config, optionalArgs, context) { + TransportClientFactories transportClientFactories, ApplicationContext context, + AbstractDiscoveryClientOptionalArgs optionalArgs) { + return new CloudEurekaClient(manager, config, transportClientFactories, optionalArgs, context) { @Override public synchronized void shutdown() { CountDownLatch latch = countDownLatch(); diff --git a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerAutoConfiguration.java b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerAutoConfiguration.java index abd5de8a9..0a65ef1db 100644 --- a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerAutoConfiguration.java +++ b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerAutoConfiguration.java @@ -28,7 +28,6 @@ import com.netflix.discovery.EurekaClientConfig; import com.netflix.discovery.converters.EurekaJacksonCodec; import com.netflix.discovery.converters.wrappers.CodecWrapper; import com.netflix.discovery.converters.wrappers.CodecWrappers; -import com.netflix.discovery.shared.transport.EurekaHttpClient; import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; import com.netflix.discovery.shared.transport.jersey3.Jersey3TransportClientFactories; import com.netflix.eureka.DefaultEurekaServerContext; @@ -39,6 +38,8 @@ import com.netflix.eureka.cluster.PeerEurekaNodes; import com.netflix.eureka.registry.PeerAwareInstanceRegistry; import com.netflix.eureka.resources.DefaultServerCodecs; import com.netflix.eureka.resources.ServerCodecs; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; +import com.netflix.eureka.transport.Jersey3EurekaServerHttpClientFactory; import com.netflix.eureka.transport.Jersey3ReplicationClient; import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; @@ -71,7 +72,6 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.cloud.client.actuator.HasFeatures; import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.cloud.netflix.eureka.EurekaConstants; -import org.springframework.cloud.netflix.eureka.config.HostnameBasedUrlRandomizer; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; @@ -170,25 +170,24 @@ public class EurekaServerAutoConfiguration implements WebMvcConfigurer { } @Bean + @ConditionalOnMissingBean(TransportClientFactories.class) public Jersey3TransportClientFactories jersey3TransportClientFactories() { return Jersey3TransportClientFactories.getInstance(); } @SuppressWarnings({ "rawtypes", "unchecked" }) @Bean - public EurekaHttpClient eurekaHttpClient(TransportClientFactories transportClientFactories, Environment env) { - return transportClientFactories - .newTransportClientFactory(this.eurekaClientConfig, Collections.emptyList(), - this.applicationInfoManager.getInfo()) - .newClient(HostnameBasedUrlRandomizer.randomEndpoint(this.eurekaClientConfig, env)); + public Jersey3EurekaServerHttpClientFactory jersey3EurekaServerHttpClientFactory() { + return new Jersey3EurekaServerHttpClientFactory(); } @Bean public PeerAwareInstanceRegistry peerAwareInstanceRegistry(ServerCodecs serverCodecs, - EurekaHttpClient eurekaHttpClient) { + EurekaServerHttpClientFactory eurekaServerHttpClientFactory) { this.eurekaClient.getApplications(); // force initialization return new InstanceRegistry(this.eurekaServerConfig, this.eurekaClientConfig, serverCodecs, this.eurekaClient, - eurekaHttpClient, this.instanceRegistryProperties.getExpectedNumberOfClientsSendingRenews(), + eurekaServerHttpClientFactory, + this.instanceRegistryProperties.getExpectedNumberOfClientsSendingRenews(), this.instanceRegistryProperties.getDefaultOpenForTrafficCount()); } diff --git a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/InstanceRegistry.java b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/InstanceRegistry.java index 0ab3b0168..ff903e50b 100644 --- a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/InstanceRegistry.java +++ b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/InstanceRegistry.java @@ -21,11 +21,11 @@ import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; import com.netflix.discovery.EurekaClientConfig; import com.netflix.discovery.shared.Application; -import com.netflix.discovery.shared.transport.EurekaHttpClient; import com.netflix.eureka.EurekaServerConfig; import com.netflix.eureka.lease.Lease; import com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl; import com.netflix.eureka.resources.ServerCodecs; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -49,9 +49,9 @@ public class InstanceRegistry extends PeerAwareInstanceRegistryImpl implements A private final int defaultOpenForTrafficCount; public InstanceRegistry(EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs, - EurekaClient eurekaClient, EurekaHttpClient eurekaHttpClient, int expectedNumberOfClientsSendingRenews, - int defaultOpenForTrafficCount) { - super(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaHttpClient); + EurekaClient eurekaClient, EurekaServerHttpClientFactory eurekaServerHttpClientFactory, + int expectedNumberOfClientsSendingRenews, int defaultOpenForTrafficCount) { + super(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaServerHttpClientFactory); this.expectedNumberOfClientsSendingRenews = expectedNumberOfClientsSendingRenews; this.defaultOpenForTrafficCount = defaultOpenForTrafficCount;