跳到主要内容

Eureka(7)-- EurekaHttpClient类

1.EurekaHttpClient是一个接口类,实现类有AbstractJerseyEurekaHttpClient、EurekaHttpClientDecorator 用于完成Eureka Client和Eureka Server的交互

2.EurekaHttpClientDecorator的实现类有RedirectingEurekaHttpClient、RetryableEurekaHttpClient、SessionedEurekaHttpClient

3.在DiscoveryClient初始化的时候做初始化

@Singleton
public class DiscoveryClient implements EurekaClient {



private static final class EurekaTransport {


private ClosableResolver bootstrapResolver;
private TransportClientFactory transportClientFactory;

private EurekaHttpClient registrationClient;
private EurekaHttpClientFactory registrationClientFactory;

private EurekaHttpClient queryClient;
private EurekaHttpClientFactory queryClientFactory;
}

private final EurekaTransport eurekaTransport;

@Inject
DiscoveryClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config, DiscoveryClientOptionalArgs args,
Provider<BackupRegistry> backupRegistryProvider) {



eurekaTransport = new EurekaTransport();
scheduleServerEndpointTask(eurekaTransport, args);

}

private void scheduleServerEndpointTask(EurekaTransport eurekaTransport,
DiscoveryClientOptionalArgs args) {


EurekaJerseyClient providedJerseyClient = args == null
? null
: args.eurekaJerseyClient;

eurekaTransport.transportClientFactory = providedJerseyClient == null
? TransportClientFactories.newTransportClientFactory(clientConfig, additionalFilters, applicationInfoManager.getInfo())
: TransportClientFactories.newTransportClientFactory(additionalFilters, providedJerseyClient);

if (clientConfig.shouldRegisterWithEureka()) {


EurekaHttpClientFactory newRegistrationClientFactory = null;
EurekaHttpClient newRegistrationClient = null;
try {


newRegistrationClientFactory = EurekaHttpClients.registrationClientFactory(
eurekaTransport.bootstrapResolver,
eurekaTransport.transportClientFactory,
transportConfig
);
newRegistrationClient = newRegistrationClientFactory.newClient();
} catch (Exception e) {


logger.warn("Experimental transport initialization failure", e);
}
eurekaTransport.registrationClientFactory = newRegistrationClientFactory;
eurekaTransport.registrationClient = newRegistrationClient;
}

}
}

public final class EurekaHttpClients {


public static EurekaHttpClientFactory registrationClientFactory(ClusterResolver bootstrapResolver,
TransportClientFactory transportClientFactory,
EurekaTransportConfig transportConfig) {


return canonicalClientFactory(EurekaClientNames.REGISTRATION, transportConfig, bootstrapResolver, transportClientFactory);
}

static EurekaHttpClientFactory canonicalClientFactory(final String name,
final EurekaTransportConfig transportConfig,
final ClusterResolver<EurekaEndpoint> clusterResolver,
final TransportClientFactory transportClientFactory) {



return new EurekaHttpClientFactory() {


@Override
public EurekaHttpClient newClient() {


return new SessionedEurekaHttpClient(
name,
RetryableEurekaHttpClient.createFactory(
name,
transportConfig,
clusterResolver,
RedirectingEurekaHttpClient.createFactory(transportClientFactory),
ServerStatusEvaluators.legacyEvaluator()),
transportConfig.getSessionedClientReconnectIntervalSeconds() * 1000
);
}

@Override
public void shutdown() {


wrapClosable(clusterResolver).shutdown();
}
};
}
}

public class RedirectingEurekaHttpClient extends EurekaHttpClientDecorator {


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();
}
};
}
}

public class RetryableEurekaHttpClient extends EurekaHttpClientDecorator {


public static EurekaHttpClientFactory createFactory(final String name,
final EurekaTransportConfig transportConfig,
final ClusterResolver<EurekaEndpoint> clusterResolver,
final TransportClientFactory delegateFactory,
final ServerStatusEvaluator serverStatusEvaluator) {


return new EurekaHttpClientFactory() {


@Override
public EurekaHttpClient newClient() {


return new RetryableEurekaHttpClient(name, transportConfig, clusterResolver, delegateFactory,
serverStatusEvaluator, DEFAULT_NUMBER_OF_RETRIES);
}

@Override
public void shutdown() {


delegateFactory.shutdown();
}
};
}
}

public final class TransportClientFactories {



public static TransportClientFactory newTransportClientFactory(final EurekaClientConfig clientConfig,
final Collection<ClientFilter> additionalFilters,
final InstanceInfo myInstanceInfo) {


final TransportClientFactory jerseyFactory = JerseyEurekaHttpClientFactory.create(
clientConfig,
additionalFilters,
myInstanceInfo,
new EurekaClientIdentity(myInstanceInfo.getIPAddr())
);
final TransportClientFactory metricsFactory = MetricsCollectingEurekaHttpClient.createFactory(jerseyFactory);

return new TransportClientFactory() {


@Override
public EurekaHttpClient newClient(EurekaEndpoint serviceUrl) {


return metricsFactory.newClient(serviceUrl);
}

@Override
public void shutdown() {


metricsFactory.shutdown();
jerseyFactory.shutdown();
}
};
}

}

public class JerseyEurekaHttpClientFactory implements TransportClientFactory {



public static JerseyEurekaHttpClientFactory create(EurekaClientConfig clientConfig,
Collection<ClientFilter> additionalFilters,
InstanceInfo myInstanceInfo,
AbstractEurekaIdentity clientIdentity) {


JerseyEurekaHttpClientFactoryBuilder clientBuilder = newBuilder()
.withAdditionalFilters(additionalFilters)
.withMyInstanceInfo(myInstanceInfo)
.withUserAgent("Java-EurekaClient")
.withClientAccept(EurekaAccept.fromString(clientConfig.getClientDataAccept()))
.withAllowRedirect(clientConfig.allowRedirects())
.withConnectionTimeout(clientConfig.getEurekaServerConnectTimeoutSeconds() * 1000)
.withReadTimeout(clientConfig.getEurekaServerReadTimeoutSeconds() * 1000)
.withMaxConnectionsPerHost(clientConfig.getEurekaServerTotalConnectionsPerHost())
.withMaxTotalConnections(clientConfig.getEurekaServerTotalConnections())
.withConnectionIdleTimeout(clientConfig.getEurekaConnectionIdleTimeoutSeconds())
.withEncoder(clientConfig.getEncoderName())
.withDecoder(clientConfig.getDecoderName(), clientConfig.getClientDataAccept())
.withClientIdentity(clientIdentity);

if ("true".equals(System.getProperty("com.netflix.eureka.shouldSSLConnectionsUseSystemSocketFactory"))) {


clientBuilder.withClientName("DiscoveryClient-HTTPClient-System").withSystemSSLConfiguration();
} else if (clientConfig.getProxyHost() != null && clientConfig.getProxyPort() != null) {


clientBuilder.withClientName("Proxy-DiscoveryClient-HTTPClient")
.withProxy(
clientConfig.getProxyHost(), Integer.parseInt(clientConfig.getProxyPort()),
clientConfig.getProxyUserName(), clientConfig.getProxyPassword()
);
} else {


clientBuilder.withClientName("DiscoveryClient-HTTPClient");
}

return clientBuilder.build();
}
}