diff --git a/eureka-client-jersey3/src/main/java/com/netflix/discovery/shared/transport/jersey3/EurekaJersey3ClientImpl.java b/eureka-client-jersey3/src/main/java/com/netflix/discovery/shared/transport/jersey3/EurekaJersey3ClientImpl.java index 2dc2a9be02..606b7c78c6 100644 --- a/eureka-client-jersey3/src/main/java/com/netflix/discovery/shared/transport/jersey3/EurekaJersey3ClientImpl.java +++ b/eureka-client-jersey3/src/main/java/com/netflix/discovery/shared/transport/jersey3/EurekaJersey3ClientImpl.java @@ -232,7 +232,7 @@ class MyDefaultApacheHttpClient4Config extends ClientConfig { if (systemSSL) { cm = createSystemSslCM(); - } else if (trustStoreFileName != null) { + } else if (trustStoreFileName != null && !trustStoreFileName.trim().isEmpty()) { cm = createCustomSslCM(); } else { cm = new PoolingHttpClientConnectionManager(); diff --git a/eureka-core/src/test/java/com/netflix/eureka/resources/ReplicationConcurrencyTest.java b/eureka-client-jersey3/src/test/java/com/netflix/eureka/resources/ReplicationConcurrencyTest.java similarity index 95% rename from eureka-core/src/test/java/com/netflix/eureka/resources/ReplicationConcurrencyTest.java rename to eureka-client-jersey3/src/test/java/com/netflix/eureka/resources/ReplicationConcurrencyTest.java index 494012b793..b69343ca9b 100644 --- a/eureka-core/src/test/java/com/netflix/eureka/resources/ReplicationConcurrencyTest.java +++ b/eureka-client-jersey3/src/test/java/com/netflix/eureka/resources/ReplicationConcurrencyTest.java @@ -13,6 +13,8 @@ import com.netflix.eureka.cluster.PeerEurekaNodes; import com.netflix.eureka.registry.PeerAwareInstanceRegistry; import com.netflix.eureka.registry.PeerAwareInstanceRegistryImpl; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; +import com.netflix.eureka.transport.Jersey3EurekaServerHttpClientFactory; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; @@ -138,8 +140,8 @@ public MockServer(String appName, PeerEurekaNodes peerEurekaNodes) throws Except Mockito.doReturn("true").when(serverConfig).getExperimental("registry.registration.ignoreIfDirtyTimestampIsOlder"); - EurekaHttpClient eurekaHttpClient = null; // FIXME 2.0 - this.registry = new PeerAwareInstanceRegistryImpl(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaHttpClient); + EurekaServerHttpClientFactory eurekaServerHttpClientFactory = new Jersey3EurekaServerHttpClientFactory(); + this.registry = new PeerAwareInstanceRegistryImpl(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaServerHttpClientFactory); this.registry.init(peerEurekaNodes); this.applicationResource = new ApplicationResource(appName, serverConfig, registry); diff --git a/eureka-client/build.gradle b/eureka-client/build.gradle index 51e9816f1b..958d0e5b61 100644 --- a/eureka-client/build.gradle +++ b/eureka-client/build.gradle @@ -42,4 +42,5 @@ dependencies { testImplementation "com.github.tomakehurst:wiremock-jre8:2.25.1" testImplementation "org.assertj:assertj-core:3.11.1" testImplementation "jakarta.servlet:jakarta.servlet-api:5.0.0" + testRuntimeOnly 'org.slf4j:slf4j-simple:2.0.0-beta1' } diff --git a/eureka-client/src/main/java/com/netflix/discovery/AbstractDiscoveryClientOptionalArgs.java b/eureka-client/src/main/java/com/netflix/discovery/AbstractDiscoveryClientOptionalArgs.java index b794808f6a..33a2fee74d 100644 --- a/eureka-client/src/main/java/com/netflix/discovery/AbstractDiscoveryClientOptionalArgs.java +++ b/eureka-client/src/main/java/com/netflix/discovery/AbstractDiscoveryClientOptionalArgs.java @@ -31,8 +31,6 @@ public abstract class AbstractDiscoveryClientOptionalArgs { TransportClientFactory transportClientFactory; - TransportClientFactories transportClientFactories; - private Set eventListeners; private Optional sslContext = Optional.empty(); @@ -82,16 +80,6 @@ public void setAdditionalFilters(Collection additionalFilters) { this.additionalFilters = additionalFilters; } - public TransportClientFactories getTransportClientFactories() { - return transportClientFactories; - } - - // @Inject - public void setTransportClientFactories(TransportClientFactories transportClientFactories) { - this.transportClientFactories = transportClientFactories; - } - - public TransportClientFactory getTransportClientFactory() { return transportClientFactory; } diff --git a/eureka-client/src/main/java/com/netflix/discovery/DiscoveryClient.java b/eureka-client/src/main/java/com/netflix/discovery/DiscoveryClient.java index d6db68493f..4f22e5bce6 100644 --- a/eureka-client/src/main/java/com/netflix/discovery/DiscoveryClient.java +++ b/eureka-client/src/main/java/com/netflix/discovery/DiscoveryClient.java @@ -186,12 +186,16 @@ public class DiscoveryClient implements EurekaClient { protected final EurekaClientConfig clientConfig; protected final EurekaTransportConfig transportConfig; + @SuppressWarnings("rawtypes") + protected final TransportClientFactories transportClientFactories; + private final long initTimestampMs; private final int initRegistrySize; private final Stats stats = new Stats(); private static final class EurekaTransport { + @SuppressWarnings("rawtypes") private ClosableResolver bootstrapResolver; private TransportClientFactory transportClientFactory; @@ -228,34 +232,19 @@ void shutdown() { } } - /** - * Assumes applicationInfoManager is already initialized - * - * @deprecated use constructor that takes ApplicationInfoManager instead of InstanceInfo directly - */ - @Deprecated - public DiscoveryClient(InstanceInfo myInfo, EurekaClientConfig config) { - this(myInfo, config, null); - } - - /** - * @deprecated use constructor that takes ApplicationInfoManager instead of InstanceInfo directly - */ - @Deprecated - public DiscoveryClient(InstanceInfo myInfo, EurekaClientConfig config, AbstractDiscoveryClientOptionalArgs args) { - this(ApplicationInfoManager.getInstance(), config, args); - } - - public DiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config) { - this(applicationInfoManager, config, null); + @SuppressWarnings("rawtypes") + public DiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, TransportClientFactories transportClientFactories) { + this(applicationInfoManager, config, transportClientFactories, null); } - public DiscoveryClient(ApplicationInfoManager applicationInfoManager, final EurekaClientConfig config, AbstractDiscoveryClientOptionalArgs args) { - this(applicationInfoManager, config, args, ResolverUtils::randomize); + @SuppressWarnings("rawtypes") + public DiscoveryClient(ApplicationInfoManager applicationInfoManager, final EurekaClientConfig config, TransportClientFactories transportClientFactories, AbstractDiscoveryClientOptionalArgs args) { + this(applicationInfoManager, config, transportClientFactories, args, ResolverUtils::randomize); } - public DiscoveryClient(ApplicationInfoManager applicationInfoManager, final EurekaClientConfig config, AbstractDiscoveryClientOptionalArgs args, EndpointRandomizer randomizer) { - this(applicationInfoManager, config, args, new Provider() { + @SuppressWarnings("rawtypes") + public DiscoveryClient(ApplicationInfoManager applicationInfoManager, final EurekaClientConfig config, TransportClientFactories transportClientFactories, AbstractDiscoveryClientOptionalArgs args, EndpointRandomizer randomizer) { + this(applicationInfoManager, config, transportClientFactories, args, new Provider() { private volatile BackupRegistry backupRegistryInstance; @Override @@ -286,17 +275,8 @@ public synchronized BackupRegistry get() { }, randomizer); } - /** - * @deprecated Use {@link #DiscoveryClient(ApplicationInfoManager, EurekaClientConfig, AbstractDiscoveryClientOptionalArgs, Provider, EndpointRandomizer)} - */ - @Deprecated - DiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, AbstractDiscoveryClientOptionalArgs args, - Provider backupRegistryProvider) { - this(applicationInfoManager, config, args, backupRegistryProvider, ResolverUtils::randomize); - } - @Inject - DiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, AbstractDiscoveryClientOptionalArgs args, + DiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, TransportClientFactories transportClientFactories, AbstractDiscoveryClientOptionalArgs args, Provider backupRegistryProvider, EndpointRandomizer endpointRandomizer) { if (args != null) { this.healthCheckHandlerProvider = args.healthCheckHandlerProvider; @@ -308,7 +288,7 @@ public synchronized BackupRegistry get() { this.healthCheckHandlerProvider = null; this.preRegistrationHandler = null; } - + this.transportClientFactories = transportClientFactories; this.applicationInfoManager = applicationInfoManager; InstanceInfo myInfo = applicationInfoManager.getInfo(); @@ -468,6 +448,7 @@ public synchronized BackupRegistry get() { initTimestampMs, initRegistrySize); } + @SuppressWarnings("unchecked") private void scheduleServerEndpointTask(EurekaTransport eurekaTransport, AbstractDiscoveryClientOptionalArgs args) { @@ -476,13 +457,6 @@ private void scheduleServerEndpointTask(EurekaTransport eurekaTransport, ? Collections.emptyList() : args.additionalFilters; - @SuppressWarnings("rawtypes") - // Ignore the raw types warnings since the client filter interface changed between jersey 1/2 - TransportClientFactories transportClientFactories = null; - if (args != null && args.getTransportClientFactories() != null) { - transportClientFactories = args.getTransportClientFactories(); - } - if (transportClientFactories == null) { throw new IllegalArgumentException("transportClientFactories may not be null"); } diff --git a/eureka-client/src/main/java/com/netflix/discovery/DiscoveryManager.java b/eureka-client/src/main/java/com/netflix/discovery/DiscoveryManager.java index 45d0999146..3528fab1db 100644 --- a/eureka-client/src/main/java/com/netflix/discovery/DiscoveryManager.java +++ b/eureka-client/src/main/java/com/netflix/discovery/DiscoveryManager.java @@ -18,8 +18,8 @@ import com.netflix.appinfo.ApplicationInfoManager; import com.netflix.appinfo.EurekaInstanceConfig; -import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.shared.LookupService; +import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -80,20 +80,14 @@ public void setEurekaInstanceConfig(EurekaInstanceConfig eurekaInstanceConfig) { * @param eurekaConfig the eureka client configuration of the instance. */ public void initComponent(EurekaInstanceConfig config, - EurekaClientConfig eurekaConfig, AbstractDiscoveryClientOptionalArgs args) { + EurekaClientConfig eurekaConfig, TransportClientFactories transportClientFactories, AbstractDiscoveryClientOptionalArgs args) { this.eurekaInstanceConfig = config; this.eurekaClientConfig = eurekaConfig; if (ApplicationInfoManager.getInstance().getInfo() == null) { // Initialize application info ApplicationInfoManager.getInstance().initComponent(config); } - InstanceInfo info = ApplicationInfoManager.getInstance().getInfo(); - discoveryClient = new DiscoveryClient(info, eurekaConfig, args); - } - - public void initComponent(EurekaInstanceConfig config, - EurekaClientConfig eurekaConfig) { - initComponent(config, eurekaConfig, null); + discoveryClient = new DiscoveryClient(ApplicationInfoManager.getInstance(), eurekaConfig, transportClientFactories, args); } /** diff --git a/eureka-client/src/test/java/com/netflix/discovery/BackUpRegistryTest.java b/eureka-client/src/test/java/com/netflix/discovery/BackUpRegistryTest.java index daa29656b5..731edbab60 100644 --- a/eureka-client/src/test/java/com/netflix/discovery/BackUpRegistryTest.java +++ b/eureka-client/src/test/java/com/netflix/discovery/BackUpRegistryTest.java @@ -69,12 +69,11 @@ public Name getName() { backupRegistry = new MockBackupRegistry(); setupBackupMock(); - Jersey3DiscoveryClientOptionalArgs args = new Jersey3DiscoveryClientOptionalArgs(); - args.setTransportClientFactories(Jersey3TransportClientFactories.getInstance()); client = new DiscoveryClient( applicationInfoManager, new DefaultEurekaClientConfig(), - args, + Jersey3TransportClientFactories.getInstance(), + null, () -> backupRegistry, ResolverUtils::randomize ); diff --git a/eureka-client/src/test/java/com/netflix/discovery/DiscoveryClientDisableRegistryTest.java b/eureka-client/src/test/java/com/netflix/discovery/DiscoveryClientDisableRegistryTest.java index 1699c4d4cf..5f634340c4 100644 --- a/eureka-client/src/test/java/com/netflix/discovery/DiscoveryClientDisableRegistryTest.java +++ b/eureka-client/src/test/java/com/netflix/discovery/DiscoveryClientDisableRegistryTest.java @@ -7,6 +7,7 @@ import com.netflix.appinfo.InstanceInfo; import com.netflix.appinfo.MyDataCenterInstanceConfig; import com.netflix.config.ConfigurationManager; +import com.netflix.discovery.shared.transport.jersey3.Jersey3TransportClientFactories; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -42,7 +43,7 @@ public Name getName() { }); ApplicationInfoManager applicationInfoManager = new ApplicationInfoManager(new MyDataCenterInstanceConfig(), builder.build()); - client = new DiscoveryClient(applicationInfoManager, new DefaultEurekaClientConfig()); + client = new DiscoveryClient(applicationInfoManager, new DefaultEurekaClientConfig(), Jersey3TransportClientFactories.getInstance()); } @Test diff --git a/eureka-client/src/test/java/com/netflix/discovery/DiscoveryClientRegisterUpdateTest.java b/eureka-client/src/test/java/com/netflix/discovery/DiscoveryClientRegisterUpdateTest.java index 6bc1c95f1a..8a78e5f895 100644 --- a/eureka-client/src/test/java/com/netflix/discovery/DiscoveryClientRegisterUpdateTest.java +++ b/eureka-client/src/test/java/com/netflix/discovery/DiscoveryClientRegisterUpdateTest.java @@ -145,7 +145,6 @@ public void testDoNotUnregisterOnShutdown() throws Exception { private Jersey3DiscoveryClientOptionalArgs getOptionalArgs() { Jersey3DiscoveryClientOptionalArgs optionalArgs = new Jersey3DiscoveryClientOptionalArgs(); - optionalArgs.setTransportClientFactories(Jersey3TransportClientFactories.getInstance()); return optionalArgs; } @@ -171,7 +170,7 @@ private static T getLast(List list) { private static class TestClient extends DiscoveryClient { public TestClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, AbstractDiscoveryClientOptionalArgs optionalArgs) { - super(applicationInfoManager, config, optionalArgs); + super(applicationInfoManager, config, Jersey3TransportClientFactories.getInstance(), optionalArgs); } @Override diff --git a/eureka-core-jersey3/src/main/java/com/netflix/eureka/Jersey3EurekaBootStrap.java b/eureka-core-jersey3/src/main/java/com/netflix/eureka/Jersey3EurekaBootStrap.java index 0198c64807..53c1572f93 100644 --- a/eureka-core-jersey3/src/main/java/com/netflix/eureka/Jersey3EurekaBootStrap.java +++ b/eureka-core-jersey3/src/main/java/com/netflix/eureka/Jersey3EurekaBootStrap.java @@ -1,20 +1,30 @@ package com.netflix.eureka; import com.netflix.appinfo.ApplicationInfoManager; +import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs; import com.netflix.discovery.DiscoveryClient; import com.netflix.discovery.EurekaClientConfig; -import com.netflix.discovery.shared.transport.EurekaHttpClient; +import com.netflix.discovery.Jersey3DiscoveryClientOptionalArgs; +import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; +import com.netflix.discovery.shared.transport.jersey3.Jersey3TransportClientFactories; import com.netflix.eureka.cluster.Jersey3PeerEurekaNodes; import com.netflix.eureka.cluster.PeerEurekaNodes; import com.netflix.eureka.registry.PeerAwareInstanceRegistry; import com.netflix.eureka.resources.ServerCodecs; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; +import com.netflix.eureka.transport.Jersey3EurekaServerHttpClientFactory; /** * Jersey3 eureka server bootstrapper * @author Matt Nelson */ public class Jersey3EurekaBootStrap extends EurekaBootStrap { - + + // for servlet based deployments + public Jersey3EurekaBootStrap() { + super(null); + } + public Jersey3EurekaBootStrap(DiscoveryClient discoveryClient) { super(discoveryClient); } @@ -33,8 +43,19 @@ protected PeerEurekaNodes getPeerEurekaNodes(PeerAwareInstanceRegistry registry, } @Override - protected EurekaHttpClient getEurekaHttpClient() { - // FIXME 2.0 - return null; + protected AbstractDiscoveryClientOptionalArgs getDiscoveryClientOptionalArgs() { + Jersey3DiscoveryClientOptionalArgs jersey3DiscoveryClientOptionalArgs = new Jersey3DiscoveryClientOptionalArgs(); + return jersey3DiscoveryClientOptionalArgs; + } + + @Override + protected TransportClientFactories getTransportClientFactories() { + return Jersey3TransportClientFactories.getInstance(); } + + @Override + protected EurekaServerHttpClientFactory getEurekaServerHttpClientFactory() { + return new Jersey3EurekaServerHttpClientFactory(); + } + } diff --git a/eureka-core-jersey3/src/main/java/com/netflix/eureka/transport/Jersey3EurekaServerHttpClientFactory.java b/eureka-core-jersey3/src/main/java/com/netflix/eureka/transport/Jersey3EurekaServerHttpClientFactory.java new file mode 100644 index 0000000000..ace4d75372 --- /dev/null +++ b/eureka-core-jersey3/src/main/java/com/netflix/eureka/transport/Jersey3EurekaServerHttpClientFactory.java @@ -0,0 +1,54 @@ +package com.netflix.eureka.transport; + +import com.netflix.discovery.shared.dns.DnsServiceImpl; +import com.netflix.discovery.shared.resolver.ClusterResolver; +import com.netflix.discovery.shared.resolver.EurekaEndpoint; +import com.netflix.discovery.shared.transport.EurekaHttpClient; +import com.netflix.discovery.shared.transport.EurekaTransportConfig; +import com.netflix.discovery.shared.transport.TransportClientFactory; +import com.netflix.discovery.shared.transport.decorator.MetricsCollectingEurekaHttpClient; +import com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient; +import com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient; +import com.netflix.discovery.shared.transport.decorator.ServerStatusEvaluators; +import com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient; +import com.netflix.eureka.EurekaServerConfig; +import com.netflix.eureka.Names; +import com.netflix.eureka.resources.ServerCodecs; + +public class Jersey3EurekaServerHttpClientFactory implements EurekaServerHttpClientFactory { + + public static final long RECONNECT_INTERVAL_MINUTES = 30; + + @Override + public EurekaHttpClient createRemoteRegionClient(EurekaServerConfig serverConfig, EurekaTransportConfig transportConfig, ServerCodecs serverCodecs, ClusterResolver clusterResolver) { + Jersey3RemoteRegionClientFactory jersey3RemoteRegionClientFactory = new Jersey3RemoteRegionClientFactory(serverConfig, serverCodecs, clusterResolver.getRegion()); + TransportClientFactory metricsFactory = MetricsCollectingEurekaHttpClient.createFactory(jersey3RemoteRegionClientFactory); + + SessionedEurekaHttpClient client = new SessionedEurekaHttpClient( + Names.REMOTE, + RetryableEurekaHttpClient.createFactory( + Names.REMOTE, + transportConfig, + clusterResolver, + createFactory(metricsFactory), + ServerStatusEvaluators.legacyEvaluator()), + RECONNECT_INTERVAL_MINUTES * 60 * 1000 + ); + return client; + } + + public static TransportClientFactory createFactory(final TransportClientFactory delegateFactory) { + final DnsServiceImpl dnsService = new DnsServiceImpl(); + return new TransportClientFactory() { + @Override + public EurekaHttpClient newClient(EurekaEndpoint endpoint) { + return new RedirectingEurekaHttpClient(endpoint.getServiceUrl(), delegateFactory, dnsService); + } + + @Override + public void shutdown() { + delegateFactory.shutdown(); + } + }; + } +} diff --git a/eureka-core-jersey3/src/main/java/com/netflix/eureka/transport/Jersey3RemoteRegionClientFactory.java b/eureka-core-jersey3/src/main/java/com/netflix/eureka/transport/Jersey3RemoteRegionClientFactory.java new file mode 100644 index 0000000000..faa6251eb0 --- /dev/null +++ b/eureka-core-jersey3/src/main/java/com/netflix/eureka/transport/Jersey3RemoteRegionClientFactory.java @@ -0,0 +1,117 @@ +package com.netflix.eureka.transport; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +import com.netflix.discovery.shared.resolver.EurekaEndpoint; +import com.netflix.discovery.shared.transport.EurekaHttpClient; +import com.netflix.discovery.shared.transport.TransportClientFactory; +import com.netflix.discovery.shared.transport.jersey3.EurekaIdentityHeaderFilter; +import com.netflix.discovery.shared.transport.jersey3.EurekaJersey3Client; +import com.netflix.discovery.shared.transport.jersey3.EurekaJersey3ClientImpl; +import com.netflix.discovery.shared.transport.jersey3.Jersey3ApplicationClient; +import com.netflix.eureka.EurekaServerConfig; +import com.netflix.eureka.EurekaServerIdentity; +import com.netflix.eureka.GzipEncodingEnforcingFilter; +import com.netflix.eureka.resources.ServerCodecs; +import jakarta.inject.Inject; +import jakarta.ws.rs.client.Client; +import jakarta.ws.rs.core.Feature; +import jakarta.ws.rs.core.MultivaluedHashMap; +import org.glassfish.jersey.message.GZipEncoder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Jersey3RemoteRegionClientFactory implements TransportClientFactory { + + private static final Logger logger = LoggerFactory.getLogger(Jersey3RemoteRegionClientFactory.class); + + private final EurekaServerConfig serverConfig; + private final ServerCodecs serverCodecs; + private final String region; + + private volatile EurekaJersey3Client jerseyClient; + private final Object lock = new Object(); + + @Inject + public Jersey3RemoteRegionClientFactory(EurekaServerConfig serverConfig, + ServerCodecs serverCodecs, + String region) { + this.serverConfig = serverConfig; + this.serverCodecs = serverCodecs; + this.region = region; + } + + @Override + public EurekaHttpClient newClient(EurekaEndpoint endpoint) { + return new Jersey3ApplicationClient(getOrCreateJerseyClient(region, endpoint).getClient(), endpoint.getServiceUrl(), new MultivaluedHashMap<>()); + } + + @Override + public void shutdown() { + if (jerseyClient != null) { + jerseyClient.destroyResources(); + } + } + + private EurekaJersey3Client getOrCreateJerseyClient(String region, EurekaEndpoint endpoint) { + if (jerseyClient != null) { + return jerseyClient; + } + + synchronized (lock) { + if (jerseyClient == null) { + EurekaJersey3ClientImpl.EurekaJersey3ClientBuilder clientBuilder = new EurekaJersey3ClientImpl.EurekaJersey3ClientBuilder() + .withUserAgent("Java-EurekaClient-RemoteRegion") + .withEncoderWrapper(serverCodecs.getFullJsonCodec()) + .withDecoderWrapper(serverCodecs.getFullJsonCodec()) + .withConnectionTimeout(serverConfig.getRemoteRegionConnectTimeoutMs()) + .withReadTimeout(serverConfig.getRemoteRegionReadTimeoutMs()) + .withMaxConnectionsPerHost(serverConfig.getRemoteRegionTotalConnectionsPerHost()) + .withMaxTotalConnections(serverConfig.getRemoteRegionTotalConnections()) + .withConnectionIdleTimeout(serverConfig.getRemoteRegionConnectionIdleTimeoutSeconds()); + + if (endpoint.isSecure()) { + clientBuilder.withClientName("Discovery-RemoteRegionClient-" + region); + } else if ("true".equals(System.getProperty("com.netflix.eureka.shouldSSLConnectionsUseSystemSocketFactory"))) { + clientBuilder.withClientName("Discovery-RemoteRegionSystemSecureClient-" + region) + .withSystemSSLConfiguration(); + } else { + clientBuilder.withClientName("Discovery-RemoteRegionSecureClient-" + region) + .withTrustStoreFile( + serverConfig.getRemoteRegionTrustStore(), + serverConfig.getRemoteRegionTrustStorePassword() + ); + } + jerseyClient = clientBuilder.build(); + Client client = jerseyClient.getClient(); + + // Add gzip content encoding support + boolean enableGZIPContentEncodingFilter = serverConfig.shouldGZipContentFromRemoteRegion(); + if (enableGZIPContentEncodingFilter) { + client.register((Feature) context -> { + context.register(new GzipEncodingEnforcingFilter()); + // this filter doesn't add gzip Content-Encoding header + context.register(new GZipEncoder()); + return true; + }); + } + + // always enable client identity headers + String ip = null; + try { + ip = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + logger.warn("Cannot find localhost ip", e); + } + EurekaServerIdentity identity = new EurekaServerIdentity(ip); + client.register((Feature) context -> { + context.register(new EurekaIdentityHeaderFilter(identity)); + return true; + }); + } + } + + return jerseyClient; + } +} diff --git a/eureka-core/src/main/java/com/netflix/eureka/EurekaBootStrap.java b/eureka-core/src/main/java/com/netflix/eureka/EurekaBootStrap.java index dd4a42c229..3f5f95cbe7 100644 --- a/eureka-core/src/main/java/com/netflix/eureka/EurekaBootStrap.java +++ b/eureka-core/src/main/java/com/netflix/eureka/EurekaBootStrap.java @@ -16,7 +16,9 @@ package com.netflix.eureka; -import com.netflix.discovery.shared.transport.EurekaHttpClient; +import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs; +import com.netflix.discovery.shared.transport.jersey.TransportClientFactories; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletContextEvent; import jakarta.servlet.ServletContextListener; @@ -167,12 +169,13 @@ protected void initEurekaServerContext() throws Exception { instanceConfig, new EurekaConfigBasedInstanceInfoProvider(instanceConfig).get()); EurekaClientConfig eurekaClientConfig = new DefaultEurekaClientConfig(); - eurekaClient = new DiscoveryClient(applicationInfoManager, eurekaClientConfig); + eurekaClient = new DiscoveryClient(applicationInfoManager, eurekaClientConfig, getTransportClientFactories(), + getDiscoveryClientOptionalArgs()); } else { applicationInfoManager = eurekaClient.getApplicationInfoManager(); } - EurekaHttpClient eurekaHttpClient = getEurekaHttpClient(); + EurekaServerHttpClientFactory eurekaServerHttpClientFactory = getEurekaServerHttpClientFactory(); PeerAwareInstanceRegistry registry; if (isAws(applicationInfoManager.getInfo())) { @@ -180,7 +183,7 @@ protected void initEurekaServerContext() throws Exception { eurekaServerConfig, eurekaClient.getEurekaClientConfig(), serverCodecs, - eurekaClient, eurekaHttpClient + eurekaClient, eurekaServerHttpClientFactory ); awsBinder = new AwsBinderDelegate(eurekaServerConfig, eurekaClient.getEurekaClientConfig(), registry, applicationInfoManager); awsBinder.start(); @@ -189,7 +192,7 @@ protected void initEurekaServerContext() throws Exception { eurekaServerConfig, eurekaClient.getEurekaClientConfig(), serverCodecs, - eurekaClient, eurekaHttpClient + eurekaClient, eurekaServerHttpClientFactory ); } @@ -222,7 +225,13 @@ protected void initEurekaServerContext() throws Exception { EurekaMonitors.registerAllStats(); } - protected abstract EurekaHttpClient getEurekaHttpClient(); + protected AbstractDiscoveryClientOptionalArgs getDiscoveryClientOptionalArgs() { + return null; + } + + protected abstract TransportClientFactories getTransportClientFactories(); + + protected abstract EurekaServerHttpClientFactory getEurekaServerHttpClientFactory(); protected abstract PeerEurekaNodes getPeerEurekaNodes(PeerAwareInstanceRegistry registry, EurekaServerConfig eurekaServerConfig, EurekaClientConfig eurekaClientConfig, ServerCodecs serverCodecs, ApplicationInfoManager applicationInfoManager); diff --git a/eureka-core/src/main/java/com/netflix/eureka/registry/AbstractInstanceRegistry.java b/eureka-core/src/main/java/com/netflix/eureka/registry/AbstractInstanceRegistry.java index 410640db2a..83cad7cb8f 100644 --- a/eureka-core/src/main/java/com/netflix/eureka/registry/AbstractInstanceRegistry.java +++ b/eureka-core/src/main/java/com/netflix/eureka/registry/AbstractInstanceRegistry.java @@ -17,6 +17,7 @@ package com.netflix.eureka.registry; import com.netflix.discovery.shared.transport.EurekaHttpClient; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; import jakarta.annotation.Nullable; import java.net.MalformedURLException; import java.net.URL; @@ -109,17 +110,17 @@ public abstract class AbstractInstanceRegistry implements InstanceRegistry { protected final EurekaServerConfig serverConfig; protected final EurekaClientConfig clientConfig; protected final ServerCodecs serverCodecs; - private EurekaHttpClient eurekaHttpClient; + private EurekaServerHttpClientFactory eurekaServerHttpClientFactory; protected volatile ResponseCache responseCache; /** * Create a new, empty instance registry. */ - protected AbstractInstanceRegistry(EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs, EurekaHttpClient eurekaHttpClient) { + protected AbstractInstanceRegistry(EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs, EurekaServerHttpClientFactory eurekaServerHttpClientFactory) { this.serverConfig = serverConfig; this.clientConfig = clientConfig; this.serverCodecs = serverCodecs; - this.eurekaHttpClient = eurekaHttpClient; + this.eurekaServerHttpClientFactory = eurekaServerHttpClientFactory; this.recentCanceledQueue = new CircularQueue>(1000); this.recentRegisteredQueue = new CircularQueue>(1000); @@ -145,7 +146,9 @@ protected void initRemoteRegionRegistry() throws MalformedURLException { for (Map.Entry remoteRegionUrlWithName : remoteRegionUrlsWithName.entrySet()) { RemoteRegionRegistry remoteRegionRegistry = new RemoteRegionRegistry( serverConfig, - eurekaHttpClient, + clientConfig, + serverCodecs, + eurekaServerHttpClientFactory, remoteRegionUrlWithName.getKey(), new URL(remoteRegionUrlWithName.getValue())); regionNameVSRemoteRegistry.put(remoteRegionUrlWithName.getKey(), remoteRegionRegistry); diff --git a/eureka-core/src/main/java/com/netflix/eureka/registry/AwsInstanceRegistry.java b/eureka-core/src/main/java/com/netflix/eureka/registry/AwsInstanceRegistry.java index 8dd02b557d..34f9a1f866 100644 --- a/eureka-core/src/main/java/com/netflix/eureka/registry/AwsInstanceRegistry.java +++ b/eureka-core/src/main/java/com/netflix/eureka/registry/AwsInstanceRegistry.java @@ -30,6 +30,7 @@ import com.netflix.eureka.registry.rule.OverrideExistsRule; import com.netflix.eureka.resources.ServerCodecs; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; import jakarta.inject.Inject; import jakarta.inject.Singleton; @@ -49,8 +50,8 @@ public class AwsInstanceRegistry extends PeerAwareInstanceRegistryImpl { public AwsInstanceRegistry(EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs, - EurekaClient eurekaClient, EurekaHttpClient eurekaHttpClient) { - super(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaHttpClient); + EurekaClient eurekaClient, EurekaServerHttpClientFactory eurekaServerHttpClientFactory) { + super(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaServerHttpClientFactory); } @Override diff --git a/eureka-core/src/main/java/com/netflix/eureka/registry/PeerAwareInstanceRegistryImpl.java b/eureka-core/src/main/java/com/netflix/eureka/registry/PeerAwareInstanceRegistryImpl.java index 56628b03b3..3e5ae408b3 100644 --- a/eureka-core/src/main/java/com/netflix/eureka/registry/PeerAwareInstanceRegistryImpl.java +++ b/eureka-core/src/main/java/com/netflix/eureka/registry/PeerAwareInstanceRegistryImpl.java @@ -50,6 +50,7 @@ import com.netflix.eureka.lease.Lease; import com.netflix.eureka.resources.ASGResource.ASGStatus; import com.netflix.eureka.resources.ServerCodecs; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; import com.netflix.eureka.util.MeasuredRate; import com.netflix.servo.DefaultMonitorRegistry; import com.netflix.servo.annotations.DataSourceType; @@ -132,9 +133,9 @@ public PeerAwareInstanceRegistryImpl( EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs, - EurekaClient eurekaClient, EurekaHttpClient eurekaHttpClient + EurekaClient eurekaClient, EurekaServerHttpClientFactory eurekaServerHttpClientFactory ) { - super(serverConfig, clientConfig, serverCodecs, eurekaHttpClient); + super(serverConfig, clientConfig, serverCodecs, eurekaServerHttpClientFactory); this.eurekaClient = eurekaClient; this.numberOfReplicationsLastMin = new MeasuredRate(1000 * 60 * 1); // We first check if the instance is STARTING or DOWN, then we check explicit overrides, diff --git a/eureka-core/src/main/java/com/netflix/eureka/registry/RemoteRegionRegistry.java b/eureka-core/src/main/java/com/netflix/eureka/registry/RemoteRegionRegistry.java index ddfb8d7aa1..9b9b4b72a3 100644 --- a/eureka-core/src/main/java/com/netflix/eureka/registry/RemoteRegionRegistry.java +++ b/eureka-core/src/main/java/com/netflix/eureka/registry/RemoteRegionRegistry.java @@ -15,11 +15,10 @@ */ package com.netflix.eureka.registry; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; import jakarta.inject.Inject; -import jakarta.ws.rs.core.MediaType; -import java.net.InetAddress; + import java.net.URL; -import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -46,9 +45,7 @@ import com.netflix.discovery.shared.transport.EurekaHttpClient; import com.netflix.discovery.shared.transport.EurekaHttpResponse; import com.netflix.eureka.EurekaServerConfig; -import com.netflix.eureka.EurekaServerIdentity; import com.netflix.eureka.resources.ServerCodecs; -import com.netflix.eureka.transport.EurekaServerHttpClients; import com.netflix.servo.annotations.DataSourceType; import com.netflix.servo.monitor.Monitors; import com.netflix.servo.monitor.Stopwatch; @@ -96,9 +93,9 @@ public class RemoteRegionRegistry implements LookupService { @Inject public RemoteRegionRegistry(EurekaServerConfig serverConfig, -// EurekaClientConfig clientConfig, -// ServerCodecs serverCodecs, - EurekaHttpClient eurekaHttpClient, + EurekaClientConfig clientConfig, + ServerCodecs serverCodecs, + EurekaServerHttpClientFactory eurekaServerHttpClientFactory, String regionName, URL remoteRegionURL) { this.serverConfig = serverConfig; @@ -130,13 +127,11 @@ public RemoteRegionRegistry(EurekaServerConfig serverConfig, } discoveryJerseyClient = clientBuilder.build(); discoveryApacheClient = null; // discoveryJerseyClient.getClient(); - */ // should we enable GZip decoding of responses based on Response Headers? if (serverConfig.shouldGZipContentFromRemoteRegion()) { // compressed only if there exists a 'Content-Encoding' header whose value is "gzip" - // FIXME 2.0 - // discoveryApacheClient.addFilter(new GZIPContentEncodingFilter(false)); + discoveryApacheClient.addFilter(new GZIPContentEncodingFilter(false)); } /*String ip = null; @@ -145,20 +140,22 @@ public RemoteRegionRegistry(EurekaServerConfig serverConfig, } catch (UnknownHostException e) { logger.warn("Cannot find localhost ip", e); } - EurekaServerIdentity identity = new EurekaServerIdentity(ip);*/ - // FIXME 2.0 - // discoveryApacheClient.addFilter(new EurekaIdentityHeaderFilter(identity)); + EurekaServerIdentity identity = new EurekaServerIdentity(ip); + discoveryApacheClient.addFilter(new EurekaIdentityHeaderFilter(identity)); + */ // Configure new transport layer (candidate for injecting in the future) - /*EurekaHttpClient newEurekaHttpClient = null; + EurekaHttpClient newEurekaHttpClient = null; try { ClusterResolver clusterResolver = StaticClusterResolver.fromURL(regionName, remoteRegionURL); - newEurekaHttpClient = EurekaServerHttpClients.createRemoteRegionClient( + newEurekaHttpClient = eurekaServerHttpClientFactory.createRemoteRegionClient( serverConfig, clientConfig.getTransportConfig(), serverCodecs, clusterResolver); } catch (Exception e) { - logger.warn("Transport initialization failure", e); - }*/ - this.eurekaHttpClient = eurekaHttpClient; + // logger.warn("Transport initialization failure", e); + // FIXME: 2.0 go back to warn above when apache client reinstated + throw new RuntimeException("Transport initialization failure", e); + } + this.eurekaHttpClient = newEurekaHttpClient; try { if (fetchRegistry()) { diff --git a/eureka-core/src/main/java/com/netflix/eureka/transport/EurekaServerHttpClientFactory.java b/eureka-core/src/main/java/com/netflix/eureka/transport/EurekaServerHttpClientFactory.java new file mode 100644 index 0000000000..099d385d92 --- /dev/null +++ b/eureka-core/src/main/java/com/netflix/eureka/transport/EurekaServerHttpClientFactory.java @@ -0,0 +1,17 @@ +package com.netflix.eureka.transport; + +import com.netflix.discovery.shared.resolver.ClusterResolver; +import com.netflix.discovery.shared.resolver.EurekaEndpoint; +import com.netflix.discovery.shared.transport.EurekaHttpClient; +import com.netflix.discovery.shared.transport.EurekaTransportConfig; +import com.netflix.eureka.EurekaServerConfig; +import com.netflix.eureka.resources.ServerCodecs; + +public interface EurekaServerHttpClientFactory { + + EurekaHttpClient createRemoteRegionClient(EurekaServerConfig serverConfig, + EurekaTransportConfig transportConfig, + ServerCodecs serverCodecs, + ClusterResolver clusterResolver); + +} diff --git a/eureka-core/src/main/java/com/netflix/eureka/transport/EurekaServerHttpClients.java b/eureka-core/src/main/java/com/netflix/eureka/transport/EurekaServerHttpClients.java deleted file mode 100644 index 8cd6655217..0000000000 --- a/eureka-core/src/main/java/com/netflix/eureka/transport/EurekaServerHttpClients.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2015 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.netflix.eureka.transport; - -import com.netflix.discovery.shared.dns.DnsServiceImpl; -import com.netflix.discovery.shared.resolver.ClusterResolver; -import com.netflix.discovery.shared.resolver.EurekaEndpoint; -import com.netflix.discovery.shared.transport.EurekaHttpClient; -import com.netflix.discovery.shared.transport.EurekaTransportConfig; -import com.netflix.discovery.shared.transport.TransportClientFactory; -import com.netflix.discovery.shared.transport.decorator.MetricsCollectingEurekaHttpClient; -import com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient; -import com.netflix.discovery.shared.transport.decorator.RedirectingEurekaHttpClient; -import com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient; -import com.netflix.discovery.shared.transport.decorator.ServerStatusEvaluators; -import com.netflix.eureka.EurekaServerConfig; -import com.netflix.eureka.Names; -import com.netflix.eureka.resources.ServerCodecs; - -/** - * @author Tomasz Bak - */ -public final class EurekaServerHttpClients { - - public static final long RECONNECT_INTERVAL_MINUTES = 30; - - private EurekaServerHttpClients() { - } - - /** - * {@link EurekaHttpClient} for remote region replication. - */ - public static EurekaHttpClient createRemoteRegionClient(EurekaServerConfig serverConfig, - EurekaTransportConfig transportConfig, - ServerCodecs serverCodecs, - ClusterResolver clusterResolver) { - // FIXME: 2.0 - // JerseyRemoteRegionClientFactory jerseyFactory = new JerseyRemoteRegionClientFactory(serverConfig, serverCodecs, clusterResolver.getRegion()); - TransportClientFactory metricsFactory = null; // MetricsCollectingEurekaHttpClient.createFactory(jerseyFactory); - - SessionedEurekaHttpClient client = new SessionedEurekaHttpClient( - Names.REMOTE, - RetryableEurekaHttpClient.createFactory( - Names.REMOTE, - transportConfig, - clusterResolver, - createFactory(metricsFactory), - ServerStatusEvaluators.legacyEvaluator()), - RECONNECT_INTERVAL_MINUTES * 60 * 1000 - ); - - return client; - } - - public static TransportClientFactory createFactory(final TransportClientFactory delegateFactory) { - final DnsServiceImpl dnsService = new DnsServiceImpl(); - return new TransportClientFactory() { - @Override - public EurekaHttpClient newClient(EurekaEndpoint endpoint) { - return new RedirectingEurekaHttpClient(endpoint.getServiceUrl(), delegateFactory, dnsService); - } - - @Override - public void shutdown() { - delegateFactory.shutdown(); - } - }; - } - -} diff --git a/eureka-examples/build.gradle b/eureka-examples/build.gradle index 06f0ca63a6..2d55f28123 100644 --- a/eureka-examples/build.gradle +++ b/eureka-examples/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'application' dependencies { - implementation project(':eureka-client') + implementation project(':eureka-client-jersey3') implementation files('conf') implementation 'jakarta.inject:jakarta.inject-api:2.0.1' diff --git a/eureka-examples/src/main/java/com/netflix/eureka/ExampleEurekaClient.java b/eureka-examples/src/main/java/com/netflix/eureka/ExampleEurekaClient.java index 93a28e2f89..a3c719eb1a 100644 --- a/eureka-examples/src/main/java/com/netflix/eureka/ExampleEurekaClient.java +++ b/eureka-examples/src/main/java/com/netflix/eureka/ExampleEurekaClient.java @@ -33,6 +33,7 @@ import com.netflix.discovery.DiscoveryClient; import com.netflix.discovery.EurekaClient; import com.netflix.discovery.EurekaClientConfig; +import com.netflix.discovery.shared.transport.jersey3.Jersey3TransportClientFactories; /** * Sample Eureka client that discovers the example service using Eureka and sends requests. @@ -57,7 +58,7 @@ private static synchronized ApplicationInfoManager initializeApplicationInfoMana private static synchronized EurekaClient initializeEurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig clientConfig) { if (eurekaClient == null) { - eurekaClient = new DiscoveryClient(applicationInfoManager, clientConfig); + eurekaClient = new DiscoveryClient(applicationInfoManager, clientConfig, Jersey3TransportClientFactories.getInstance()); } return eurekaClient; diff --git a/eureka-examples/src/main/java/com/netflix/eureka/ExampleEurekaService.java b/eureka-examples/src/main/java/com/netflix/eureka/ExampleEurekaService.java index d7597501f6..7cec89f6ad 100644 --- a/eureka-examples/src/main/java/com/netflix/eureka/ExampleEurekaService.java +++ b/eureka-examples/src/main/java/com/netflix/eureka/ExampleEurekaService.java @@ -27,6 +27,7 @@ import com.netflix.config.DynamicPropertyFactory; import com.netflix.discovery.DefaultEurekaClientConfig; import com.netflix.discovery.EurekaClientConfig; +import com.netflix.discovery.shared.transport.jersey3.Jersey3TransportClientFactories; /** * Sample Eureka service that registers with Eureka to receive and process requests. @@ -49,7 +50,7 @@ private static synchronized ApplicationInfoManager initializeApplicationInfoMana private static synchronized EurekaClient initializeEurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig clientConfig) { if (eurekaClient == null) { - eurekaClient = new DiscoveryClient(applicationInfoManager, clientConfig); + eurekaClient = new DiscoveryClient(applicationInfoManager, clientConfig, Jersey3TransportClientFactories.getInstance()); } return eurekaClient; diff --git a/eureka-server/build.gradle b/eureka-server/build.gradle index 3561fbafd6..bf878b8844 100644 --- a/eureka-server/build.gradle +++ b/eureka-server/build.gradle @@ -17,6 +17,7 @@ dependencies { testImplementation "org.mockito:mockito-core:${mockitoVersion}" testImplementation "org.eclipse.jetty:jetty-server:$jetty_version" testImplementation "org.eclipse.jetty:jetty-webapp:$jetty_version" + testRuntimeOnly 'org.slf4j:slf4j-simple:2.0.0-beta1' } task copyLibs(type: Copy) { diff --git a/eureka-server/src/main/webapp/WEB-INF/web.xml b/eureka-server/src/main/webapp/WEB-INF/web.xml index dfb2e6238a..6c04ba0d4a 100755 --- a/eureka-server/src/main/webapp/WEB-INF/web.xml +++ b/eureka-server/src/main/webapp/WEB-INF/web.xml @@ -5,7 +5,7 @@ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> - com.netflix.eureka.EurekaBootStrap + com.netflix.eureka.Jersey3EurekaBootStrap @@ -28,7 +28,7 @@ jersey - com.sun.jersey.spi.container.servlet.ServletContainer + org.glassfish.jersey.servlet.ServletContainer com.sun.jersey.config.property.WebPageContentRegex /(flex|images|js|css|jsp)/.* diff --git a/eureka-server/src/test/java/com/netflix/eureka/resources/EurekaClientServerRestIntegrationTest.java b/eureka-server/src/test/java/com/netflix/eureka/resources/EurekaClientServerRestIntegrationTest.java index 6fb7688eee..cdd4af28a0 100644 --- a/eureka-server/src/test/java/com/netflix/eureka/resources/EurekaClientServerRestIntegrationTest.java +++ b/eureka-server/src/test/java/com/netflix/eureka/resources/EurekaClientServerRestIntegrationTest.java @@ -75,7 +75,7 @@ public static void setUp() throws Exception { startServer(); createEurekaServerConfig(); - // FIXME 2.0 + // FIXME: 2.0 httpClientFactory = Jersey3ApplicationClientFactory.newBuilder() .withClientName("testEurekaClient") .withConnectionTimeout(1000) @@ -88,7 +88,7 @@ public static void setUp() throws Exception { jerseyEurekaClient = httpClientFactory.newClient(new DefaultEndpoint(eurekaServiceUrl)); ServerCodecs serverCodecs = new DefaultServerCodecs(eurekaServerConfig); - // FIXME 2.0 + // FIXME: 2.0 jerseyReplicationClient = Jersey3ReplicationClient.createReplicationClient( eurekaServerConfig, serverCodecs, diff --git a/eureka-test-utils/build.gradle b/eureka-test-utils/build.gradle index 8fc21beef1..c214afbda7 100644 --- a/eureka-test-utils/build.gradle +++ b/eureka-test-utils/build.gradle @@ -3,4 +3,5 @@ dependencies { api project(':eureka-core-jersey3') api "junit:junit:${junit_version}" api "org.mockito:mockito-core:${mockitoVersion}" + testRuntimeOnly 'org.slf4j:slf4j-simple:2.0.0-beta1' } diff --git a/eureka-test-utils/src/main/java/com/netflix/discovery/junit/resource/DiscoveryClientResource.java b/eureka-test-utils/src/main/java/com/netflix/discovery/junit/resource/DiscoveryClientResource.java index 6006237f69..fc85f6bece 100644 --- a/eureka-test-utils/src/main/java/com/netflix/discovery/junit/resource/DiscoveryClientResource.java +++ b/eureka-test-utils/src/main/java/com/netflix/discovery/junit/resource/DiscoveryClientResource.java @@ -98,10 +98,10 @@ public EurekaClient getClient() { EurekaClientConfig clientConfig = createEurekaClientConfig(); Jersey3DiscoveryClientOptionalArgs args = new Jersey3DiscoveryClientOptionalArgs(); - args.setTransportClientFactories(new Jersey3TransportClientFactories()); eventBus = new EventBusImpl(); + eventBus = new EventBusImpl(); args.setEventBus(eventBus); - client = new DiscoveryClient(applicationInfoManager, clientConfig, args); + client = new DiscoveryClient(applicationInfoManager, clientConfig, Jersey3TransportClientFactories.getInstance(), args); } catch (Exception e) { throw new RuntimeException(e); } @@ -253,9 +253,7 @@ public static EurekaClient setupDiscoveryClient(InstanceInfo clientInstanceInfo) ApplicationInfoManager applicationInfoManager = new ApplicationInfoManager(new MyDataCenterInstanceConfig(), clientInstanceInfo); DiscoveryManager.getInstance().setEurekaClientConfig(config); - Jersey3DiscoveryClientOptionalArgs args = new Jersey3DiscoveryClientOptionalArgs(); - args.setTransportClientFactories(new Jersey3TransportClientFactories()); - EurekaClient client = new DiscoveryClient(applicationInfoManager, config, args); + EurekaClient client = new DiscoveryClient(applicationInfoManager, config, Jersey3TransportClientFactories.getInstance()); return client; } @@ -265,10 +263,8 @@ public static EurekaClient setupInjector(InstanceInfo clientInstanceInfo) { DefaultEurekaClientConfig config = new DefaultEurekaClientConfig(); // setup config in advance, used in initialize converter DiscoveryManager.getInstance().setEurekaClientConfig(config); - Jersey3DiscoveryClientOptionalArgs args = new Jersey3DiscoveryClientOptionalArgs(); - args.setTransportClientFactories(new Jersey3TransportClientFactories()); - EurekaClient client = new DiscoveryClient(clientInstanceInfo, config, args); - ApplicationInfoManager.getInstance().initComponent(new MyDataCenterInstanceConfig()); + ApplicationInfoManager applicationInfoManager1 = new ApplicationInfoManager(new MyDataCenterInstanceConfig(), clientInstanceInfo); + EurekaClient client = new DiscoveryClient(applicationInfoManager1, config, Jersey3TransportClientFactories.getInstance()); return client; } diff --git a/eureka-test-utils/src/main/java/com/netflix/discovery/shared/transport/EurekaHttpClientCompatibilityTestSuite.java b/eureka-test-utils/src/main/java/com/netflix/discovery/shared/transport/EurekaHttpClientCompatibilityTestSuite.java index c2c821ccb9..eed7948dad 100644 --- a/eureka-test-utils/src/main/java/com/netflix/discovery/shared/transport/EurekaHttpClientCompatibilityTestSuite.java +++ b/eureka-test-utils/src/main/java/com/netflix/discovery/shared/transport/EurekaHttpClientCompatibilityTestSuite.java @@ -29,7 +29,6 @@ import com.netflix.discovery.util.InstanceInfoGenerator; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import static com.netflix.discovery.shared.transport.EurekaHttpResponse.anEurekaHttpResponse; @@ -230,7 +229,6 @@ public void testStatusUpdateDeleteRequest() throws Exception { } @Test - @Ignore // FIXME: 2.0 public void testBasicAuthentication() throws Exception { InstanceInfo instance = InstanceInfoGenerator.takeOne(); when(requestHandler.register(instance)).thenReturn(EurekaHttpResponse.status(204)); diff --git a/eureka-test-utils/src/test/java/com/netflix/discovery/shared/transport/SimpleEurekaHttpServerTest.java b/eureka-test-utils/src/test/java/com/netflix/discovery/shared/transport/SimpleEurekaHttpServerTest.java index 55dfbfc2cd..f2167000a3 100644 --- a/eureka-test-utils/src/test/java/com/netflix/discovery/shared/transport/SimpleEurekaHttpServerTest.java +++ b/eureka-test-utils/src/test/java/com/netflix/discovery/shared/transport/SimpleEurekaHttpServerTest.java @@ -23,6 +23,7 @@ import com.netflix.discovery.converters.wrappers.CodecWrappers.JacksonJson; import com.netflix.discovery.shared.resolver.DefaultEndpoint; import com.netflix.discovery.shared.transport.jersey3.Jersey3ApplicationClientFactory; +import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; import org.junit.After; /** @@ -44,7 +45,11 @@ public void tearDown() throws Exception { protected EurekaHttpClient getEurekaHttpClient(URI serviceURI) { Preconditions.checkState(eurekaHttpClient == null, "EurekaHttpClient has been already created"); - httpClientFactory = Jersey3ApplicationClientFactory.newBuilder() + Jersey3ApplicationClientFactory.Jersey3ApplicationClientFactoryBuilder factoryBuilder = Jersey3ApplicationClientFactory.newBuilder(); + if (serviceURI.getUserInfo() != null) { + factoryBuilder.withFeature(HttpAuthenticationFeature.basicBuilder().build()); + } + httpClientFactory = factoryBuilder .withClientName("test") .withMaxConnectionsPerHost(10) .withMaxTotalConnections(10) diff --git a/eureka-tests/src/test/java/com/netflix/eureka/AbstractTester.java b/eureka-tests/src/test/java/com/netflix/eureka/AbstractTester.java index ff58eac53c..56707f2c60 100644 --- a/eureka-tests/src/test/java/com/netflix/eureka/AbstractTester.java +++ b/eureka-tests/src/test/java/com/netflix/eureka/AbstractTester.java @@ -2,8 +2,12 @@ import com.netflix.discovery.Jersey3DiscoveryClientOptionalArgs; import com.netflix.discovery.shared.resolver.DefaultEndpoint; +import com.netflix.discovery.shared.resolver.EurekaEndpoint; +import com.netflix.discovery.shared.resolver.StaticClusterResolver; import com.netflix.discovery.shared.transport.EurekaHttpClient; import com.netflix.discovery.shared.transport.jersey3.Jersey3TransportClientFactories; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; +import com.netflix.eureka.transport.Jersey3EurekaServerHttpClientFactory; import jakarta.annotation.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -99,14 +103,11 @@ public void setUp() throws Exception { InstanceInfo instanceInfo = builder.build(); ApplicationInfoManager applicationInfoManager = new ApplicationInfoManager(new MyDataCenterInstanceConfig(), instanceInfo); - Jersey3DiscoveryClientOptionalArgs args = new Jersey3DiscoveryClientOptionalArgs(); - args.setTransportClientFactories(new Jersey3TransportClientFactories()); - client = new DiscoveryClient(applicationInfoManager, clientConfig, args); + client = new DiscoveryClient(applicationInfoManager, clientConfig, Jersey3TransportClientFactories.getInstance()); ServerCodecs serverCodecs = new DefaultServerCodecs(serverConfig); - EurekaHttpClient eurekaHttpClient = Jersey3TransportClientFactories.getInstance().newTransportClientFactory(clientConfig, - Collections.emptyList(), instanceInfo).newClient(new DefaultEndpoint(serviceUri)); - registry = makePeerAwareInstanceRegistry(serverConfig, clientConfig, serverCodecs, client, eurekaHttpClient); + EurekaServerHttpClientFactory eurekaServerHttpClientFactory = new Jersey3EurekaServerHttpClientFactory(); + registry = makePeerAwareInstanceRegistry(serverConfig, clientConfig, serverCodecs, client, eurekaServerHttpClientFactory); serverContext = new DefaultEurekaServerContext( serverConfig, serverCodecs, @@ -132,8 +133,8 @@ public Name getName() { protected PeerAwareInstanceRegistryImpl makePeerAwareInstanceRegistry(EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs, - EurekaClient eurekaClient, EurekaHttpClient eurekaHttpClient) { - return new TestPeerAwareInstanceRegistry(serverConfig, clientConfig, serverCodecs, eurekaHttpClient, eurekaClient); + EurekaClient eurekaClient, EurekaServerHttpClientFactory eurekaServerHttpClientFactory) { + return new TestPeerAwareInstanceRegistry(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaServerHttpClientFactory); } protected MockRemoteEurekaServer newMockRemoteServer() { @@ -239,9 +240,8 @@ private static class TestPeerAwareInstanceRegistry extends PeerAwareInstanceRegi public TestPeerAwareInstanceRegistry(EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs, - EurekaHttpClient eurekaHttpClient, - EurekaClient eurekaClient) { - super(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaHttpClient); + EurekaClient eurekaClient, EurekaServerHttpClientFactory eurekaServerHttpClientFactory) { + super(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaServerHttpClientFactory); } @Override diff --git a/eureka-tests/src/test/java/com/netflix/eureka/registry/AwsInstanceRegistryTest.java b/eureka-tests/src/test/java/com/netflix/eureka/registry/AwsInstanceRegistryTest.java index 7314ebce20..c6dffad1b8 100644 --- a/eureka-tests/src/test/java/com/netflix/eureka/registry/AwsInstanceRegistryTest.java +++ b/eureka-tests/src/test/java/com/netflix/eureka/registry/AwsInstanceRegistryTest.java @@ -10,6 +10,7 @@ import com.netflix.discovery.shared.transport.EurekaHttpClient; import com.netflix.eureka.EurekaServerConfig; import com.netflix.eureka.resources.ServerCodecs; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; import org.junit.Test; @@ -73,8 +74,8 @@ protected DataCenterInfo getDataCenterInfo() { protected PeerAwareInstanceRegistryImpl makePeerAwareInstanceRegistry(EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs, - EurekaClient eurekaClient, EurekaHttpClient eurekaHttpClient) { - return new TestAwsInstanceRegistry(serverConfig, clientConfig, serverCodecs, eurekaHttpClient, eurekaClient); + EurekaClient eurekaClient, EurekaServerHttpClientFactory eurekaServerHttpClientFactory) { + return new TestAwsInstanceRegistry(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaServerHttpClientFactory); } @@ -83,9 +84,8 @@ private static class TestAwsInstanceRegistry extends AwsInstanceRegistry { public TestAwsInstanceRegistry(EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs, - EurekaHttpClient eurekaHttpClient, - EurekaClient eurekaClient) { - super(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaHttpClient); + EurekaClient eurekaClient, EurekaServerHttpClientFactory eurekaServerHttpClientFactory) { + super(serverConfig, clientConfig, serverCodecs, eurekaClient, eurekaServerHttpClientFactory); } @Override diff --git a/eureka-tests/src/test/java/com/netflix/eureka/registry/ResponseCacheTest.java b/eureka-tests/src/test/java/com/netflix/eureka/registry/ResponseCacheTest.java index 80c4a0c75a..407cb0ec44 100644 --- a/eureka-tests/src/test/java/com/netflix/eureka/registry/ResponseCacheTest.java +++ b/eureka-tests/src/test/java/com/netflix/eureka/registry/ResponseCacheTest.java @@ -8,6 +8,8 @@ import com.netflix.eureka.EurekaServerConfig; import com.netflix.eureka.Version; import com.netflix.eureka.resources.DefaultServerCodecs; +import com.netflix.eureka.transport.EurekaServerHttpClientFactory; +import com.netflix.eureka.transport.Jersey3EurekaServerHttpClientFactory; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -33,12 +35,12 @@ public void setUp() throws Exception { EurekaServerConfig serverConfig = spy(new DefaultEurekaServerConfig()); doReturn(true).when(serverConfig).disableTransparentFallbackToOtherRegion(); - EurekaHttpClient eurekaHttpClient = null; // FIXME 2.0 + EurekaServerHttpClientFactory eurekaServerHttpClientFactory = new Jersey3EurekaServerHttpClientFactory(); testRegistry = new PeerAwareInstanceRegistryImpl( serverConfig, new DefaultEurekaClientConfig(), new DefaultServerCodecs(serverConfig), - client, eurekaHttpClient + client, eurekaServerHttpClientFactory ); testRegistry.init(serverContext.getPeerEurekaNodes()); testRegistry.syncUp(); diff --git a/eureka-tests/src/test/java/com/netflix/eureka/registry/TimeConsumingInstanceRegistryTest.java b/eureka-tests/src/test/java/com/netflix/eureka/registry/TimeConsumingInstanceRegistryTest.java index e7a03e5456..bf7dd1163c 100644 --- a/eureka-tests/src/test/java/com/netflix/eureka/registry/TimeConsumingInstanceRegistryTest.java +++ b/eureka-tests/src/test/java/com/netflix/eureka/registry/TimeConsumingInstanceRegistryTest.java @@ -10,7 +10,6 @@ import com.netflix.eureka.test.async.executor.SequentialEvents; import com.netflix.eureka.test.async.executor.SingleEvent; import org.junit.Assert; -import org.junit.Ignore; import org.junit.Test; /** @@ -68,7 +67,6 @@ public class TimeConsumingInstanceRegistryTest extends AbstractTester { * Note that there is a thread retrieving and printing out registry status for debugging purpose. */ @Test - @Ignore // FIXME: 2.0 public void testLeaseExpirationAndUpdateRenewalThreshold() throws InterruptedException { final int registeredInstanceCount = 50; final int leaseDurationInSecs = 30; diff --git a/settings.gradle b/settings.gradle index 7e9e749192..7e89ce686a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,8 +3,6 @@ include 'eureka-client', 'eureka-client-jersey3', 'eureka-client-archaius2', 'eureka-server', - // FIXME 2.0 - // 'eureka-server-governator', 'eureka-core', 'eureka-core-jersey3', 'eureka-resources',