From 9ae48f063457cebc6215812fb7760d4ddde0e0b9 Mon Sep 17 00:00:00 2001 From: Marcin Biegan Date: Thu, 10 Dec 2015 23:07:51 +0100 Subject: [PATCH] Allow customizable discovery configuration Added @ConditionalOnMissingBean to ConsulDiscoveryClientConfiguration to make it possible to provide custom implementations. Some general polish fixes gh-119 --- .../ConsulConfigBootstrapConfiguration.java | 6 +- .../cloud/consul/ConsulAutoConfiguration.java | 9 +- .../ConsulDiscoveryClientConfiguration.java | 24 +++-- .../ConsulLifecycleCustomizedTests.java | 90 +++++++++++++++++++ 4 files changed, 115 insertions(+), 14 deletions(-) create mode 100644 spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/discovery/ConsulLifecycleCustomizedTests.java diff --git a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigBootstrapConfiguration.java b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigBootstrapConfiguration.java index c9075277..6a10242b 100644 --- a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigBootstrapConfiguration.java +++ b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigBootstrapConfiguration.java @@ -17,6 +17,7 @@ package org.springframework.cloud.consul.config; import com.ecwid.consul.v1.ConsulClient; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -47,8 +48,9 @@ public class ConsulConfigBootstrapConfiguration { } @Bean - public ConsulPropertySourceLocator consulPropertySourceLocator() { - return new ConsulPropertySourceLocator(consul, consulConfigProperties()); + public ConsulPropertySourceLocator consulPropertySourceLocator( + ConsulConfigProperties consulConfigProperties) { + return new ConsulPropertySourceLocator(consul, consulConfigProperties); } } } diff --git a/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulAutoConfiguration.java b/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulAutoConfiguration.java index a66fd327..c6b5e414 100644 --- a/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulAutoConfiguration.java +++ b/spring-cloud-consul-core/src/main/java/org/springframework/cloud/consul/ConsulAutoConfiguration.java @@ -16,6 +16,8 @@ package org.springframework.cloud.consul; +import com.ecwid.consul.v1.ConsulClient; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -25,8 +27,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.ecwid.consul.v1.ConsulClient; - /** * @author Spencer Gibb */ @@ -43,9 +43,8 @@ public class ConsulAutoConfiguration { @Bean @ConditionalOnMissingBean - public ConsulClient consulClient() { - return new ConsulClient(consulProperties().getHost(), consulProperties() - .getPort()); + public ConsulClient consulClient(ConsulProperties consulProperties) { + return new ConsulClient(consulProperties.getHost(), consulProperties.getPort()); } @Configuration diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClientConfiguration.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClientConfiguration.java index 13921305..ba582f11 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClientConfiguration.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClientConfiguration.java @@ -19,6 +19,7 @@ package org.springframework.cloud.consul.discovery; import com.ecwid.consul.v1.ConsulClient; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -40,14 +41,17 @@ public class ConsulDiscoveryClientConfiguration { private ConsulClient consulClient; @Bean - public ConsulLifecycle consulLifecycle(ConsulDiscoveryProperties discoveryProperties) { - return new ConsulLifecycle(consulClient, discoveryProperties, heartbeatProperties()); + @ConditionalOnMissingBean + public ConsulLifecycle consulLifecycle(ConsulDiscoveryProperties discoveryProperties, + HeartbeatProperties heartbeatProperties) { + return new ConsulLifecycle(consulClient, discoveryProperties, heartbeatProperties); } @Bean + @ConditionalOnMissingBean @ConditionalOnProperty("spring.cloud.consul.discovery.heartbeat.enabled") - public TtlScheduler ttlScheduler() { - return new TtlScheduler(heartbeatProperties(), consulClient); + public TtlScheduler ttlScheduler(HeartbeatProperties heartbeatProperties) { + return new TtlScheduler(heartbeatProperties, consulClient); } @Bean @@ -61,12 +65,18 @@ public class ConsulDiscoveryClientConfiguration { } @Bean - public ConsulDiscoveryClient consulDiscoveryClient(ServerProperties serverProperties, ConsulDiscoveryProperties discoveryProperties) { - return new ConsulDiscoveryClient(consulClient, consulLifecycle(discoveryProperties), discoveryProperties, serverProperties); + @ConditionalOnMissingBean + public ConsulDiscoveryClient consulDiscoveryClient(ConsulLifecycle consulLifecycle, + ServerProperties serverProperties, + ConsulDiscoveryProperties discoveryProperties) { + return new ConsulDiscoveryClient(consulClient, consulLifecycle, + discoveryProperties, serverProperties); } @Bean - public ConsulCatalogWatch consulCatalogWatch(ConsulDiscoveryProperties discoveryProperties) { + @ConditionalOnMissingBean + public ConsulCatalogWatch consulCatalogWatch( + ConsulDiscoveryProperties discoveryProperties) { return new ConsulCatalogWatch(discoveryProperties, consulClient); } } diff --git a/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/discovery/ConsulLifecycleCustomizedTests.java b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/discovery/ConsulLifecycleCustomizedTests.java new file mode 100644 index 00000000..dd9e69d3 --- /dev/null +++ b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/discovery/ConsulLifecycleCustomizedTests.java @@ -0,0 +1,90 @@ +/* + * 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.consul.discovery; + +import java.util.List; + +import com.ecwid.consul.v1.ConsulClient; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +/** + * @author Marcin Biegan + */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = ConsulLifecycleCustomizedTests.MyTestConfig.class) +@WebIntegrationTest(value = { "spring.application.name=testCustomLifecycle" }, randomPort = true) +public class ConsulLifecycleCustomizedTests { + + @Autowired + private ConsulDiscoveryClient discoveryClient; + @Autowired + private ConsulLifecycle lifecycle1; + @Autowired + private CustomConsulLifecycle lifecycle2; + + @Test + public void getInstancesForServiceWorks() { + List instances = discoveryClient.getInstances("consul"); + assertNotNull("instances was null", instances); + assertFalse("instances was empty", instances.isEmpty()); + } + + @Test + public void usesCustomConsulLifecycle() { + assertEquals("serviceId is not customized", "foo", lifecycle1.getServiceId()); + assertEquals("serviceId is not customized", "foo", lifecycle2.getServiceId()); + } + + @Configuration + @EnableDiscoveryClient + @EnableAutoConfiguration + public static class MyTestConfig { + @Bean + public ConsulLifecycle customizedLifecycle(ConsulClient client, + ConsulDiscoveryProperties properties, HeartbeatProperties ttlConfig) { + return new CustomConsulLifecycle(client, properties, ttlConfig); + } + } + + public static class CustomConsulLifecycle extends ConsulLifecycle { + @Autowired + public CustomConsulLifecycle(ConsulClient client, + ConsulDiscoveryProperties properties, HeartbeatProperties ttlConfig) { + super(client, properties, ttlConfig); + } + + @Override + public String getServiceId() { + return "foo"; + } + } +}