in eureka-client/src/main/java/com/netflix/discovery/shared/transport/EurekaHttpClients.java [170:229]
static ClosableResolver<AwsEndpoint> compositeBootstrapResolver(
final EurekaClientConfig clientConfig,
final EurekaTransportConfig transportConfig,
final TransportClientFactory transportClientFactory,
final InstanceInfo myInstanceInfo,
final ApplicationsResolver.ApplicationsSource applicationsSource,
final EndpointRandomizer randomizer)
{
final ClusterResolver rootResolver = new ConfigClusterResolver(clientConfig, myInstanceInfo);
final EurekaHttpResolver remoteResolver = new EurekaHttpResolver(
clientConfig,
transportConfig,
rootResolver,
transportClientFactory,
transportConfig.getWriteClusterVip()
);
final ApplicationsResolver localResolver = new ApplicationsResolver(
clientConfig,
transportConfig,
applicationsSource,
transportConfig.getWriteClusterVip()
);
ClusterResolver<AwsEndpoint> compositeResolver = new ClusterResolver<AwsEndpoint>() {
@Override
public String getRegion() {
return clientConfig.getRegion();
}
@Override
public List<AwsEndpoint> getClusterEndpoints() {
List<AwsEndpoint> result = localResolver.getClusterEndpoints();
if (result.isEmpty()) {
result = remoteResolver.getClusterEndpoints();
}
return result;
}
};
List<AwsEndpoint> initialValue = compositeResolver.getClusterEndpoints();
if (initialValue.isEmpty()) {
String msg = "Initial resolution of Eureka endpoints failed. Check ConfigClusterResolver logs for more info";
logger.error(msg);
failFastOnInitCheck(clientConfig, msg);
}
String[] availZones = clientConfig.getAvailabilityZones(clientConfig.getRegion());
String myZone = InstanceInfo.getZone(availZones, myInstanceInfo);
return new AsyncResolver<>(
EurekaClientNames.BOOTSTRAP,
new ZoneAffinityClusterResolver(compositeResolver, myZone, true, randomizer),
initialValue,
transportConfig.getAsyncExecutorThreadPoolSize(),
transportConfig.getAsyncResolverRefreshIntervalMs()
);
}