From ff5368af9b91410af30f51869fe8b0f1e8132dcf Mon Sep 17 00:00:00 2001 From: lucasoares Date: Fri, 15 Jan 2021 20:03:26 -0300 Subject: [PATCH 1/5] Reinstate tags-as-metadata by adding option to merge tags with metadata. Fixes #699 --- .../discovery/ConsulDiscoveryClient.java | 3 +- .../discovery/ConsulDiscoveryProperties.java | 15 ++++++ .../discovery/ConsulServiceInstance.java | 54 +++++++++++++++---- .../ConsulReactiveDiscoveryClient.java | 3 +- 4 files changed, 64 insertions(+), 11 deletions(-) diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java index ccfc54cd7..65ebb705f 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java @@ -77,7 +77,8 @@ private void addInstancesToList(List instances, String serviceI Response> services = this.client.getHealthServices(serviceId, request); for (HealthService service : services.getValue()) { - instances.add(new ConsulServiceInstance(service, serviceId)); + instances + .add(new ConsulServiceInstance(service, serviceId, this.properties.isEnableTagMerge())); } } 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 index bdb3092c0..b518b300f 100644 --- 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 @@ -205,6 +205,12 @@ public class ConsulDiscoveryProperties { */ private int order = 0; + /** + * Enable merge consul tag data with metadata to create service instance (defaults + * to false). + */ + private boolean enableTagMerge = false; + @SuppressWarnings("unused") private ConsulDiscoveryProperties() { this.managementTags.add(MANAGEMENT); @@ -580,6 +586,14 @@ public void setManagementEnableTagOverride(Boolean managementEnableTagOverride) this.managementEnableTagOverride = managementEnableTagOverride; } + public boolean isEnableTagMerge() { + return this.enableTagMerge; + } + + public void setEnableTagMerge(boolean enableTagMerge) { + this.enableTagMerge = enableTagMerge; + } + @Override public String toString() { return new ToStringCreator(this).append("aclToken", this.aclToken) @@ -591,6 +605,7 @@ public String toString() { .append("enabled", this.enabled).append("enableTagOverride", this.enableTagOverride) .append("failFast", this.failFast).append("hostInfo", this.hostInfo) .append("healthCheckCriticalTimeout", this.healthCheckCriticalTimeout) + .append("enableTagMerge", this.enableTagMerge) .append("healthCheckHeaders", this.healthCheckHeaders) .append("healthCheckInterval", this.healthCheckInterval).append("healthCheckPath", this.healthCheckPath) .append("healthCheckTimeout", this.healthCheckTimeout) diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java index 240422c80..1d9a3de49 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java @@ -16,15 +16,13 @@ package org.springframework.cloud.consul.discovery; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import com.ecwid.consul.v1.health.model.HealthService; import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.core.style.ToStringCreator; +import org.springframework.util.StringUtils; import static org.springframework.cloud.consul.discovery.ConsulServerUtils.findHost; @@ -32,16 +30,21 @@ public class ConsulServiceInstance extends DefaultServiceInstance { private HealthService healthService; - public ConsulServiceInstance(HealthService healthService, String serviceId) { + public ConsulServiceInstance(HealthService healthService, String serviceId, boolean mergeTags) { this(healthService.getService().getId(), serviceId, findHost(healthService), healthService.getService().getPort(), getSecure(healthService), getMetadata(healthService), - healthService.getService().getTags()); + healthService.getService().getTags(), mergeTags); this.healthService = healthService; } public ConsulServiceInstance(String instanceId, String serviceId, String host, int port, boolean secure, Map metadata, List tags) { - super(instanceId, serviceId, host, port, secure, metadata); + this(instanceId, serviceId, host, port, secure, metadata, tags, false); + } + + public ConsulServiceInstance(String instanceId, String serviceId, String host, int port, boolean secure, + Map metadata, List tags, boolean mergeTags) { + super(instanceId, serviceId, host, port, secure, mergeTags ? mergeTags(metadata, tags) : metadata); } public ConsulServiceInstance(String instanceId, String serviceId, String host, int port, boolean secure) { @@ -51,6 +54,39 @@ public ConsulServiceInstance(String instanceId, String serviceId, String host, i public ConsulServiceInstance() { } + private static Map mergeTags(Map metadata, List tags) { + Map result = new LinkedHashMap<>(); + + if (metadata != null) { + result.putAll(metadata); + } + + if (tags == null || tags.isEmpty()) { + return result; + } + + for (String tag : tags) { + String[] parts = StringUtils.delimitedListToStringArray(tag, "="); + + switch (parts.length) { + case 0: + break; + case 1: + result.put(parts[0], parts[0]); + break; + case 2: + result.put(parts[0], parts[1]); + break; + default: + String[] end = Arrays.copyOfRange(parts, 1, parts.length); + result.put(parts[0], StringUtils.arrayToDelimitedString(end, "=")); + break; + } + } + + return result; + } + private static Map getMetadata(HealthService healthService) { Map metadata = healthService.getService().getMeta(); if (metadata == null) { @@ -77,8 +113,8 @@ public void setHealthService(HealthService healthService) { } public List getTags() { - if (healthService != null) { - return healthService.getService().getTags(); + if (this.healthService != null) { + return this.healthService.getService().getTags(); } return Collections.emptyList(); } diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/reactive/ConsulReactiveDiscoveryClient.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/reactive/ConsulReactiveDiscoveryClient.java index 5a4ff0a2e..41052ac55 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/reactive/ConsulReactiveDiscoveryClient.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/reactive/ConsulReactiveDiscoveryClient.java @@ -65,7 +65,8 @@ public Flux getInstances(String serviceId) { return Flux.defer(() -> { List instances = new ArrayList<>(); for (HealthService healthService : getHealthServices(serviceId)) { - instances.add(new ConsulServiceInstance(healthService, serviceId)); + instances.add(new ConsulServiceInstance(healthService, serviceId, + this.properties.isEnableTagMerge())); } return Flux.fromIterable(instances); }).onErrorResume(exception -> { From 8e10f73bbfb34de391c78b39c7ea2d32a2a4960d Mon Sep 17 00:00:00 2001 From: lucasoares Date: Wed, 20 Jan 2021 01:08:04 -0300 Subject: [PATCH 2/5] Removes wildcard import. --- .../cloud/consul/discovery/ConsulServiceInstance.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java index 1d9a3de49..e808d0241 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java @@ -16,7 +16,10 @@ package org.springframework.cloud.consul.discovery; -import java.util.*; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import com.ecwid.consul.v1.health.model.HealthService; From bc898685ed88b911eb2a67bdab8f0d57a50d944f Mon Sep 17 00:00:00 2001 From: lucasoares Date: Wed, 20 Jan 2021 01:12:31 -0300 Subject: [PATCH 3/5] Fixes missing import. --- .../cloud/consul/discovery/ConsulServiceInstance.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java index e808d0241..8275d77d2 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java @@ -18,6 +18,7 @@ import java.util.Collections; import java.util.LinkedHashMap; +import java.util.Arrays; import java.util.List; import java.util.Map; From 3450384787b88454c783575d2d1e3f8a0b216987 Mon Sep 17 00:00:00 2001 From: lucasoares Date: Wed, 20 Jan 2021 01:19:59 -0300 Subject: [PATCH 4/5] Fixes import order --- .../cloud/consul/discovery/ConsulServiceInstance.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java index 8275d77d2..cd225086b 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java @@ -16,9 +16,9 @@ package org.springframework.cloud.consul.discovery; +import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; -import java.util.Arrays; import java.util.List; import java.util.Map; From f060e7072f5fb6a3b1ca15448a259ab48c7839a5 Mon Sep 17 00:00:00 2001 From: lucasoares Date: Tue, 2 Feb 2021 20:54:50 -0300 Subject: [PATCH 5/5] Changes property name --- .../consul/discovery/ConsulDiscoveryClient.java | 2 +- .../discovery/ConsulDiscoveryProperties.java | 12 ++++++------ .../consul/discovery/ConsulServiceInstance.java | 14 +++++++------- .../reactive/ConsulReactiveDiscoveryClient.java | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java index 65ebb705f..b83c70b85 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java @@ -78,7 +78,7 @@ private void addInstancesToList(List instances, String serviceI for (HealthService service : services.getValue()) { instances - .add(new ConsulServiceInstance(service, serviceId, this.properties.isEnableTagMerge())); + .add(new ConsulServiceInstance(service, serviceId, this.properties.isMergeTagsEnabled())); } } 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 index b518b300f..1a5e8f8dd 100644 --- 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 @@ -209,7 +209,7 @@ public class ConsulDiscoveryProperties { * Enable merge consul tag data with metadata to create service instance (defaults * to false). */ - private boolean enableTagMerge = false; + private boolean mergeTagsEnabled = false; @SuppressWarnings("unused") private ConsulDiscoveryProperties() { @@ -586,12 +586,12 @@ public void setManagementEnableTagOverride(Boolean managementEnableTagOverride) this.managementEnableTagOverride = managementEnableTagOverride; } - public boolean isEnableTagMerge() { - return this.enableTagMerge; + public boolean isMergeTagsEnabled() { + return this.mergeTagsEnabled; } - public void setEnableTagMerge(boolean enableTagMerge) { - this.enableTagMerge = enableTagMerge; + public void setMergeTagsEnabled(boolean mergeTagsEnabled) { + this.mergeTagsEnabled = mergeTagsEnabled; } @Override @@ -605,7 +605,7 @@ public String toString() { .append("enabled", this.enabled).append("enableTagOverride", this.enableTagOverride) .append("failFast", this.failFast).append("hostInfo", this.hostInfo) .append("healthCheckCriticalTimeout", this.healthCheckCriticalTimeout) - .append("enableTagMerge", this.enableTagMerge) + .append("mergeTagsEnabled", this.mergeTagsEnabled) .append("healthCheckHeaders", this.healthCheckHeaders) .append("healthCheckInterval", this.healthCheckInterval).append("healthCheckPath", this.healthCheckPath) .append("healthCheckTimeout", this.healthCheckTimeout) diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java index cd225086b..186618a2b 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java @@ -34,18 +34,18 @@ public class ConsulServiceInstance extends DefaultServiceInstance { private HealthService healthService; - public ConsulServiceInstance(HealthService healthService, String serviceId, boolean mergeTags) { - this(healthService.getService().getId(), serviceId, findHost(healthService), - healthService.getService().getPort(), getSecure(healthService), getMetadata(healthService), - healthService.getService().getTags(), mergeTags); - this.healthService = healthService; - } - public ConsulServiceInstance(String instanceId, String serviceId, String host, int port, boolean secure, Map metadata, List tags) { this(instanceId, serviceId, host, port, secure, metadata, tags, false); } + public ConsulServiceInstance(HealthService healthService, String serviceId, boolean mergeTags) { + this(healthService.getService().getId(), serviceId, findHost(healthService), + healthService.getService().getPort(), getSecure(healthService), getMetadata(healthService), + healthService.getService().getTags(), mergeTags); + this.healthService = healthService; + } + public ConsulServiceInstance(String instanceId, String serviceId, String host, int port, boolean secure, Map metadata, List tags, boolean mergeTags) { super(instanceId, serviceId, host, port, secure, mergeTags ? mergeTags(metadata, tags) : metadata); diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/reactive/ConsulReactiveDiscoveryClient.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/reactive/ConsulReactiveDiscoveryClient.java index 41052ac55..81f5bc360 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/reactive/ConsulReactiveDiscoveryClient.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/reactive/ConsulReactiveDiscoveryClient.java @@ -66,7 +66,7 @@ public Flux getInstances(String serviceId) { List instances = new ArrayList<>(); for (HealthService healthService : getHealthServices(serviceId)) { instances.add(new ConsulServiceInstance(healthService, serviceId, - this.properties.isEnableTagMerge())); + this.properties.isMergeTagsEnabled())); } return Flux.fromIterable(instances); }).onErrorResume(exception -> {