From dd16ce0a31cd04efd8e5c286f44eff18994f3d2f Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Mon, 25 Sep 2017 12:21:02 -0400 Subject: [PATCH] Remove the need for @EnableDiscoveryClient (#245) Enable AutoServiceRegistrationConfiguration by default. --- .../main/asciidoc/spring-cloud-commons.adoc | 3 ++ .../EnableDiscoveryClientImportSelector.java | 15 ++++++ ...oServiceRegistrationAutoConfiguration.java | 6 ++- .../AutoServiceRegistrationConfiguration.java | 2 + .../main/resources/META-INF/spring.factories | 3 +- .../AutoRegisterPropertyFalseTests.java | 49 ++++++++++++++++++ ...DiscoveryClientAutoRegisterFalseTests.java | 51 +++++++++++++++++++ ...bleDiscoveryClientImportSelectorTests.java | 4 ++ 8 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/AutoRegisterPropertyFalseTests.java create mode 100644 spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientAutoRegisterFalseTests.java diff --git a/docs/src/main/asciidoc/spring-cloud-commons.adoc b/docs/src/main/asciidoc/spring-cloud-commons.adoc index 0dc29a29..27bd28e6 100644 --- a/docs/src/main/asciidoc/spring-cloud-commons.adoc +++ b/docs/src/main/asciidoc/spring-cloud-commons.adoc @@ -317,6 +317,9 @@ Commons provides the `@EnableDiscoveryClient` annotation. This looks for impleme By default, implementations of `DiscoveryClient` will auto-register the local Spring Boot server with the remote discovery server. This can be disabled by setting `autoRegister=false` in `@EnableDiscoveryClient`. +NOTE: The use of `@EnableDiscoveryClient` is no longer required. It is enough to just have a `DiscoveryClient` implementation +on the classpath to cause the Spring Boot application to register with the service discovery server. + ==== Health Indicator Commons creates a Spring Boot `HealthIndicator` that `DiscoveryClient` implementations can participate in by implementing `DiscoveryHealthIndicator`. To disable the composite `HealthIndicator` set `spring.cloud.discovery.client.composite-indicator.enabled=false`. A generic `HealthIndicator` based on `DiscoveryClient` is auto-configured (`DiscoveryClientHealthIndicator). To disable it, set `spring.cloud.discovery.client.health-indicator.enabled=false`. To disable the description field of the `DiscoveryClientHealthIndicator` set `spring.cloud.discovery.client.health-indicator.include-description=false`, otherwise it can bubble up as the `description` of the rolled up `HealthIndicator`. diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelector.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelector.java index 2d4bf09b..58fbb3ed 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelector.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelector.java @@ -21,10 +21,14 @@ import org.springframework.cloud.commons.util.SpringFactoryImportSelector; import org.springframework.core.Ordered; import org.springframework.core.annotation.AnnotationAttributes; import org.springframework.core.annotation.Order; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; +import org.springframework.core.env.MapPropertySource; import org.springframework.core.type.AnnotationMetadata; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; /** @@ -47,6 +51,17 @@ public class EnableDiscoveryClientImportSelector List importsList = new ArrayList<>(Arrays.asList(imports)); importsList.add("org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration"); imports = importsList.toArray(new String[0]); + } else { + Environment env = getEnvironment(); + if(ConfigurableEnvironment.class.isInstance(env)) { + ConfigurableEnvironment configEnv = (ConfigurableEnvironment)env; + LinkedHashMap map = new LinkedHashMap<>(); + map.put("spring.cloud.service-registry.auto-registration.enabled", false); + MapPropertySource propertySource = new MapPropertySource( + "springCloudDiscoveryClient", map); + configEnv.getPropertySources().addLast(propertySource); + } + } return imports; diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationAutoConfiguration.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationAutoConfiguration.java index 8b4b7d05..542825b5 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationAutoConfiguration.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationAutoConfiguration.java @@ -4,13 +4,17 @@ import javax.annotation.PostConstruct; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; /** * @author Spencer Gibb */ @Configuration -@ConditionalOnBean(AutoServiceRegistrationProperties.class) +@Import(AutoServiceRegistrationConfiguration.class) +@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true) public class AutoServiceRegistrationAutoConfiguration { @Autowired(required = false) diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationConfiguration.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationConfiguration.java index 5cc7d689..c772069b 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationConfiguration.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/serviceregistry/AutoServiceRegistrationConfiguration.java @@ -1,5 +1,6 @@ package org.springframework.cloud.client.serviceregistry; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; @@ -8,5 +9,6 @@ import org.springframework.context.annotation.Configuration; */ @Configuration @EnableConfigurationProperties(AutoServiceRegistrationProperties.class) +@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true) public class AutoServiceRegistrationConfiguration { } diff --git a/spring-cloud-commons/src/main/resources/META-INF/spring.factories b/spring-cloud-commons/src/main/resources/META-INF/spring.factories index 01dc663a..71538019 100644 --- a/spring-cloud-commons/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-commons/src/main/resources/META-INF/spring.factories @@ -9,7 +9,8 @@ org.springframework.cloud.client.serviceregistry.ServiceRegistryAutoConfiguratio org.springframework.cloud.commons.util.UtilAutoConfiguration,\ org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClientAutoConfiguration,\ org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration,\ -org.springframework.cloud.commons.httpclient.HttpClientConfiguration +org.springframework.cloud.commons.httpclient.HttpClientConfiguration,\ +org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration # Environment Post Processors diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/AutoRegisterPropertyFalseTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/AutoRegisterPropertyFalseTests.java new file mode 100644 index 00000000..35c57634 --- /dev/null +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/AutoRegisterPropertyFalseTests.java @@ -0,0 +1,49 @@ +package org.springframework.cloud.client.discovery; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistration; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; + +/** + * @author Ryan Baxter + */ +@RunWith(SpringRunner.class) +@SpringBootTest(properties = {"spring.cloud.service-registry.auto-registration.enabled: false"}) +public class AutoRegisterPropertyFalseTests { + @Autowired(required = false) + AutoServiceRegistrationAutoConfiguration autoConfiguration; + + @Autowired(required = false) + AutoServiceRegistration autoServiceRegistration; + + @Autowired(required = false) + AutoServiceRegistrationProperties autoServiceRegistrationProperties; + + @Value("${spring.cloud.service-registry.auto-registration.enabled}") + Boolean autoRegisterProperty; + + @Test + public void veryifyBeans() { + assertNull(autoConfiguration); + assertNull(autoServiceRegistration); + assertNull(autoServiceRegistrationProperties); + assertFalse(autoRegisterProperty); + } + + + @EnableAutoConfiguration + @Configuration + public static class App { + } +} diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientAutoRegisterFalseTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientAutoRegisterFalseTests.java new file mode 100644 index 00000000..906be22c --- /dev/null +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientAutoRegisterFalseTests.java @@ -0,0 +1,51 @@ +package org.springframework.cloud.client.discovery; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistration; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; + +/** + * @author Ryan Baxter + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class EnableDiscoveryClientAutoRegisterFalseTests { + + @Autowired(required = false) + AutoServiceRegistrationAutoConfiguration autoConfiguration; + + @Autowired(required = false) + AutoServiceRegistration autoServiceRegistration; + + @Autowired(required = false) + AutoServiceRegistrationProperties autoServiceRegistrationProperties; + + @Value("${spring.cloud.service-registry.auto-registration.enabled}") + Boolean autoRegisterProperty; + + @Test + public void veryifyBeans() { + assertNull(autoConfiguration); + assertNull(autoServiceRegistration); + assertNull(autoServiceRegistrationProperties); + assertFalse(autoRegisterProperty); + } + + + @EnableAutoConfiguration + @Configuration + @EnableDiscoveryClient(autoRegister = false) + public static class App { + } +} diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelectorTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelectorTests.java index de7d7288..6c2e360c 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelectorTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/EnableDiscoveryClientImportSelectorTests.java @@ -9,6 +9,8 @@ import org.springframework.core.type.AnnotationMetadata; import org.springframework.mock.env.MockEnvironment; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.BDDMockito.given; /** @@ -37,6 +39,7 @@ public class EnableDiscoveryClientImportSelectorTests { public void autoRegistrationIsEnabled() { configureAnnotation(true); String[] imports = this.importSelector.selectImports(this.annotationMetadata); + assertTrue(environment.getProperty("spring.cloud.service-registry.auto-registration.enabled", Boolean.class, true)); assertThat(imports).hasSize(1); } @@ -44,6 +47,7 @@ public class EnableDiscoveryClientImportSelectorTests { public void autoRegistrationIsDisabled() { configureAnnotation(false); String[] imports = this.importSelector.selectImports(this.annotationMetadata); + assertFalse(environment.getProperty("spring.cloud.service-registry.auto-registration.enabled", Boolean.class)); assertThat(imports).isEmpty(); }