From 8ff3462ad8ca31e078b4420fdfff9fae1b62acdd Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Sat, 25 Oct 2014 09:36:04 +0100 Subject: [PATCH] Add bootstrap configuration for eureka-first See gh-42 --- pom.xml | 5 ++ spring-cloud-netflix-core/pom.xml | 5 ++ ...ntConfigServiceBootstrapConfiguration.java | 66 +++++++++++++++++++ .../eureka/EurekaClientAutoConfiguration.java | 27 +++++++- .../eureka/EurekaClientConfiguration.java | 12 ---- .../netflix/hystrix/HystrixConfiguration.java | 2 - .../main/resources/META-INF/spring.factories | 5 +- 7 files changed, 104 insertions(+), 18 deletions(-) create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceBootstrapConfiguration.java diff --git a/pom.xml b/pom.xml index b13fb446..ce717893 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,11 @@ + + org.springframework.cloud + spring-cloud-config-client + 1.0.0.BUILD-SNAPSHOT + org.springframework.cloud spring-cloud-netflix-core diff --git a/spring-cloud-netflix-core/pom.xml b/spring-cloud-netflix-core/pom.xml index b73c3b0f..d4f60f37 100644 --- a/spring-cloud-netflix-core/pom.xml +++ b/spring-cloud-netflix-core/pom.xml @@ -24,6 +24,11 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.cloud + spring-cloud-config-client + true + com.netflix.archaius archaius-core diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceBootstrapConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceBootstrapConfiguration.java new file mode 100644 index 00000000..ab8715a7 --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/config/DiscoveryClientConfigServiceBootstrapConfiguration.java @@ -0,0 +1,66 @@ +/* + * 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.config; + +import lombok.extern.slf4j.Slf4j; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.cloud.config.client.ConfigServicePropertySourceLocator; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration; +import org.springframework.context.ApplicationListener; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.event.ContextRefreshedEvent; + +import com.netflix.appinfo.InstanceInfo; +import com.netflix.discovery.DiscoveryClient; + +/** + * @author Dave Syer + * + */ +@ConditionalOnClass({DiscoveryClient.class, ConfigServicePropertySourceLocator.class}) +@ConditionalOnExpression("${spring.cloud.bootstrap.config.useDiscovery:false}") +@Configuration +@EnableEurekaClient +@Import(EurekaClientAutoConfiguration.class) +@Slf4j +public class DiscoveryClientConfigServiceBootstrapConfiguration implements ApplicationListener { + + private static final String DEFAULT_CONFIG_SERVER = "CONFIGSERVER"; + + @Autowired + private DiscoveryClient client; + + @Autowired + private ConfigServicePropertySourceLocator delegate; + + + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + try { + log.info("Locating configserver via discovery"); + InstanceInfo server = client.getNextServerFromEureka(DEFAULT_CONFIG_SERVER, false); + delegate.setUri(server.getHomePageUrl()); + } catch (Exception e) { + log.warn("Could not locate configserver via discovery", e); + } + } + +} 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 3f50285b..34ca658d 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 @@ -16,15 +16,20 @@ package org.springframework.cloud.netflix.eureka; import javax.annotation.PostConstruct; +import javax.management.MBeanServer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.netflix.servo.ServoMetricReader; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.netflix.appinfo.EurekaInstanceConfig; +import com.netflix.discovery.DiscoveryClient; import com.netflix.discovery.EurekaClientConfig; import com.netflix.discovery.converters.JsonXStream; import com.netflix.discovery.converters.XmlXStream; @@ -38,11 +43,16 @@ import com.netflix.discovery.converters.XmlXStream; @ConditionalOnClass(EurekaClientConfig.class) @ConditionalOnExpression("${eureka.client.enabled:true}") public class EurekaClientAutoConfiguration { - + + @Autowired + private DiscoveryClient discoveryClient; + @PostConstruct public void init() { - XmlXStream.getInstance().setMarshallingStrategy(new DataCenterAwareMarshallingStrategy()); - JsonXStream.getInstance().setMarshallingStrategy(new DataCenterAwareMarshallingStrategy()); + XmlXStream.getInstance().setMarshallingStrategy( + new DataCenterAwareMarshallingStrategy()); + JsonXStream.getInstance().setMarshallingStrategy( + new DataCenterAwareMarshallingStrategy()); } @Bean @@ -56,4 +66,15 @@ public class EurekaClientAutoConfiguration { public EurekaInstanceConfigBean eurekaInstanceConfigBean() { return new EurekaInstanceConfigBean(); } + + @Bean + @ConditionalOnMissingBean + @ConditionalOnBean(MBeanServer.class) + @ConditionalOnExpression("${spring.jmx.enabled:true}") + public EurekaHealthIndicator eurekaHealthIndicator(MBeanServer server, + EurekaInstanceConfig config) { + return new EurekaHealthIndicator(discoveryClient, new ServoMetricReader(server), + config); + } + } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java index 53a4caed..5a2dacba 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java @@ -16,7 +16,6 @@ package org.springframework.cloud.netflix.eureka; import javax.annotation.PreDestroy; -import javax.management.MBeanServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +27,6 @@ import org.springframework.boot.context.embedded.EmbeddedServletContainerInitial import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.netflix.ribbon.SpringClientFactory; -import org.springframework.cloud.netflix.servo.ServoMetricReader; import org.springframework.context.ApplicationListener; import org.springframework.context.SmartLifecycle; import org.springframework.context.annotation.Bean; @@ -39,7 +37,6 @@ import org.springframework.context.annotation.ScopedProxyMode; import org.springframework.core.Ordered; import com.netflix.appinfo.ApplicationInfoManager; -import com.netflix.appinfo.EurekaInstanceConfig; import com.netflix.appinfo.InstanceInfo.InstanceStatus; import com.netflix.discovery.DiscoveryManager; import com.netflix.discovery.EurekaClientConfig; @@ -148,15 +145,6 @@ public class EurekaClientConfiguration implements SmartLifecycle, Ordered { return new SpringClientFactory(); } - @Bean - @ConditionalOnMissingBean - @ConditionalOnExpression("${spring.jmx.enabled:true}") - public EurekaHealthIndicator eurekaHealthIndicator(MBeanServer server, - EurekaInstanceConfig config) { - return new EurekaHealthIndicator(eurekaDiscoveryClient(), - new ServoMetricReader(server), config); - } - @Bean protected ApplicationListener containerPortInitializer() { return new ApplicationListener() { diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/HystrixConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/HystrixConfiguration.java index 355c34e8..92103103 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/HystrixConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/hystrix/HystrixConfiguration.java @@ -17,7 +17,6 @@ package org.springframework.cloud.netflix.hystrix; import java.io.IOException; import java.util.Arrays; -import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -38,7 +37,6 @@ import org.springframework.core.Ordered; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.type.AnnotationMetadata; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import com.fasterxml.jackson.databind.ObjectMapper; import com.netflix.hystrix.Hystrix; diff --git a/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories b/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories index f57ea6c3..c8290a0e 100644 --- a/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-netflix-core/src/main/resources/META-INF/spring.factories @@ -4,4 +4,7 @@ org.springframework.cloud.netflix.feign.FeignAutoConfiguration,\ org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration,\ org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration,\ org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration,\ -org.springframework.cloud.netflix.servo.ServoMetricsAutoConfiguration \ No newline at end of file +org.springframework.cloud.netflix.servo.ServoMetricsAutoConfiguration + +org.springframework.cloud.bootstrap.BootstrapConfiguration=\ +org.springframework.cloud.netflix.config.DiscoveryClientConfigServiceBootstrapConfiguration \ No newline at end of file