From ddd9961120fd7043cbb391384c9e9380a0ae2db0 Mon Sep 17 00:00:00 2001 From: Alexey Savchuk Date: Wed, 6 Feb 2019 23:36:00 +0300 Subject: [PATCH] Adds anagement registration customizer (#479) Management registration customizer fixes gh-478 --- .../ConsulAutoRegistration.java | 28 ++++- ...oServiceRegistrationAutoConfiguration.java | 8 +- ...onsulManagementRegistrationCustomizer.java | 24 ++++ ...RegistrationManagementCustomizerTests.java | 105 ++++++++++++++++++ 4 files changed, 160 insertions(+), 5 deletions(-) create mode 100644 spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulManagementRegistrationCustomizer.java create mode 100644 spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationManagementCustomizerTests.java diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoRegistration.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoRegistration.java index 705832cd..4d5bcb95 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoRegistration.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoRegistration.java @@ -16,6 +16,7 @@ package org.springframework.cloud.consul.serviceregistry; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -42,13 +43,22 @@ public class ConsulAutoRegistration extends ConsulRegistration { private final AutoServiceRegistrationProperties autoServiceRegistrationProperties; private final ApplicationContext context; private final HeartbeatProperties heartbeatProperties; + private final List managementRegistrationCustomizers; + @Deprecated public ConsulAutoRegistration(NewService service, AutoServiceRegistrationProperties autoServiceRegistrationProperties, ConsulDiscoveryProperties properties, ApplicationContext context, HeartbeatProperties heartbeatProperties) { + this(service, autoServiceRegistrationProperties, properties, context, heartbeatProperties, Collections.emptyList()); + } + + public ConsulAutoRegistration(NewService service, AutoServiceRegistrationProperties autoServiceRegistrationProperties, + ConsulDiscoveryProperties properties, ApplicationContext context, HeartbeatProperties heartbeatProperties, + List managementRegistrationCustomizers) { super(service, properties); this.autoServiceRegistrationProperties = autoServiceRegistrationProperties; this.context = context; this.heartbeatProperties = heartbeatProperties; + this.managementRegistrationCustomizers = managementRegistrationCustomizers; } public void initializePort(int knownPort) { @@ -65,12 +75,13 @@ public class ConsulAutoRegistration extends ConsulRegistration { public ConsulAutoRegistration managementRegistration() { return managementRegistration(this.autoServiceRegistrationProperties, getProperties(), - this.context, this.heartbeatProperties); + this.context, this.managementRegistrationCustomizers, this.heartbeatProperties); } public static ConsulAutoRegistration registration(AutoServiceRegistrationProperties autoServiceRegistrationProperties, ConsulDiscoveryProperties properties, ApplicationContext context, List registrationCustomizers, + List managementRegistrationCustomizers, HeartbeatProperties heartbeatProperties) { NewService service = new NewService(); @@ -89,7 +100,7 @@ public class ConsulAutoRegistration extends ConsulRegistration { } ConsulAutoRegistration registration = new ConsulAutoRegistration(service, autoServiceRegistrationProperties, - properties, context, heartbeatProperties); + properties, context, heartbeatProperties, managementRegistrationCustomizers); customize(registrationCustomizers, registration); return registration; } @@ -121,6 +132,7 @@ public class ConsulAutoRegistration extends ConsulRegistration { public static ConsulAutoRegistration managementRegistration( AutoServiceRegistrationProperties autoServiceRegistrationProperties, ConsulDiscoveryProperties properties, ApplicationContext context, + List managementRegistrationCustomizers, HeartbeatProperties heartbeatProperties) { NewService management = new NewService(); management.setId(getManagementServiceId(properties, context)); @@ -131,7 +143,17 @@ public class ConsulAutoRegistration extends ConsulRegistration { if (properties.isRegisterHealthCheck()) { management.setCheck(createCheck(getManagementPort(properties, context), heartbeatProperties, properties)); } - return new ConsulAutoRegistration(management, autoServiceRegistrationProperties, properties, context, heartbeatProperties); + ConsulAutoRegistration registration = new ConsulAutoRegistration(management, autoServiceRegistrationProperties, properties, context, heartbeatProperties, managementRegistrationCustomizers); + managementCustomize(managementRegistrationCustomizers, registration); + return registration; + } + + public static void managementCustomize(List registrationCustomizers, ConsulAutoRegistration registration) { + if (registrationCustomizers != null) { + for (ConsulManagementRegistrationCustomizer customizer : registrationCustomizers) { + customizer.customize(registration); + } + } } public static String getInstanceId(ConsulDiscoveryProperties properties, ApplicationContext context) { diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationAutoConfiguration.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationAutoConfiguration.java index 87b8ac5c..56bac0d9 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationAutoConfiguration.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationAutoConfiguration.java @@ -70,9 +70,13 @@ public class ConsulAutoServiceRegistrationAutoConfiguration { @ConditionalOnMissingBean public ConsulAutoRegistration consulRegistration(AutoServiceRegistrationProperties autoServiceRegistrationProperties, ConsulDiscoveryProperties properties, ApplicationContext applicationContext, - ObjectProvider> registrationCustomizers, HeartbeatProperties heartbeatProperties) { + ObjectProvider> registrationCustomizers, + ObjectProvider> managementRegistrationCustomizers, + HeartbeatProperties heartbeatProperties) { return ConsulAutoRegistration.registration(autoServiceRegistrationProperties, properties, - applicationContext, registrationCustomizers.getIfAvailable(), heartbeatProperties); + applicationContext, registrationCustomizers.getIfAvailable(), + managementRegistrationCustomizers.getIfAvailable(), + heartbeatProperties); } @Configuration diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulManagementRegistrationCustomizer.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulManagementRegistrationCustomizer.java new file mode 100644 index 00000000..28ad9b57 --- /dev/null +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulManagementRegistrationCustomizer.java @@ -0,0 +1,24 @@ +/* + * Copyright 2013-2016 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.serviceregistry; + +/** + * @author Alexey Savchuk (devpreview) + */ +public interface ConsulManagementRegistrationCustomizer { + void customize(ConsulRegistration managementRegistration); +} diff --git a/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationManagementCustomizerTests.java b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationManagementCustomizerTests.java new file mode 100644 index 00000000..ec60e25e --- /dev/null +++ b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationManagementCustomizerTests.java @@ -0,0 +1,105 @@ +/* + * Copyright 2013-2016 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.serviceregistry; + +import com.ecwid.consul.v1.agent.model.NewService; +import org.junit.Assert; +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.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration; +import org.springframework.cloud.consul.ConsulAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +/** + * @author Alexey Savchuk (devpreview) + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = { + ConsulAutoServiceRegistrationManagementCustomizerTests.TestConfig.class, + ConsulAutoServiceRegistrationManagementCustomizerTests.ManagementConfig.class +}, properties = { + "spring.application.name=myTestService-SS", + "spring.cloud.consul.discovery.registerHealthCheck=false", + "management.server.port=4453" +}, webEnvironment = RANDOM_PORT) +public class ConsulAutoServiceRegistrationManagementCustomizerTests { + + @Autowired + private ConsulRegistration registration; + + @Autowired + private ConsulAutoRegistration autoRegistration; + + @Test + public void contextLoads() { + ConsulAutoRegistration managementRegistration = autoRegistration.managementRegistration(); + List checks = managementRegistration.getService().getChecks(); + List ttls = checks.stream().map(NewService.Check::getTtl).collect(Collectors.toList()); + Assert.assertTrue("Management registration not customized with 'foo' customizer", ttls.contains("39s")); + Assert.assertTrue("Management registration not customized with 'bar' customizer", ttls.contains("36s")); + } + + @Configuration + public static class ManagementConfig { + + @Bean + public ConsulManagementRegistrationCustomizer fooManagementCustomizer() { + return managementRegistration -> { + addCheck(managementRegistration, "39s"); + }; + } + + @Bean + public ConsulManagementRegistrationCustomizer barManagementCustomizer() { + return managementRegistration -> { + addCheck(managementRegistration, "36s"); + }; + } + + private void addCheck(ConsulRegistration managementRegistration, String ttl) { + NewService managementService = managementRegistration.getService(); + NewService.Check check = new NewService.Check(); + check.setTtl(ttl); + List checks = managementService.getChecks() != null ? new ArrayList<>(managementService.getChecks()) : new ArrayList<>(); + checks.add(check); + managementRegistration.getService().setChecks(checks); + } + + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ + AutoServiceRegistrationConfiguration.class, + ConsulAutoConfiguration.class, + ConsulAutoServiceRegistrationAutoConfiguration.class + }) + public static class TestConfig { + } +}