Skip to content

Commit ff5368a

Browse files
committed
Reinstate tags-as-metadata by adding option to merge tags with metadata. Fixes #699
1 parent eb98d86 commit ff5368a

File tree

4 files changed

+64
-11
lines changed

4 files changed

+64
-11
lines changed

spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ private void addInstancesToList(List<ServiceInstance> instances, String serviceI
7777
Response<List<HealthService>> services = this.client.getHealthServices(serviceId, request);
7878

7979
for (HealthService service : services.getValue()) {
80-
instances.add(new ConsulServiceInstance(service, serviceId));
80+
instances
81+
.add(new ConsulServiceInstance(service, serviceId, this.properties.isEnableTagMerge()));
8182
}
8283
}
8384

spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryProperties.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,12 @@ public class ConsulDiscoveryProperties {
205205
*/
206206
private int order = 0;
207207

208+
/**
209+
* Enable merge consul tag data with metadata to create service instance (defaults
210+
* to false).
211+
*/
212+
private boolean enableTagMerge = false;
213+
208214
@SuppressWarnings("unused")
209215
private ConsulDiscoveryProperties() {
210216
this.managementTags.add(MANAGEMENT);
@@ -580,6 +586,14 @@ public void setManagementEnableTagOverride(Boolean managementEnableTagOverride)
580586
this.managementEnableTagOverride = managementEnableTagOverride;
581587
}
582588

589+
public boolean isEnableTagMerge() {
590+
return this.enableTagMerge;
591+
}
592+
593+
public void setEnableTagMerge(boolean enableTagMerge) {
594+
this.enableTagMerge = enableTagMerge;
595+
}
596+
583597
@Override
584598
public String toString() {
585599
return new ToStringCreator(this).append("aclToken", this.aclToken)
@@ -591,6 +605,7 @@ public String toString() {
591605
.append("enabled", this.enabled).append("enableTagOverride", this.enableTagOverride)
592606
.append("failFast", this.failFast).append("hostInfo", this.hostInfo)
593607
.append("healthCheckCriticalTimeout", this.healthCheckCriticalTimeout)
608+
.append("enableTagMerge", this.enableTagMerge)
594609
.append("healthCheckHeaders", this.healthCheckHeaders)
595610
.append("healthCheckInterval", this.healthCheckInterval).append("healthCheckPath", this.healthCheckPath)
596611
.append("healthCheckTimeout", this.healthCheckTimeout)

spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulServiceInstance.java

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,35 @@
1616

1717
package org.springframework.cloud.consul.discovery;
1818

19-
import java.util.Collections;
20-
import java.util.LinkedHashMap;
21-
import java.util.List;
22-
import java.util.Map;
19+
import java.util.*;
2320

2421
import com.ecwid.consul.v1.health.model.HealthService;
2522

2623
import org.springframework.cloud.client.DefaultServiceInstance;
2724
import org.springframework.core.style.ToStringCreator;
25+
import org.springframework.util.StringUtils;
2826

2927
import static org.springframework.cloud.consul.discovery.ConsulServerUtils.findHost;
3028

3129
public class ConsulServiceInstance extends DefaultServiceInstance {
3230

3331
private HealthService healthService;
3432

35-
public ConsulServiceInstance(HealthService healthService, String serviceId) {
33+
public ConsulServiceInstance(HealthService healthService, String serviceId, boolean mergeTags) {
3634
this(healthService.getService().getId(), serviceId, findHost(healthService),
3735
healthService.getService().getPort(), getSecure(healthService), getMetadata(healthService),
38-
healthService.getService().getTags());
36+
healthService.getService().getTags(), mergeTags);
3937
this.healthService = healthService;
4038
}
4139

4240
public ConsulServiceInstance(String instanceId, String serviceId, String host, int port, boolean secure,
4341
Map<String, String> metadata, List<String> tags) {
44-
super(instanceId, serviceId, host, port, secure, metadata);
42+
this(instanceId, serviceId, host, port, secure, metadata, tags, false);
43+
}
44+
45+
public ConsulServiceInstance(String instanceId, String serviceId, String host, int port, boolean secure,
46+
Map<String, String> metadata, List<String> tags, boolean mergeTags) {
47+
super(instanceId, serviceId, host, port, secure, mergeTags ? mergeTags(metadata, tags) : metadata);
4548
}
4649

4750
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
5154
public ConsulServiceInstance() {
5255
}
5356

57+
private static Map<String, String> mergeTags(Map<String, String> metadata, List<String> tags) {
58+
Map<String, String> result = new LinkedHashMap<>();
59+
60+
if (metadata != null) {
61+
result.putAll(metadata);
62+
}
63+
64+
if (tags == null || tags.isEmpty()) {
65+
return result;
66+
}
67+
68+
for (String tag : tags) {
69+
String[] parts = StringUtils.delimitedListToStringArray(tag, "=");
70+
71+
switch (parts.length) {
72+
case 0:
73+
break;
74+
case 1:
75+
result.put(parts[0], parts[0]);
76+
break;
77+
case 2:
78+
result.put(parts[0], parts[1]);
79+
break;
80+
default:
81+
String[] end = Arrays.copyOfRange(parts, 1, parts.length);
82+
result.put(parts[0], StringUtils.arrayToDelimitedString(end, "="));
83+
break;
84+
}
85+
}
86+
87+
return result;
88+
}
89+
5490
private static Map<String, String> getMetadata(HealthService healthService) {
5591
Map<String, String> metadata = healthService.getService().getMeta();
5692
if (metadata == null) {
@@ -77,8 +113,8 @@ public void setHealthService(HealthService healthService) {
77113
}
78114

79115
public List<String> getTags() {
80-
if (healthService != null) {
81-
return healthService.getService().getTags();
116+
if (this.healthService != null) {
117+
return this.healthService.getService().getTags();
82118
}
83119
return Collections.emptyList();
84120
}

spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/reactive/ConsulReactiveDiscoveryClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ public Flux<ServiceInstance> getInstances(String serviceId) {
6565
return Flux.defer(() -> {
6666
List<ServiceInstance> instances = new ArrayList<>();
6767
for (HealthService healthService : getHealthServices(serviceId)) {
68-
instances.add(new ConsulServiceInstance(healthService, serviceId));
68+
instances.add(new ConsulServiceInstance(healthService, serviceId,
69+
this.properties.isEnableTagMerge()));
6970
}
7071
return Flux.fromIterable(instances);
7172
}).onErrorResume(exception -> {

0 commit comments

Comments
 (0)