diff --git a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClient.java b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClient.java index 589c7c4e..a33cca2c 100644 --- a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClient.java +++ b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryClient.java @@ -19,7 +19,9 @@ package org.springframework.cloud.zookeeper.discovery; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.commons.logging.Log; import org.apache.curator.x.discovery.ServiceInstance; @@ -67,7 +69,13 @@ public class ZookeeperDiscoveryClient implements DiscoveryClient { port = serviceInstance.getSslPort(); } - return new DefaultServiceInstance(serviceId, serviceInstance.getAddress(), port, secure); + Map metadata; + if (serviceInstance.getPayload() != null) { + metadata = serviceInstance.getPayload().getMetadata(); + } else { + metadata = new HashMap<>(); + } + return new DefaultServiceInstance(serviceId, serviceInstance.getAddress(), port, secure, metadata); } @Override diff --git a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryProperties.java b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryProperties.java index e05aac2c..4566186b 100644 --- a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryProperties.java +++ b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryProperties.java @@ -16,6 +16,9 @@ package org.springframework.cloud.zookeeper.discovery; +import java.util.HashMap; +import java.util.Map; + import org.springframework.boot.context.properties.ConfigurationProperties; /** @@ -31,6 +34,12 @@ public class ZookeeperDiscoveryProperties { private String instanceHost; + /** + * Gets the metadata name/value pairs associated with this instance. This information + * is sent to zookeeper and can be used by other instances. + */ + private Map metadata = new HashMap<>(); + public boolean isEnabled() { return this.enabled; } @@ -62,4 +71,24 @@ public class ZookeeperDiscoveryProperties { public void setInstanceHost(String instanceHost) { this.instanceHost = instanceHost; } + + public Map getMetadata() { + return this.metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("ZookeeperDiscoveryProperties{"); + sb.append("enabled=").append(this.enabled); + sb.append(", root='").append(this.root).append('\''); + sb.append(", uriSpec='").append(this.uriSpec).append('\''); + sb.append(", instanceHost='").append(this.instanceHost).append('\''); + sb.append(", metadata=").append(this.metadata); + sb.append('}'); + return sb.toString(); + } } diff --git a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperInstance.java b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperInstance.java index 138c5d7d..f535d52b 100644 --- a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperInstance.java +++ b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperInstance.java @@ -16,20 +16,25 @@ package org.springframework.cloud.zookeeper.discovery; +import java.util.HashMap; +import java.util.Map; + /** * @author Spencer Gibb */ public class ZookeeperInstance { private String id; private String name; + private Map metadata = new HashMap<>(); @SuppressWarnings("unused") private ZookeeperInstance() { } - public ZookeeperInstance(String id, String name) { + public ZookeeperInstance(String id, String name, Map metadata) { this.id = id; this.name = name; + this.metadata = metadata; } public String getId() { @@ -47,4 +52,22 @@ public class ZookeeperInstance { public void setName(String name) { this.name = name; } + + public Map getMetadata() { + return this.metadata; + } + + public void setMetadata(Map metadata) { + this.metadata = metadata; + } + + @Override + public String toString() { + final StringBuffer sb = new StringBuffer("ZookeeperInstance{"); + sb.append("id='").append(this.id).append('\''); + sb.append(", name='").append(this.name).append('\''); + sb.append(", metadata=").append(this.metadata); + sb.append('}'); + return sb.toString(); + } } diff --git a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperServiceDiscovery.java b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperServiceDiscovery.java index 1dfa0548..d10163e4 100644 --- a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperServiceDiscovery.java +++ b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperServiceDiscovery.java @@ -114,7 +114,7 @@ public class ZookeeperServiceDiscovery implements ApplicationContextAware { try { serviceInstance.set(ServiceInstance.builder() .name(appName) - .payload(new ZookeeperInstance(context.getId(), appName)) + .payload(new ZookeeperInstance(context.getId(), appName, this.properties.getMetadata())) .port(port.get()) .address(host) .uriSpec(uriSpec).build()); diff --git a/spring-cloud-zookeeper-discovery/src/test/groovy/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryISpec.groovy b/spring-cloud-zookeeper-discovery/src/test/groovy/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryISpec.groovy index 39229f75..409eacd3 100644 --- a/spring-cloud-zookeeper-discovery/src/test/groovy/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryISpec.groovy +++ b/spring-cloud-zookeeper-discovery/src/test/groovy/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryISpec.groovy @@ -66,6 +66,7 @@ class ZookeeperDiscoveryISpec extends Specification implements PollingUtils { ServiceInstance instance = instances.first() expect: 'UP' == registeredServiceStatus(instance) + 'testMetadataValue' == instance.metadata.get('testMetadataKey') } def 'should present application name as id of the service instance'() { diff --git a/spring-cloud-zookeeper-discovery/src/test/resources/application-ribbon.yml b/spring-cloud-zookeeper-discovery/src/test/resources/application-ribbon.yml index 73852a66..f9297832 100644 --- a/spring-cloud-zookeeper-discovery/src/test/resources/application-ribbon.yml +++ b/spring-cloud-zookeeper-discovery/src/test/resources/application-ribbon.yml @@ -1 +1,8 @@ -spring.application.name: ribbonApp \ No newline at end of file +spring: + application: + name: ribbonApp + cloud: + zookeeper: + discovery: + metadata: + testMetadataKey: testMetadataValue \ No newline at end of file