diff --git a/pom.xml b/pom.xml index 548062a4..a819cc37 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 1.0.0.BUILD-SNAPSHOT ${basedir} 0.6.5 - 1.2.0 + 1.2.5-rc.1 8.10.0 1.4.15 2.1.0 diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/DataCenterAwareJacksonCodec.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/DataCenterAwareJacksonCodec.java deleted file mode 100644 index ea18e02d..00000000 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/DataCenterAwareJacksonCodec.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2013-2015 the original author or authors. - * - * 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 org.springframework.cloud.netflix.eureka; - -import java.io.IOException; -import java.lang.reflect.Field; -import java.util.Map; - -import lombok.SneakyThrows; -import lombok.extern.apachecommons.CommonsLog; - -import org.springframework.util.ReflectionUtils; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.Version; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import com.fasterxml.jackson.databind.ObjectWriter; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.netflix.appinfo.DataCenterInfo; -import com.netflix.appinfo.InstanceInfo; -import com.netflix.appinfo.LeaseInfo; -import com.netflix.discovery.converters.EurekaJacksonCodec; -import com.netflix.discovery.converters.StringCache; -import com.netflix.discovery.shared.Application; -import com.netflix.discovery.shared.Applications; - -/** - * @author Spencer Gibb - */ -public class DataCenterAwareJacksonCodec extends EurekaJacksonCodec { - private static final Version VERSION = new Version(1, 1, 0, null); - - @SneakyThrows - public DataCenterAwareJacksonCodec() { - super(); - - ObjectMapper mapper = new ObjectMapper(); - - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - - SimpleModule module = new SimpleModule("eureka1.x", VERSION); - module.addSerializer(DataCenterInfo.class, new DataCenterInfoSerializer()); - module.addSerializer(InstanceInfo.class, new DCAwareInstanceInfoSerializer()); - module.addSerializer(Application.class, new ApplicationSerializer()); - module.addSerializer(Applications.class, new ApplicationsSerializer(getVersionDeltaKey(), getAppHashCodeKey())); - - module.addDeserializer(DataCenterInfo.class, new DataCenterInfoDeserializer(getCache())); - module.addDeserializer(LeaseInfo.class, new LeaseInfoDeserializer()); - module.addDeserializer(InstanceInfo.class, new DCAwareInstanceInfoDeserializer(getCache())); - module.addDeserializer(Application.class, new ApplicationDeserializer(mapper, getCache())); - module.addDeserializer(Applications.class, new ApplicationsDeserializer(mapper, getVersionDeltaKey(), getAppHashCodeKey())); - - mapper.registerModule(module); - - Map, ObjectReader> readers = getField("objectReaderByClass"); - readers.put(InstanceInfo.class, mapper.reader().withType(InstanceInfo.class).withRootName("instance")); - readers.put(Application.class, mapper.reader().withType(Application.class).withRootName("application")); - readers.put(Applications.class, mapper.reader().withType(Applications.class).withRootName("applications")); - - Map, ObjectWriter> writers = getField("objectWriterByClass"); - writers.put(InstanceInfo.class, mapper.writer().withType(InstanceInfo.class).withRootName("instance")); - writers.put(Application.class, mapper.writer().withType(Application.class).withRootName("application")); - writers.put(Applications.class, mapper.writer().withType(Applications.class).withRootName("applications")); - - Field field = ReflectionUtils.findField(EurekaJacksonCodec.class, "mapper"); - ReflectionUtils.makeAccessible(field); - field.set(this, mapper); - } - - private T getField(String name) throws IllegalAccessException { - Field field = ReflectionUtils.findField(EurekaJacksonCodec.class, name); - ReflectionUtils.makeAccessible(field); - return (T) field.get(this); - } - - @SneakyThrows - public static void init() { - if (!(EurekaJacksonCodec.getInstance() instanceof DataCenterAwareJacksonCodec)) { - INSTANCE = new DataCenterAwareJacksonCodec(); - } - } - - @CommonsLog - private static class DCAwareInstanceInfoSerializer extends - InstanceInfoSerializer { - - @Override - public void serialize(InstanceInfo info, JsonGenerator jgen, - SerializerProvider provider) throws IOException { - String instanceId = info.getMetadata().get("instanceId"); - DataCenterInfo dataCenter = info.getDataCenterInfo(); - if (instanceId != null - && DataCenterInfo.Name.Amazon != dataCenter.getName()) { - String old = info.getId(); - String id = old.endsWith(instanceId) ? old : old + ":" + instanceId; - info = new InstanceInfo.Builder(info).setDataCenterInfo( - new InstanceIdDataCenterInfo(id)).build(); - } - - super.serialize(info, jgen, provider); - } - } - - private class DCAwareInstanceInfoDeserializer extends InstanceInfoDeserializer { - private DCAwareInstanceInfoDeserializer(StringCache cache) { - super(getMapper(), cache); - } - - @Override - public InstanceInfo deserialize(JsonParser jp, DeserializationContext context) - throws IOException { - InstanceInfo info = super.deserialize(jp, context); - String instanceId = info.getMetadata().get("instanceId"); - DataCenterInfo dataCenter = info.getDataCenterInfo(); - if (instanceId != null && DataCenterInfo.Name.Amazon != dataCenter.getName()) { - String old = info.getId(); - String id = old.endsWith(instanceId) ? old : old + ":" + instanceId; - info = new InstanceInfo.Builder(info).setDataCenterInfo( - new InstanceIdDataCenterInfo(id)).build(); - } - return info; - } - } - -} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/DataCenterAwareMarshallingStrategy.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/DataCenterAwareMarshallingStrategy.java deleted file mode 100644 index 49d67d6a..00000000 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/DataCenterAwareMarshallingStrategy.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2013-2014 the original author or authors. - * - * 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 org.springframework.cloud.netflix.eureka; - -import com.netflix.appinfo.DataCenterInfo; -import com.netflix.appinfo.DataCenterInfo.Name; -import com.netflix.appinfo.InstanceInfo; -import com.netflix.discovery.converters.Converters.ApplicationsConverter; -import com.netflix.discovery.converters.Converters.InstanceInfoConverter; -import com.netflix.discovery.converters.StringCache; -import com.netflix.discovery.shared.Applications; -import com.thoughtworks.xstream.MarshallingStrategy; -import com.thoughtworks.xstream.converters.Converter; -import com.thoughtworks.xstream.converters.ConverterLookup; -import com.thoughtworks.xstream.converters.DataHolder; -import com.thoughtworks.xstream.converters.MarshallingContext; -import com.thoughtworks.xstream.converters.UnmarshallingContext; -import com.thoughtworks.xstream.core.TreeMarshallingStrategy; -import com.thoughtworks.xstream.io.HierarchicalStreamReader; -import com.thoughtworks.xstream.io.HierarchicalStreamWriter; -import com.thoughtworks.xstream.mapper.Mapper; - -/** - * A special purpose wrapper for an XStream TreeMarshallingStrategy that is aware of the - * {@link InstanceInfo} type and can create a more useful {@link DataCenterInfo} for it - * after unmarshalling. If the InstanceInfo has a metadataMap containing an - * instanceId, and the DataCenterInfo is not already an AmazonInfo, then the - * instanceId is used to create an identifier, but appending it to the existing one. This - * is useful when not running Eureka in bare EC2 VMs, so the EC2 metadata is not available - * for uniquely identifying the InstanceInfo (the default is to just use the hostname, but - * that isn't very useful when sitting behind a proxy). - * - * @author Dave Syer - */ -public class DataCenterAwareMarshallingStrategy implements MarshallingStrategy { - - private TreeMarshallingStrategy delegate = new TreeMarshallingStrategy(); - - public DataCenterAwareMarshallingStrategy() { - } - - @Override - public Object unmarshal(Object root, HierarchicalStreamReader reader, - DataHolder dataHolder, ConverterLookup converterLookup, Mapper mapper) { - ConverterLookup wrapped = new DataCenterAwareConverterLookup(converterLookup); - return this.delegate.unmarshal(root, reader, dataHolder, wrapped, mapper); - } - - @Override - public void marshal(HierarchicalStreamWriter writer, Object obj, - ConverterLookup converterLookup, Mapper mapper, DataHolder dataHolder) { - ConverterLookup wrapped = new DataCenterAwareConverterLookup(converterLookup); - this.delegate.marshal(writer, obj, wrapped, mapper, dataHolder); - } - - private static class DataCenterAwareConverterLookup implements ConverterLookup { - - private ConverterLookup delegate; - - public DataCenterAwareConverterLookup(ConverterLookup delegate) { - this.delegate = delegate; - } - - @Override - public Converter lookupConverterForType(@SuppressWarnings("rawtypes") Class type) { - Converter converter = this.delegate.lookupConverterForType(type); - if (InstanceInfo.class == type) { - return new DataCenterAwareConverter(); - } - else if (Applications.class == type) { - return new ApplicationsConverter(); - } - return converter; - } - - } - - private static class DataCenterAwareConverter extends InstanceInfoConverter { - - public DataCenterAwareConverter() { - super(new StringCache()); - } - - @Override - public void marshal(Object source, HierarchicalStreamWriter writer, - MarshallingContext context) { - InstanceInfo info = (InstanceInfo) source; - String instanceId = info.getMetadata().get("instanceId"); - DataCenterInfo dataCenter = info.getDataCenterInfo(); - if (instanceId != null && Name.Amazon != dataCenter.getName()) { - String old = info.getId(); - String id = old.endsWith(instanceId) ? old : old + ":" + instanceId; - info = new InstanceInfo.Builder(info).setDataCenterInfo( - new InstanceIdDataCenterInfo(id)).build(); - source = info; - } - super.marshal(source, writer, context); - } - - @Override - public Object unmarshal(HierarchicalStreamReader reader, - UnmarshallingContext context) { - Object obj = super.unmarshal(reader, context); - InstanceInfo info = (InstanceInfo) obj; - String instanceId = info.getMetadata().get("instanceId"); - DataCenterInfo dataCenter = info.getDataCenterInfo(); - if (instanceId != null && Name.Amazon != dataCenter.getName()) { - String old = info.getId(); - String id = old.endsWith(instanceId) ? old : old + ":" + instanceId; - info = new InstanceInfo.Builder(info).setDataCenterInfo( - new InstanceIdDataCenterInfo(id)).build(); - obj = info; - } - return obj; - } - - } - -} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java index 7349f539..4d09a563 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java @@ -22,8 +22,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import javax.annotation.PostConstruct; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -52,8 +50,6 @@ import com.netflix.appinfo.EurekaInstanceConfig; import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.EurekaClient; import com.netflix.discovery.EurekaClientConfig; -import com.netflix.discovery.converters.JsonXStream; -import com.netflix.discovery.converters.XmlXStream; import lombok.SneakyThrows; @@ -72,15 +68,6 @@ public class EurekaClientAutoConfiguration { @Value("${server.port:${SERVER_PORT:${PORT:8080}}}") int nonSecurePort; - @PostConstruct - public void init() { - DataCenterAwareJacksonCodec.init(); - XmlXStream.getInstance() - .setMarshallingStrategy(new DataCenterAwareMarshallingStrategy()); - JsonXStream.getInstance() - .setMarshallingStrategy(new DataCenterAwareMarshallingStrategy()); - } - @Bean @ConditionalOnMissingBean(value = EurekaClientConfig.class, search = SearchStrategy.CURRENT) public EurekaClientConfigBean eurekaClientConfigBean() { diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java index eb2cd702..0d2e01f5 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java @@ -26,6 +26,7 @@ import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; +import com.netflix.appinfo.EurekaAccept; import com.netflix.discovery.EurekaClientConfig; /** @@ -90,7 +91,7 @@ public class EurekaClientConfigBean implements EurekaClientConfig { private int cacheRefreshExecutorExponentialBackOffBound = 10; - private Map serviceUrl = new HashMap(); + private Map serviceUrl = new HashMap<>(); { this.serviceUrl.put(DEFAULT_ZONE, DEFAULT_URL); } @@ -123,6 +124,12 @@ public class EurekaClientConfigBean implements EurekaClientConfig { private boolean onDemandUpdateStatusChange = true; + private String encoderName; + + private String decoderName; + + private String clientDataAccept = EurekaAccept.full.name(); + @Override public boolean shouldGZipContent() { return this.gZipContent; @@ -199,4 +206,5 @@ public class EurekaClientConfigBean implements EurekaClientConfig { public boolean shouldOnDemandUpdateStatusChange() { return this.onDemandUpdateStatusChange; } + } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaDiscoveryClientConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaDiscoveryClientConfiguration.java index eb69fb7c..991be28e 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaDiscoveryClientConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaDiscoveryClientConfiguration.java @@ -16,8 +16,6 @@ package org.springframework.cloud.netflix.eureka; -import java.util.Collections; -import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -26,8 +24,6 @@ import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.health.HealthAggregator; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.boot.actuate.health.OrderedHealthAggregator; -import org.springframework.boot.actuate.metrics.reader.CompositeMetricReader; -import org.springframework.boot.actuate.metrics.reader.MetricReader; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -182,19 +178,12 @@ public class EurekaDiscoveryClientConfiguration implements SmartLifecycle, Order @Configuration @ConditionalOnClass(Endpoint.class) - @ConditionalOnBean(MetricReader.class) protected static class EurekaHealthIndicatorConfiguration { - - @Autowired - private List metricReaders = Collections.emptyList(); - @Bean @ConditionalOnMissingBean public EurekaHealthIndicator eurekaHealthIndicator(EurekaClient eurekaClient, - EurekaInstanceConfig config) { - CompositeMetricReader metrics = new CompositeMetricReader( - this.metricReaders.toArray(new MetricReader[0])); - return new EurekaHealthIndicator(eurekaClient, metrics, config); + EurekaInstanceConfig instanceConfig, EurekaClientConfig clientConfig) { + return new EurekaHealthIndicator(eurekaClient, instanceConfig, clientConfig); } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaHealthIndicator.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaHealthIndicator.java index 8c389266..975cc820 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaHealthIndicator.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaHealthIndicator.java @@ -20,15 +20,15 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; -import com.netflix.discovery.EurekaClient; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.Health.Builder; import org.springframework.boot.actuate.health.Status; -import org.springframework.boot.actuate.metrics.Metric; -import org.springframework.boot.actuate.metrics.reader.MetricReader; import org.springframework.cloud.client.discovery.health.DiscoveryHealthIndicator; import com.netflix.appinfo.EurekaInstanceConfig; +import com.netflix.discovery.DiscoveryClient; +import com.netflix.discovery.EurekaClient; +import com.netflix.discovery.EurekaClientConfig; import com.netflix.discovery.shared.Application; import com.netflix.discovery.shared.Applications; @@ -39,18 +39,16 @@ public class EurekaHealthIndicator implements DiscoveryHealthIndicator { private final EurekaClient eurekaClient; - private final MetricReader metrics; - private final EurekaInstanceConfig instanceConfig; - private int failCount = 0; + private final EurekaClientConfig clientConfig; - public EurekaHealthIndicator(EurekaClient eurekaClient, MetricReader metrics, - EurekaInstanceConfig instanceConfig) { + public EurekaHealthIndicator(EurekaClient eurekaClient, + EurekaInstanceConfig instanceConfig, EurekaClientConfig clientConfig) { super(); this.eurekaClient = eurekaClient; - this.metrics = metrics; this.instanceConfig = instanceConfig; + this.clientConfig = clientConfig; } @Override @@ -67,24 +65,28 @@ public class EurekaHealthIndicator implements DiscoveryHealthIndicator { } private Status getStatus(Builder builder) { - Status status = new Status(this.eurekaClient.getInstanceRemoteStatus().toString(), + Status status = new Status( + this.eurekaClient.getInstanceRemoteStatus().toString(), "Remote status from Eureka server"); - @SuppressWarnings("unchecked") - Metric value = (Metric) this.metrics - .findOne("counter.servo.discoveryclient_failed"); - if (value != null) { - int renewalPeriod = this.instanceConfig.getLeaseRenewalIntervalInSeconds(); - int latest = value.getValue().intValue(); - builder.withDetail("failCount", latest); - builder.withDetail("renewalPeriod", renewalPeriod); - if (this.failCount < latest) { - status = new Status("UP", "Eureka discovery client is reporting failures"); - this.failCount = latest; + + if (eurekaClient instanceof DiscoveryClient && clientConfig.shouldFetchRegistry()) { + DiscoveryClient discoveryClient = (DiscoveryClient) eurekaClient; + long lastFetch = discoveryClient.getLastSuccessfulRegistryFetchTimePeriod(); + + if (lastFetch < 0) { + status = new Status("UP", + "Eureka discovery client has not yet successfully connected to a Eureka server"); } - else { - status = new Status("UP", "No new failures in Eureka discovery client"); + else if (lastFetch > clientConfig.getRegistryFetchIntervalSeconds() * 2) { + status = new Status("UP", + "Eureka discovery client is reporting failures to connect to a Eureka server"); + builder.withDetail("renewalPeriod", + instanceConfig.getLeaseRenewalIntervalInSeconds()); + builder.withDetail("failCount", + lastFetch / clientConfig.getRegistryFetchIntervalSeconds()); } } + return status; } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java index 0a4a5115..507d1187 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java @@ -24,6 +24,7 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.Map; +import com.netflix.appinfo.MyDataCenterInfo; import lombok.AccessLevel; import lombok.Data; import lombok.Getter; @@ -38,7 +39,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import com.netflix.appinfo.DataCenterInfo; import com.netflix.appinfo.EurekaInstanceConfig; import com.netflix.appinfo.InstanceInfo.InstanceStatus; -import com.netflix.appinfo.UniqueIdentifier; /** * @author Dave Syer @@ -76,13 +76,15 @@ public class EurekaInstanceConfigBean implements EurekaInstanceConfig { @Value("${spring.application.name:unknown}") private String virtualHostName; + private String sid; + private String secureVirtualHostName; private String aSGName; private Map metadataMap = new HashMap<>(); - private DataCenterInfo dataCenterInfo = new IdentifyingDataCenterInfo(); + private DataCenterInfo dataCenterInfo = new MyDataCenterInfo(DataCenterInfo.Name.MyOwn); private String ipAddress = this.hostInfo.ipAddress; @@ -112,7 +114,15 @@ public class EurekaInstanceConfigBean implements EurekaInstanceConfig { return getHostName(false); } - @Override + @Override + public String getSID() { + if (this.sid == null && this.metadataMap != null) { + return this.metadataMap.get("instanceId"); + } + return sid; + } + + @Override public boolean getSecurePortEnabled() { return this.securePortEnabled; } @@ -173,26 +183,4 @@ public class EurekaInstanceConfigBean implements EurekaInstanceConfig { private String ipAddress; private String hostname; } - - private final class IdentifyingDataCenterInfo implements DataCenterInfo, - UniqueIdentifier { - - @Getter - @Setter - private Name name = Name.MyOwn; - - @Override - public String getId() { - String instanceId = EurekaInstanceConfigBean.this.metadataMap - .get("instanceId"); - if (instanceId != null) { - String old = getHostname(); - String id = old.endsWith(instanceId) ? old : old + ":" + instanceId; - return id; - } - return getHostname(); - } - - } - } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaServerConfigBean.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaServerConfigBean.java index 743779c2..dbc86e6e 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaServerConfigBean.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaServerConfigBean.java @@ -164,6 +164,10 @@ public class EurekaServerConfigBean implements EurekaServerConfig { private boolean enableReplicatedRequestCompression = false; + private String jsonCodecName; + + private String xmlCodecName; + @Override public boolean shouldEnableSelfPreservation() { return this.enableSelfPreservation; @@ -215,6 +219,16 @@ public class EurekaServerConfigBean implements EurekaServerConfig { return this.logIdentityHeaders; } + @Override + public String getJsonCodecName() { + return jsonCodecName; + } + + @Override + public String getXmlCodecName() { + return xmlCodecName; + } + @Override public boolean shouldUseReadOnlyResponseCache() { return this.useReadOnlyResponseCache; diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactory.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactory.java index 6b2c26be..e8f48884 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactory.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactory.java @@ -42,6 +42,7 @@ public class InstanceInfoFactory { builder.setNamespace(config.getNamespace()) .setAppName(config.getAppname()) + .setSID(config.getSID()) .setAppGroupName(config.getAppGroupName()) .setDataCenterInfo(config.getDataCenterInfo()) .setIPAddr(config.getIpAddress()) diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java index 52bba0a8..e3ef656f 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBeanTests.java @@ -31,7 +31,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.test.util.ReflectionTestUtils; import com.netflix.appinfo.InstanceInfo.InstanceStatus; -import com.netflix.appinfo.UniqueIdentifier; /** * @author Dave Syer @@ -43,7 +42,8 @@ public class EurekaInstanceConfigBeanTests { @Before public void init() { - this.hostName = EurekaInstanceConfigBean.getFirstNonLoopbackAddress().getHostName(); + this.hostName = EurekaInstanceConfigBean.getFirstNonLoopbackAddress() + .getHostName(); } @After @@ -53,14 +53,6 @@ public class EurekaInstanceConfigBeanTests { } } - @Test - public void idFromInstanceId() throws Exception { - EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(); - instance.getMetadataMap().put("instanceId", "foo"); - instance.setHostname("bar"); - assertEquals("bar:foo", ((UniqueIdentifier) instance.getDataCenterInfo()).getId()); - } - @Test public void basicBinding() { addEnvironment(this.context, "eureka.instance.appGroupName=mygroup"); @@ -75,6 +67,14 @@ public class EurekaInstanceConfigBeanTests { assertEquals(8888, getInstanceConfig().getNonSecurePort()); } + @Test + public void sid() { + addEnvironment(this.context, "eureka.instance.sid:special"); + setupContext(); + EurekaInstanceConfigBean instance = getInstanceConfig(); + assertEquals("special", instance.getSID()); + } + @Test public void initialHostName() { addEnvironment(this.context, "eureka.instance.appGroupName=mygroup"); @@ -137,16 +137,6 @@ public class EurekaInstanceConfigBeanTests { } - @Test - public void testPreferIpAddressInDatacenter() throws Exception { - addEnvironment(this.context, "eureka.instance.preferIpAddress:true"); - setupContext(); - EurekaInstanceConfigBean instance = getInstanceConfig(); - String id = ((UniqueIdentifier) instance.getDataCenterInfo()).getId(); - assertTrue("Wrong hostname: " + id, id.equals(instance.getIpAddress())); - - } - private void setupContext() { this.context.register(PropertyPlaceholderAutoConfiguration.class, TestConfiguration.class); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactoryTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactoryTests.java new file mode 100644 index 00000000..89b52aa4 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/eureka/InstanceInfoFactoryTests.java @@ -0,0 +1,55 @@ +package org.springframework.cloud.netflix.eureka; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.springframework.boot.test.EnvironmentTestUtils.addEnvironment; + +import org.junit.Test; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Configuration; + +import com.netflix.appinfo.InstanceInfo; + +public class InstanceInfoFactoryTests { + private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + + @Test + public void instanceIdIsHostNameByDefault() { + assertEquals(EurekaInstanceConfigBean.getFirstNonLoopbackAddress().getHostName(), + setupInstance().getId()); + } + + @Test + public void instanceIdIsIpWhenIpPreferred() throws Exception { + assertTrue(setupInstance("eureka.instance.preferIpAddress:true").getId().matches( + "(\\d+\\.){3}\\d+")); + } + + @Test + public void instanceIdIsSidWhenSet() { + assertEquals("special", setupInstance("eureka.instance.sid:special").getId()); + } + + private InstanceInfo setupInstance(String... pairs) { + for (String pair : pairs) + addEnvironment(this.context, pair); + + this.context.register(PropertyPlaceholderAutoConfiguration.class, + TestConfiguration.class); + this.context.refresh(); + + EurekaInstanceConfigBean instanceConfig = getInstanceConfig(); + return new InstanceInfoFactory().create(instanceConfig); + } + + private EurekaInstanceConfigBean getInstanceConfig() { + return this.context.getBean(EurekaInstanceConfigBean.class); + } + + @Configuration + @EnableConfigurationProperties(EurekaInstanceConfigBean.class) + protected static class TestConfiguration { + } +} diff --git a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java index 3c64b54b..7dfd3d03 100644 --- a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java +++ b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java @@ -36,8 +36,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.logging.LoggingSystem; import org.springframework.boot.logging.log4j.Log4JLoggingSystem; -import org.springframework.cloud.netflix.eureka.DataCenterAwareJacksonCodec; -import org.springframework.cloud.netflix.eureka.DataCenterAwareMarshallingStrategy; import org.springframework.cloud.netflix.eureka.EurekaServerConfigBean; import org.springframework.cloud.netflix.eureka.server.advice.LeaseManagerLite; import org.springframework.cloud.netflix.eureka.server.advice.PiggybackMethodInterceptor; @@ -151,11 +149,6 @@ public class EurekaServerInitializerConfiguration EurekaServerConfigurationManager.getInstance() .setConfiguration( EurekaServerInitializerConfiguration.this.eurekaServerConfig); - XmlXStream.getInstance().setMarshallingStrategy( - new DataCenterAwareMarshallingStrategy()); - JsonXStream.getInstance().setMarshallingStrategy( - new DataCenterAwareMarshallingStrategy()); - DataCenterAwareJacksonCodec.init(); EurekaServerInitializerConfiguration.this.applicationContext .publishEvent(new EurekaRegistryAvailableEvent( EurekaServerInitializerConfiguration.this.eurekaServerConfig)); diff --git a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java index 77c761f9..e562e773 100644 --- a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java +++ b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationContextTests.java @@ -16,6 +16,10 @@ package org.springframework.cloud.netflix.eureka.server; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.Collections; import java.util.Map; import org.junit.Test; @@ -28,14 +32,15 @@ import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.boot.test.TestRestTemplate; import org.springframework.cloud.netflix.eureka.server.ApplicationContextTests.Application; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration @@ -86,9 +91,13 @@ public class ApplicationContextTests { @Test public void adminLoads() { + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + @SuppressWarnings("rawtypes") - ResponseEntity entity = new TestRestTemplate().getForEntity( - "http://localhost:" + this.port + "/context/env", Map.class); + ResponseEntity entity = new TestRestTemplate().exchange("http://localhost:" + + this.port + "/context/env", HttpMethod.GET, new HttpEntity<>( + "parameters", headers), Map.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); } diff --git a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationServletPathTests.java b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationServletPathTests.java index b092b31c..aeaad178 100644 --- a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationServletPathTests.java +++ b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationServletPathTests.java @@ -16,6 +16,10 @@ package org.springframework.cloud.netflix.eureka.server; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.Collections; import java.util.Map; import org.junit.Test; @@ -28,14 +32,15 @@ import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.boot.test.TestRestTemplate; import org.springframework.cloud.netflix.eureka.server.ApplicationServletPathTests.Application; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration @@ -97,9 +102,13 @@ public class ApplicationServletPathTests { @Test public void adminLoads() { + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + @SuppressWarnings("rawtypes") - ResponseEntity entity = new TestRestTemplate().getForEntity( - "http://localhost:" + this.port + "/servlet/env", Map.class); + ResponseEntity entity = new TestRestTemplate().exchange("http://localhost:" + + this.port + "/servlet/env", HttpMethod.GET, new HttpEntity<>( + "parameters", headers), Map.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); } diff --git a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationTests.java b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationTests.java index 062d8751..229efad1 100644 --- a/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationTests.java +++ b/spring-cloud-netflix-eureka-server/src/test/java/org/springframework/cloud/netflix/eureka/server/ApplicationTests.java @@ -16,6 +16,11 @@ package org.springframework.cloud.netflix.eureka.server; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +import java.util.Collections; import java.util.Map; import org.junit.Test; @@ -28,15 +33,15 @@ import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.boot.test.TestRestTemplate; import org.springframework.cloud.netflix.eureka.server.ApplicationTests.Application; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; - @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class) @WebAppConfiguration @@ -66,9 +71,13 @@ public class ApplicationTests { @Test public void adminLoads() { + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + @SuppressWarnings("rawtypes") - ResponseEntity entity = new TestRestTemplate().getForEntity( - "http://localhost:" + this.port + "/env", Map.class); + ResponseEntity entity = new TestRestTemplate().exchange("http://localhost:" + + this.port + "/env", HttpMethod.GET, new HttpEntity<>("parameters", + headers), Map.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); } @@ -82,5 +91,4 @@ public class ApplicationTests { assertNotNull(body); assertFalse("basePath contains double slashes", body.contains(basePath + "/")); } - }