diff --git a/pom.xml b/pom.xml index 0b89a189..49eb6b7b 100644 --- a/pom.xml +++ b/pom.xml @@ -202,6 +202,12 @@ ribbon-core ${ribbon.version} + + + com.google.guava + guava + 18.0 + com.netflix.ribbon ribbon-loadbalancer 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 91393cf1..f0352e3d 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 @@ -17,6 +17,8 @@ package org.springframework.cloud.consul.discovery; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,6 +28,7 @@ import com.ecwid.consul.v1.ConsulClient; * @author Spencer Gibb */ @Configuration +@EnableConfigurationProperties public class ConsulDiscoveryClientConfiguration { @Autowired @@ -37,6 +40,7 @@ public class ConsulDiscoveryClientConfiguration { } @Bean + @ConditionalOnProperty("consul.heartbeat.enabled") public TtlScheduler ttlScheduler() { return new TtlScheduler(heartbeatProperties(), consulClient); } @@ -46,6 +50,11 @@ public class ConsulDiscoveryClientConfiguration { return new HeartbeatProperties(); } + @Bean + public ConsulDiscoveryProperties consulDiscoveryProperties() { + return new ConsulDiscoveryProperties(); + } + @Bean public ConsulDiscoveryClient consulDiscoveryClient() { return new ConsulDiscoveryClient(); diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryProperties.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryProperties.java new file mode 100644 index 00000000..55b96a9c --- /dev/null +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryProperties.java @@ -0,0 +1,70 @@ +/* + * 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.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import lombok.AccessLevel; +import lombok.Data; + +import lombok.Getter; +import lombok.Setter; +import lombok.extern.apachecommons.CommonsLog; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * @author Spencer Gibb + */ +@ConfigurationProperties("consul.discovery") +@Data +@CommonsLog +public class ConsulDiscoveryProperties { + + @Getter(AccessLevel.PRIVATE) + @Setter(AccessLevel.PRIVATE) + private String[] hostInfo = initHostInfo(); + + private List tags = new ArrayList<>(); + + private boolean enabled = true; + + private List managementTags = Arrays.asList("management"); + + private String healthCheckPath = "/health"; + + private String healthCheckUrl; + + private String healthCheckInterval = "10s"; + + private String hostname = hostInfo[1]; + + private String[] initHostInfo() { + String[] info = new String[2]; + try { + info[0] = InetAddress.getLocalHost().getHostAddress(); + info[1] = InetAddress.getLocalHost().getHostName(); + } + catch (UnknownHostException ex) { + log.error("Cannot get host info", ex); + } + return info; + } +} diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulLifecycle.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulLifecycle.java index 7b5a6a00..fd179378 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulLifecycle.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulLifecycle.java @@ -20,7 +20,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.discovery.AbstractDiscoveryLifecycle; -import org.springframework.cloud.consul.ConsulProperties; import com.ecwid.consul.v1.ConsulClient; import com.ecwid.consul.v1.agent.model.NewService; @@ -35,9 +34,9 @@ public class ConsulLifecycle extends AbstractDiscoveryLifecycle { private ConsulClient client; @Autowired - private ConsulProperties consulProperties; + private ConsulDiscoveryProperties properties; - @Autowired + @Autowired(required = false) private TtlScheduler ttlScheduler; @Autowired @@ -53,9 +52,19 @@ public class ConsulLifecycle extends AbstractDiscoveryLifecycle { // TODO: support port = 0 random assignment Integer port = new Integer(getEnvironment().getProperty("server.port", "8080")); service.setPort(port); - service.setTags(consulProperties.getTags()); + service.setTags(properties.getTags()); NewService.Check check = new NewService.Check(); - check.setTtl(ttlConfig.getTtl()); + if (ttlConfig.isEnabled()) { + check.setTtl(ttlConfig.getTtl()); + } + if (properties.getHealthCheckUrl() != null) { + check.setHttp(properties.getHealthCheckUrl()); + } else { + check.setHttp(String.format("http://%s:%s%s", properties.getHostname(), + port, properties.getHealthCheckPath())); + } + check.setInterval(properties.getHealthCheckInterval()); + //TODO support http check timeout service.setCheck(check); register(service); } @@ -66,7 +75,7 @@ public class ConsulLifecycle extends AbstractDiscoveryLifecycle { management.setId(getManagementServiceId()); management.setName(getManagementServiceName()); management.setPort(getManagementPort()); - management.setTags(consulProperties.getManagementTags()); + management.setTags(properties.getManagementTags()); register(management); } @@ -74,12 +83,14 @@ public class ConsulLifecycle extends AbstractDiscoveryLifecycle { protected void register(NewService service) { log.info("Registering service with consul: {}", service.toString()); client.agentServiceRegister(service); - ttlScheduler.add(service); + if (ttlConfig.isEnabled() && ttlScheduler != null) { + ttlScheduler.add(service); + } } @Override protected Object getConfiguration() { - return consulProperties; + return properties; } @Override @@ -99,6 +110,6 @@ public class ConsulLifecycle extends AbstractDiscoveryLifecycle { @Override protected boolean isEnabled() { - return consulProperties.isEnabled(); + return properties.isEnabled(); } } diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/HeartbeatProperties.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/HeartbeatProperties.java index 08be4f85..62ff32e1 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/HeartbeatProperties.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/HeartbeatProperties.java @@ -32,6 +32,11 @@ import org.springframework.boot.context.properties.ConfigurationProperties; @Data @CommonsLog public class HeartbeatProperties { + + // TODO: change enabled to default to true when I stop seeing messages like + // [WARN] agent: Check 'service:testConsulApp:xtest:8080' missed TTL, is now critical + boolean enabled = false; + @Min(1) private int ttlValue = 30;