Adds anagement registration customizer (#479)

Management registration customizer

fixes gh-478
This commit is contained in:
Alexey Savchuk
2019-02-06 23:36:00 +03:00
committed by Spencer Gibb
parent a706683bd3
commit ddd9961120
4 changed files with 160 additions and 5 deletions

View File

@@ -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<ConsulManagementRegistrationCustomizer> 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<ConsulManagementRegistrationCustomizer> 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<ConsulRegistrationCustomizer> registrationCustomizers,
List<ConsulManagementRegistrationCustomizer> 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<ConsulManagementRegistrationCustomizer> 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<ConsulManagementRegistrationCustomizer> registrationCustomizers, ConsulAutoRegistration registration) {
if (registrationCustomizers != null) {
for (ConsulManagementRegistrationCustomizer customizer : registrationCustomizers) {
customizer.customize(registration);
}
}
}
public static String getInstanceId(ConsulDiscoveryProperties properties, ApplicationContext context) {

View File

@@ -70,9 +70,13 @@ public class ConsulAutoServiceRegistrationAutoConfiguration {
@ConditionalOnMissingBean
public ConsulAutoRegistration consulRegistration(AutoServiceRegistrationProperties autoServiceRegistrationProperties,
ConsulDiscoveryProperties properties, ApplicationContext applicationContext,
ObjectProvider<List<ConsulRegistrationCustomizer>> registrationCustomizers, HeartbeatProperties heartbeatProperties) {
ObjectProvider<List<ConsulRegistrationCustomizer>> registrationCustomizers,
ObjectProvider<List<ConsulManagementRegistrationCustomizer>> managementRegistrationCustomizers,
HeartbeatProperties heartbeatProperties) {
return ConsulAutoRegistration.registration(autoServiceRegistrationProperties, properties,
applicationContext, registrationCustomizers.getIfAvailable(), heartbeatProperties);
applicationContext, registrationCustomizers.getIfAvailable(),
managementRegistrationCustomizers.getIfAvailable(),
heartbeatProperties);
}
@Configuration

View File

@@ -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);
}

View File

@@ -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<NewService.Check> checks = managementRegistration.getService().getChecks();
List<String> 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<NewService.Check> 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 {
}
}