/*
* 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.discovery.shared.resolver;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import com.netflix.discovery.EurekaClientConfig;
import com.netflix.discovery.endpoint.EndpointUtils;
import com.netflix.discovery.shared.resolver.aws.AwsEndpoint;
import com.netflix.discovery.shared.resolver.aws.DnsTxtRecordClusterResolver;
import com.netflix.discovery.shared.resolver.aws.ZoneAffinityClusterResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @deprecated as of 2016-02-11. Will be deleted in an upcoming release.
* See {@link com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver} for replacement.
*
* Server resolver that mimics the behavior of the original implementation. Either DNS or server
* list resolvers are instantiated, and they can be swapped in runtime because of the dynamic configuration
* change.
* <h3>Failures</h3>
* If there is configuration change (from DNS to server list or reverse), and the new resolver cannot be instantiated,
* it will be retried with exponential back-off (see {@link ReloadingClusterResolver}).
*
* @author Tomasz Bak
*/
@Deprecated
public class LegacyClusterResolver implements ClusterResolver<AwsEndpoint> {
private static final Logger logger = LoggerFactory.getLogger(LegacyClusterResolver.class);
private final ClusterResolver<AwsEndpoint> delegate;
public LegacyClusterResolver(EurekaClientConfig clientConfig, String myZone) {
this.delegate = new ReloadingClusterResolver<>(
new LegacyClusterResolverFactory(clientConfig, myZone),
clientConfig.getEurekaServiceUrlPollIntervalSeconds() * 1000
);
}
@Override
public String getRegion() {
return delegate.getRegion();
}
@Override
public List<AwsEndpoint> getClusterEndpoints() {
return delegate.getClusterEndpoints();
}
static class LegacyClusterResolverFactory implements ClusterResolverFactory<AwsEndpoint> {
private final EurekaClientConfig clientConfig;
private final String myRegion;
private final String myZone;
LegacyClusterResolverFactory(EurekaClientConfig clientConfig, String myZone) {
this.clientConfig = clientConfig;
this.myRegion = clientConfig.getRegion();
this.myZone = myZone;
}
@Override
public ClusterResolver<AwsEndpoint> createClusterResolver() {
ClusterResolver<AwsEndpoint> newResolver;
if (clientConfig.shouldUseDnsForFetchingServiceUrls()) {
String discoveryDnsName = "txt." + myRegion + '.' + clientConfig.getEurekaServerDNSName();
newResolver = new DnsTxtRecordClusterResolver(
myRegion,
discoveryDnsName,
true,
Integer.parseInt(clientConfig.getEurekaServerPort()),
false,
clientConfig.getEurekaServerURLContext()
);
newResolver = new ZoneAffinityClusterResolver(newResolver, myZone, clientConfig.shouldPreferSameZoneEureka());
} else {
// FIXME Not randomized in the EndpointUtils.getServiceUrlsFromConfig, and no zone info to do this here
newResolver = new StaticClusterResolver<>(myRegion, createEurekaEndpointsFromConfig());
}
return newResolver;
}
private List<AwsEndpoint> createEurekaEndpointsFromConfig() {
List<String> serviceUrls = EndpointUtils.getServiceUrlsFromConfig(clientConfig, myZone, clientConfig.shouldPreferSameZoneEureka());
List<AwsEndpoint> endpoints = new ArrayList<>(serviceUrls.size());
for (String serviceUrl : serviceUrls) {
try {
URI serviceURI = new URI(serviceUrl);
endpoints.add(new AwsEndpoint(
serviceURI.getHost(),
serviceURI.getPort(),
"https".equalsIgnoreCase(serviceURI.getSchemeSpecificPart()),
serviceURI.getPath(),
myRegion,
myZone
));
} catch (URISyntaxException ignore) {
logger.warn("Invalid eureka server URI: {}; removing from the server pool", serviceUrl);
}
}
return endpoints;
}
}
}