Polishes consul metadata support

This commit is contained in:
Spencer Gibb
2020-04-09 12:35:25 -04:00
parent 4aab57f59d
commit f711bda1f8
4 changed files with 173 additions and 16 deletions

View File

@@ -180,6 +180,32 @@ spring:
The above configuration will result in a map with `foo->bar` and `baz->baz`.
===== Generated Metadata
The Consul Auto Registration will generate a few entries automatically.
.Auto Generated Metadata
|===
| Key | Value
| 'group'
| Property `spring.cloud.consul.discovery.instance-group`. This values is only generated if `instance-group` is not empty.'
| 'secure'
| True if property `spring.cloud.consul.discovery.scheme` equals 'https', otherwise false.
| Property `spring.cloud.consul.discovery.default-zone-metadata-name`, defaults to 'zone'
| Property `spring.cloud.consul.discovery.instance-zone`. This values is only generated if `instance-zone` is not empty.'
|===
===== Official Consul Metadata
Consul added official support for a `meta` field that is a `Map<String, String>`. Spring Cloud Consul has added `spring.cloud.consul.discovery.metadata` and `spring.cloud.consul.discovery.management-metadata` properties to support it.
NOTE: By default, the `ServiceInstance.getMetadata()` method from Spring Cloud Commons will continue to populated by parsing the `spring.cloud.consul.discovery.tags` property for backwards compatibility. To change this behaviour set `spring.cloud.consul.discovery.tags-as-metadata=false` and the metadata will be populated from `spring.cloud.consul.discovery.metadata`. In a future version, parsing the `tags` property will be removed.
==== Making the Consul Instance ID Unique
By default a consul instance is registered with an ID that is equal to its Spring Application Context ID. By default, the Spring Application Context ID is `${spring.application.name}:comma,separated,profiles:${server.port}`. For most cases, this will allow multiple instances of one service to run on one machine. If further uniqueness is required, Using Spring Cloud you can override this by providing a unique identifier in `spring.cloud.consul.discovery.instanceId`. For example:

View File

@@ -554,14 +554,6 @@ public class ConsulDiscoveryProperties {
this.order = order;
}
public Map<String, String> getMetadata() {
return this.metadata;
}
public void setMetadata(Map<String, String> metadata) {
this.metadata = metadata;
}
@Deprecated
public boolean isTagsAsMetadata() {
return this.tagsAsMetadata;
@@ -600,8 +592,9 @@ public class ConsulDiscoveryProperties {
public String toString() {
return new ToStringCreator(this).append("hostInfo", this.hostInfo)
.append("aclToken", this.aclToken).append("tags", this.tags)
.append("enabled", this.enabled)
.append("enableTagOverride", this.enableTagOverride)
.append("metadata", this.metadata).append("enabled", this.enabled)
.append("metadata", this.metadata)
.append("managementTags", this.managementTags)
.append("healthCheckPath", this.healthCheckPath)
.append("healthCheckUrl", this.healthCheckUrl)
@@ -633,8 +626,7 @@ public class ConsulDiscoveryProperties {
.append("registerHealthCheck", this.registerHealthCheck)
.append("failFast", this.failFast)
.append("healthCheckTlsSkipVerify", this.healthCheckTlsSkipVerify)
.append("order", this.order).append("metadata", this.metadata)
.append("tagsAsMetadata", this.tagsAsMetadata)
.append("order", this.order).append("tagsAsMetadata", this.tagsAsMetadata)
.append("enableTagOverride", this.enableTagOverride)
.append("managementEnableTagOverride", this.managementEnableTagOverride)
.append("managementMetadata", this.managementMetadata).toString();

View File

@@ -0,0 +1,129 @@
/*
* Copyright 2013-2019 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
*
* https://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 java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.ecwid.consul.v1.ConsulClient;
import com.ecwid.consul.v1.QueryParams;
import com.ecwid.consul.v1.Response;
import com.ecwid.consul.v1.agent.model.Service;
import com.ecwid.consul.v1.health.HealthChecksForServiceRequest;
import com.ecwid.consul.v1.health.model.Check;
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.cloud.consul.discovery.ConsulDiscoveryProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.junit4.SpringRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT;
/**
* @author Spencer Gibb
* @author Venil Noronha
*/
@RunWith(SpringRunner.class)
@SpringBootTest(
classes = ConsulAutoServiceRegistrationCustomizedPropsRealMetadataTests.TestPropsConfig.class,
properties = { "spring.application.name=myTestServiceRealMetadata-B",
"spring.cloud.consul.discovery.instanceId=myTestServiceRealMetadata1-B",
"spring.cloud.consul.discovery.port=4452",
"spring.cloud.consul.discovery.hostname=myhost",
"spring.cloud.consul.discovery.ipAddress=10.0.0.1",
"spring.cloud.consul.discovery.registerHealthCheck=false",
"spring.cloud.consul.discovery.failFast=false",
"spring.cloud.consul.discovery.default-zone-metadata-name=mydefaultzonemetadataname",
"spring.cloud.consul.discovery.instance-zone=myzone",
"spring.cloud.consul.discovery.instance-group=mygroup",
"spring.cloud.consul.discovery.tags[0]=mytag",
"spring.cloud.consul.discovery.enableTagOverride=true",
"spring.cloud.consul.discovery.tags-as-metadata=false",
"spring.cloud.consul.discovery.metadata.key1=value1",
"spring.cloud.consul.discovery.metadata.key2=value2" },
webEnvironment = RANDOM_PORT)
public class ConsulAutoServiceRegistrationCustomizedPropsRealMetadataTests {
@Autowired
private ConsulClient consul;
@Autowired
private ConsulDiscoveryProperties properties;
@Test
public void propertiesAreCorrect() {
Response<Map<String, Service>> response = this.consul.getAgentServices();
Map<String, Service> services = response.getValue();
Service service = services.get("myTestServiceRealMetadata1-B");
assertThat(service).as("service was null").isNotNull();
assertThat(service.getPort()).as("service port is discovery port")
.isEqualTo(4452);
assertThat("myTestServiceRealMetadata1-B").as("service id was wrong")
.isEqualTo(service.getId());
assertThat("myTestServiceRealMetadata-B").as("service name was wrong")
.isEqualTo(service.getService());
assertThat("myhost").as("property hostname was wrong")
.isEqualTo(this.properties.getHostname());
assertThat("10.0.0.1").as("property ipAddress was wrong")
.isEqualTo(this.properties.getIpAddress());
assertThat("myhost").as("service address was wrong")
.isEqualTo(service.getAddress());
assertThat(service.getEnableTagOverride())
.as("property enableTagOverride was wrong").isTrue();
assertThat(service.getTags()).as("property tags contains the wrong values")
.containsExactly("mytag");
HashMap<String, String> entries = new HashMap<>();
entries.put("key1", "value1");
entries.put("key2", "value2");
entries.put("mydefaultzonemetadataname", "myzone");
entries.put("group", "mygroup");
entries.put("secure", "false");
assertThat(service.getMeta()).as("property metadata contains the wrong entries")
.containsExactlyInAnyOrderEntriesOf(entries);
Response<List<Check>> checkResponse = this.consul.getHealthChecksForService(
"myTestServiceRealMetadata-B", HealthChecksForServiceRequest.newBuilder()
.setQueryParams(QueryParams.DEFAULT).build());
List<Check> checks = checkResponse.getValue();
assertThat(checks).as("checks was wrong size").hasSize(0);
}
@Test
public void testFailFastDisabled() {
assertThat(this.properties.isFailFast()).as("property failFast was wrong")
.isFalse();
}
@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration
@ImportAutoConfiguration({ AutoServiceRegistrationConfiguration.class,
ConsulAutoConfiguration.class,
ConsulAutoServiceRegistrationAutoConfiguration.class })
public static class TestPropsConfig {
}
}

View File

@@ -16,6 +16,7 @@
package org.springframework.cloud.consul.serviceregistry;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -55,10 +56,15 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen
"spring.cloud.consul.discovery.ipAddress=10.0.0.1",
"spring.cloud.consul.discovery.registerHealthCheck=false",
"spring.cloud.consul.discovery.failFast=false",
"spring.cloud.consul.discovery.default-zone-metadata-name=mydefaultzonemetadataname",
"spring.cloud.consul.discovery.instance-zone=myzone",
"spring.cloud.consul.discovery.instance-group=mygroup",
"spring.cloud.consul.discovery.tags[0]=mytag",
"spring.cloud.consul.discovery.enableTagOverride=true",
"spring.cloud.consul.discovery.metadata.key1=value1",
"spring.cloud.consul.discovery.metadata.key2=value2" },
webEnvironment = RANDOM_PORT)
@Deprecated
public class ConsulAutoServiceRegistrationCustomizedPropsTests {
@Autowired
@@ -68,7 +74,7 @@ public class ConsulAutoServiceRegistrationCustomizedPropsTests {
private ConsulDiscoveryProperties properties;
@Test
public void contextLoads() {
public void propertiesAreCorrect() {
Response<Map<String, Service>> response = this.consul.getAgentServices();
Map<String, Service> services = response.getValue();
Service service = services.get("myTestService1-B");
@@ -87,10 +93,14 @@ public class ConsulAutoServiceRegistrationCustomizedPropsTests {
.isEqualTo(service.getAddress());
assertThat(service.getEnableTagOverride())
.as("property enableTagOverride was wrong").isTrue();
assertThat(service.getMeta()).as("property metadata contains the wrong keys")
.containsOnlyKeys("key1", "key2");
assertThat(service.getMeta()).as("property metadata contains the wrong values")
.containsEntry("key1", "value1").containsEntry("key2", "value2");
assertThat(service.getTags()).as("property tags contains the wrong values")
.containsExactly("mytag", "mydefaultzonemetadataname=myzone",
"group=mygroup", "secure=false");
HashMap<String, String> entries = new HashMap<>();
entries.put("key1", "value1");
entries.put("key2", "value2");
assertThat(service.getMeta()).as("property metadata contains the wrong entries")
.containsExactlyInAnyOrderEntriesOf(entries);
Response<List<Check>> checkResponse = this.consul.getHealthChecksForService(
"myTestService-B", HealthChecksForServiceRequest.newBuilder()