From 1f10b523f0eea310ae58f2461835cd0706d9c7b8 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Mon, 23 Oct 2017 18:17:56 -0400 Subject: [PATCH] Allows configuration of curator instance-id via properties. fixes gh-140 --- .../discovery/ZookeeperDiscoveryProperties.java | 12 ++++++++++++ .../discovery/ZookeeperServiceDiscovery.java | 3 +++ .../discovery/ZookeeperServiceInstance.java | 8 +++++++- .../discovery/ZookeeperDiscoveryPropertiesTests.java | 8 +++++--- .../zookeeper/discovery/ZookeeperDiscoveryTests.java | 3 +++ .../src/test/resources/application-ribbon.yml | 1 + 6 files changed, 31 insertions(+), 4 deletions(-) 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 1c7f6747..d57d14b4 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 @@ -49,6 +49,9 @@ public class ZookeeperDiscoveryProperties { */ private String uriSpec = DEFAULT_URI_SPEC; + /** Id used to register with zookeeper. Defaults to a random UUID. */ + private String instanceId; + /** * Predefined host with which a service can register itself in Zookeeper. Corresponds * to the {code address} from the URI spec. @@ -126,6 +129,14 @@ public class ZookeeperDiscoveryProperties { this.uriSpec = uriSpec; } + public String getInstanceId() { + return this.instanceId; + } + + public void setInstanceId(String instanceId) { + this.instanceId = instanceId; + } + public void setInstanceHost(String instanceHost) { this.instanceHost = instanceHost; this.hostInfo.override = true; @@ -185,6 +196,7 @@ public class ZookeeperDiscoveryProperties { return "ZookeeperDiscoveryProperties{" + "enabled=" + this.enabled + ", root='" + this.root + '\'' + ", uriSpec='" + this.uriSpec + '\'' + + ", instanceId='" + this.instanceId + '\'' + ", instanceHost='" + this.instanceHost + '\'' + ", instancePort='" + this.instancePort + '\'' + ", instanceSslPort='" + this.instanceSslPort + '\'' + 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 2483e14b..ef293b81 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 @@ -198,6 +198,9 @@ public class ZookeeperServiceDiscovery implements ZookeeperRegistration, Applica if (this.properties.getInstanceSslPort() != null) { builder.sslPort(this.properties.getInstanceSslPort()); } + if (this.properties.getInstanceId() != null) { + builder.id(this.properties.getInstanceId()); + } serviceInstance.set(builder.build()); } catch (Exception e) { diff --git a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperServiceInstance.java b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperServiceInstance.java index dedff8a8..470cf00c 100644 --- a/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperServiceInstance.java +++ b/spring-cloud-zookeeper-discovery/src/main/java/org/springframework/cloud/zookeeper/discovery/ZookeeperServiceInstance.java @@ -36,6 +36,7 @@ public class ZookeeperServiceInstance implements ServiceInstance { private final boolean secure; private final URI uri; private final Map metadata; + private final org.apache.curator.x.discovery.ServiceInstance serviceInstance; /** * @param serviceId The service id to be used @@ -43,7 +44,8 @@ public class ZookeeperServiceInstance implements ServiceInstance { */ public ZookeeperServiceInstance(String serviceId, org.apache.curator.x.discovery.ServiceInstance serviceInstance) { this.serviceId = serviceId; - this.host = serviceInstance.getAddress(); + this.serviceInstance = serviceInstance; + this.host = this.serviceInstance.getAddress(); this.secure = serviceInstance.getSslPort() != null; Integer port = serviceInstance.getPort(); if (this.secure) { @@ -87,4 +89,8 @@ public class ZookeeperServiceInstance implements ServiceInstance { public Map getMetadata() { return this.metadata; } + + public org.apache.curator.x.discovery.ServiceInstance getServiceInstance() { + return this.serviceInstance; + } } diff --git a/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryPropertiesTests.java b/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryPropertiesTests.java index faee0b5a..212563f1 100644 --- a/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryPropertiesTests.java +++ b/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryPropertiesTests.java @@ -11,13 +11,14 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import static org.junit.Assert.assertEquals; +import static org.assertj.core.api.Assertions.assertThat; /** * @author wmz7year */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(properties = {"pring.application.name=testZookeeperDiscovery", + "spring.cloud.zookeeper.discovery.instance-id=zkpropstestid-123", "spring.cloud.zookeeper.discovery.preferIpAddress=true", "spring.cloud.zookeeper.discovery.instanceIpAddress=1.1.1.1"}, classes = ZookeeperDiscoveryPropertiesTests.Config.class, @@ -29,8 +30,9 @@ public class ZookeeperDiscoveryPropertiesTests { @Test public void testPreferIpAddress() { - assertEquals("1.1.1.1", discoveryProperties.getInstanceHost()); - } + assertThat(this.discoveryProperties.getInstanceId()).isEqualTo("zkpropstestid-123"); + assertThat(this.discoveryProperties.getInstanceHost()).isEqualTo("1.1.1.1"); + } @Configuration @EnableAutoConfiguration diff --git a/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryTests.java b/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryTests.java index 3b842c36..22abd18f 100644 --- a/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryTests.java +++ b/spring-cloud-zookeeper-discovery/src/test/java/org/springframework/cloud/zookeeper/discovery/ZookeeperDiscoveryTests.java @@ -66,6 +66,9 @@ public class ZookeeperDiscoveryTests { //expect: then(registeredServiceStatus(instance)).isEqualTo("UP"); then(instance.getMetadata().get("testMetadataKey")).isEqualTo("testMetadataValue"); + then(instance).isInstanceOf(ZookeeperServiceInstance.class); + ZookeeperServiceInstance zkInstance = (ZookeeperServiceInstance) instance; + then(zkInstance.getServiceInstance().getId()).isEqualTo("ribbon-instance-id-123"); } @Test public void 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 b9179e6e..290d0f71 100644 --- a/spring-cloud-zookeeper-discovery/src/test/resources/application-ribbon.yml +++ b/spring-cloud-zookeeper-discovery/src/test/resources/application-ribbon.yml @@ -7,6 +7,7 @@ spring: metadata: testMetadataKey: testMetadataValue uriSpec: "{scheme}://{address}:{port}/contextPath" + instance-id: ribbon-instance-id-123 management: security: enabled: false