package com.netflix.discovery.shared.resolver.aws; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClientConfig; import com.netflix.discovery.shared.Applications; import com.netflix.discovery.shared.resolver.ClusterResolver; import com.netflix.discovery.shared.resolver.ResolverUtils; import com.netflix.discovery.shared.transport.EurekaTransportConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; /** * @author David Liu */ public class ApplicationsResolver implements ClusterResolver<AwsEndpoint> { private static final Logger logger = LoggerFactory.getLogger(ApplicationsResolver.class); private final EurekaClientConfig clientConfig; private final EurekaTransportConfig transportConfig; private final ApplicationsSource applicationsSource; private final String vipAddress; @Deprecated public ApplicationsResolver(EurekaClientConfig clientConfig, EurekaTransportConfig transportConfig, ApplicationsSource applicationsSource) { this(clientConfig, transportConfig, applicationsSource, transportConfig.getReadClusterVip()); } public ApplicationsResolver(EurekaClientConfig clientConfig, EurekaTransportConfig transportConfig, ApplicationsSource applicationsSource, String vipAddress) { this.clientConfig = clientConfig; this.transportConfig = transportConfig; this.applicationsSource = applicationsSource; this.vipAddress = vipAddress; } @Override public String getRegion() { return null; } @Override public List<AwsEndpoint> getClusterEndpoints() { List<AwsEndpoint> result = new ArrayList<>(); Applications applications = applicationsSource.getApplications( transportConfig.getApplicationsResolverDataStalenessThresholdSeconds(), TimeUnit.SECONDS); if (applications != null && vipAddress != null) { List<InstanceInfo> validInstanceInfos = applications.getInstancesByVirtualHostName(vipAddress); for (InstanceInfo instanceInfo : validInstanceInfos) { if (instanceInfo.getStatus() == InstanceInfo.InstanceStatus.UP) { AwsEndpoint endpoint = ResolverUtils.instanceInfoToEndpoint(clientConfig, transportConfig, instanceInfo); if (endpoint != null) { result.add(endpoint); } } } } logger.debug("Retrieved endpoint list {}", result); return result; } public interface ApplicationsSource { /** * @return the known set of Applications, or null if the data is beyond the stalenss threshold */ Applications getApplications(int stalenessThreshold, TimeUnit timeUnit); } }