From e48dff74e55b5ef15b2d91d510d2404bf90aa47f Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 19 Dec 2014 14:36:17 -0700 Subject: [PATCH] only create Discovery*HealthIndicator beans if DiscoveryClient is a bean and spring.cloud.discovery.enable = true. Allow discovery and circuit breaker to be turned off by properties. fixes gh-2 --- .../CommonsClientAutoConfiguration.java | 24 ++++++++++++------- .../SingleImplementationImportSelector.java | 15 +++++++++++- .../EnableCircuitBreakerImportSelector.java | 5 ++++ .../DiscoveryClientHealthIndicator.java | 14 +++++------ .../EnableDiscoveryClientImportSelector.java | 5 ++++ ...ngleImplementationImportSelectorTests.java | 7 +++++- 6 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/springframework/cloud/client/CommonsClientAutoConfiguration.java b/src/main/java/org/springframework/cloud/client/CommonsClientAutoConfiguration.java index 0229782a..a061c6d9 100644 --- a/src/main/java/org/springframework/cloud/client/CommonsClientAutoConfiguration.java +++ b/src/main/java/org/springframework/cloud/client/CommonsClientAutoConfiguration.java @@ -2,7 +2,10 @@ package org.springframework.cloud.client; import org.springframework.boot.actuate.health.HealthAggregator; import org.springframework.boot.actuate.health.HealthIndicator; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.DiscoveryClientHealthIndicator; import org.springframework.cloud.client.discovery.DiscoveryCompositeHealthIndicator; import org.springframework.cloud.client.discovery.DiscoveryHealthIndicator; @@ -20,13 +23,18 @@ import java.util.List; @Order(0) public class CommonsClientAutoConfiguration { - @Bean - public DiscoveryClientHealthIndicator instancesHealthIndicator() { - return new DiscoveryClientHealthIndicator(); - } + @Configuration + @ConditionalOnBean(DiscoveryClient.class) + @ConditionalOnExpression("${spring.cloud.discovery.enabled:true}") + protected static class HealthConfiguration { + @Bean + public DiscoveryClientHealthIndicator instancesHealthIndicator(DiscoveryClient discoveryClient) { + return new DiscoveryClientHealthIndicator(discoveryClient); + } - @Bean - public DiscoveryCompositeHealthIndicator discoveryHealthIndicator(HealthAggregator aggregator, List indicators) { - return new DiscoveryCompositeHealthIndicator(aggregator, indicators); - } + @Bean + public DiscoveryCompositeHealthIndicator discoveryHealthIndicator(HealthAggregator aggregator, List indicators) { + return new DiscoveryCompositeHealthIndicator(aggregator, indicators); + } + } } diff --git a/src/main/java/org/springframework/cloud/client/SingleImplementationImportSelector.java b/src/main/java/org/springframework/cloud/client/SingleImplementationImportSelector.java index f3207391..8afc6901 100644 --- a/src/main/java/org/springframework/cloud/client/SingleImplementationImportSelector.java +++ b/src/main/java/org/springframework/cloud/client/SingleImplementationImportSelector.java @@ -2,9 +2,11 @@ package org.springframework.cloud.client; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.BeanClassLoaderAware; +import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.DeferredImportSelector; import org.springframework.core.GenericTypeResolver; import org.springframework.core.annotation.AnnotationAttributes; +import org.springframework.core.env.Environment; import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.core.type.AnnotationMetadata; import org.springframework.util.Assert; @@ -19,11 +21,12 @@ import java.util.List; * @author Spencer Gibb */ @Slf4j -public abstract class SingleImplementationImportSelector implements DeferredImportSelector, BeanClassLoaderAware { +public abstract class SingleImplementationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, EnvironmentAware { protected ClassLoader beanClassLoader; protected Class annotationClass; + protected Environment environment; @SuppressWarnings("unchecked") protected SingleImplementationImportSelector() { @@ -32,6 +35,9 @@ public abstract class SingleImplementationImportSelector implements DeferredI @Override public String[] selectImports(AnnotationMetadata metadata) { + if (!isEnabled()) { + return new String[0]; + } AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata .getAnnotationAttributes(annotationClass.getName(), true)); @@ -55,10 +61,17 @@ public abstract class SingleImplementationImportSelector implements DeferredI } + protected abstract boolean isEnabled(); + protected String getSimpleName() { return annotationClass.getSimpleName(); } + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + @Override public void setBeanClassLoader(ClassLoader classLoader) { this.beanClassLoader = classLoader; diff --git a/src/main/java/org/springframework/cloud/client/circuitbreaker/EnableCircuitBreakerImportSelector.java b/src/main/java/org/springframework/cloud/client/circuitbreaker/EnableCircuitBreakerImportSelector.java index 49c9f572..c7363188 100644 --- a/src/main/java/org/springframework/cloud/client/circuitbreaker/EnableCircuitBreakerImportSelector.java +++ b/src/main/java/org/springframework/cloud/client/circuitbreaker/EnableCircuitBreakerImportSelector.java @@ -1,5 +1,6 @@ package org.springframework.cloud.client.circuitbreaker; +import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.cloud.client.SingleImplementationImportSelector; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; @@ -10,4 +11,8 @@ import org.springframework.core.annotation.Order; @Order(Ordered.LOWEST_PRECEDENCE - 100) public class EnableCircuitBreakerImportSelector extends SingleImplementationImportSelector { + @Override + protected boolean isEnabled() { + return new RelaxedPropertyResolver(environment).getProperty("spring.cloud.circuit.breaker.enabled", Boolean.class, Boolean.TRUE); + } } diff --git a/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClientHealthIndicator.java b/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClientHealthIndicator.java index 2ac96b14..a80dc3a1 100644 --- a/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClientHealthIndicator.java +++ b/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClientHealthIndicator.java @@ -20,18 +20,18 @@ public class DiscoveryClientHealthIndicator implements ApplicationContextAware, private ApplicationContext context; private int order = Ordered.HIGHEST_PRECEDENCE; + private DiscoveryClient discoveryClient; + + public DiscoveryClientHealthIndicator(DiscoveryClient discoveryClient) { + this.discoveryClient = discoveryClient; + } @Override public Health health() { Health.Builder builder = new Health.Builder(); try { - DiscoveryClient client = context.getBean(DiscoveryClient.class); - if (client == null) { - builder.unknown().withDetail("warning", "No DiscoveryClient found"); - return builder.build(); - } - List services = client.getServices(); - builder.status(new Status("UP", client.description())) + List services = discoveryClient.getServices(); + builder.status(new Status("UP", discoveryClient.description())) .withDetail("services", services); } catch (Exception e) { log.error("Error", e); diff --git a/src/main/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelector.java b/src/main/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelector.java index 6f272720..fa487317 100644 --- a/src/main/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelector.java +++ b/src/main/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelector.java @@ -1,5 +1,6 @@ package org.springframework.cloud.client.discovery; +import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.cloud.client.SingleImplementationImportSelector; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; @@ -10,4 +11,8 @@ import org.springframework.core.annotation.Order; @Order(Ordered.LOWEST_PRECEDENCE - 100) public class EnableDiscoveryClientImportSelector extends SingleImplementationImportSelector { + @Override + protected boolean isEnabled() { + return new RelaxedPropertyResolver(environment).getProperty("spring.cloud.discovery.enabled", Boolean.class, Boolean.TRUE); + } } diff --git a/src/test/java/org/springframework/cloud/client/SingleImplementationImportSelectorTests.java b/src/test/java/org/springframework/cloud/client/SingleImplementationImportSelectorTests.java index 3d8b226c..f22efdd7 100644 --- a/src/test/java/org/springframework/cloud/client/SingleImplementationImportSelectorTests.java +++ b/src/test/java/org/springframework/cloud/client/SingleImplementationImportSelectorTests.java @@ -16,5 +16,10 @@ public class SingleImplementationImportSelectorTests { } public static @interface MyAnnotation {} - public static class MyAnnotationImportSelector extends SingleImplementationImportSelector { } + public static class MyAnnotationImportSelector extends SingleImplementationImportSelector { + @Override + protected boolean isEnabled() { + return true; + } + } }