From 714741b1cd666104a860e51db86c2e36fc1b1ce7 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 3 Oct 2014 17:04:24 -0600 Subject: [PATCH] added serviceId to ServiceInstance; added beginnings of a generic DiscoveryClient interface; --- .../cloud/client/ServiceInstance.java | 1 + .../client/discovery/DiscoveryClient.java | 13 +++++++ .../cloud/netflix/EurekaDiscoverClient.java | 35 +++++++++++++++++++ .../eureka/EurekaClientConfiguration.java | 12 +++++-- .../ribbon/RibbonLoadBalancerClient.java | 11 ++++-- .../eureka/EurekaRibbonInitializer.java | 7 ++-- 6 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClient.java create mode 100644 spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/EurekaDiscoverClient.java diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/ServiceInstance.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/ServiceInstance.java index 0060a921..2480f2a3 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/ServiceInstance.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/ServiceInstance.java @@ -6,6 +6,7 @@ package org.springframework.cloud.client; * TODO: name? Server? HostAndPort? Instance? */ public interface ServiceInstance { + public String getServiceId(); public String getHost(); public int getPort(); } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClient.java new file mode 100644 index 00000000..b17b3cf5 --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/client/discovery/DiscoveryClient.java @@ -0,0 +1,13 @@ +package org.springframework.cloud.client.discovery; + +import org.springframework.cloud.client.ServiceInstance; + +/** + * @author Spencer Gibb + */ +public interface DiscoveryClient { + /** + * @return ServiceInstance with information used to register the local service + */ + public ServiceInstance getLocalServiceInstance(); +} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/EurekaDiscoverClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/EurekaDiscoverClient.java new file mode 100644 index 00000000..9ba8f89f --- /dev/null +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/EurekaDiscoverClient.java @@ -0,0 +1,35 @@ +package org.springframework.cloud.netflix; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean; + +/** + * @author Spencer Gibb + */ +public class EurekaDiscoverClient implements DiscoveryClient { + + @Autowired + private EurekaInstanceConfigBean config; + + @Override + public ServiceInstance getLocalServiceInstance() { + return new ServiceInstance() { + @Override + public String getServiceId() { + return config.getAppname(); + } + + @Override + public String getHost() { + return config.getHostname(); + } + + @Override + public int getPort() { + return config.getNonSecurePort(); + } + }; + } +} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java index a13298b0..104b09a8 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfiguration.java @@ -27,6 +27,8 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.netflix.EurekaDiscoverClient; import org.springframework.cloud.netflix.servo.ServoMetricReader; import org.springframework.context.ApplicationListener; import org.springframework.context.SmartLifecycle; @@ -40,7 +42,6 @@ import org.springframework.core.Ordered; import com.netflix.appinfo.ApplicationInfoManager; import com.netflix.appinfo.EurekaInstanceConfig; import com.netflix.appinfo.InstanceInfo.InstanceStatus; -import com.netflix.discovery.DiscoveryClient; import com.netflix.discovery.DiscoveryManager; import com.netflix.discovery.EurekaClientConfig; @@ -128,16 +129,21 @@ public class EurekaClientConfiguration implements SmartLifecycle, Ordered { @Bean @Lazy @Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) - public DiscoveryClient discoveryClient() { + public com.netflix.discovery.DiscoveryClient eurekaDiscoveryClient() { return DiscoveryManager.getInstance().getDiscoveryClient(); } + @Bean + public DiscoveryClient discoveryClient() { + return new EurekaDiscoverClient(); + } + @Bean @ConditionalOnMissingBean @ConditionalOnBean(MBeanServer.class) public EurekaHealthIndicator eurekaHealthIndicator(MBeanServer server, EurekaInstanceConfig config) { - return new EurekaHealthIndicator(discoveryClient(), + return new EurekaHealthIndicator(eurekaDiscoveryClient(), new ServoMetricReader(server), config); } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonLoadBalancerClient.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonLoadBalancerClient.java index ba14090e..577ad7f4 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonLoadBalancerClient.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonLoadBalancerClient.java @@ -22,16 +22,23 @@ public class RibbonLoadBalancerClient implements LoadBalancerClient { if (server == null) { throw new IllegalStateException("Unable to locate ILoadBalancer for service: "+ serviceId); } - return new RibbonServer(server); + return new RibbonServer(serviceId, server); } private class RibbonServer implements ServiceInstance { + private String serviceId; private Server server; - private RibbonServer(Server server) { + private RibbonServer(String serviceId, Server server) { + this.serviceId = serviceId; this.server = server; } + @Override + public String getServiceId() { + return serviceId; + } + @Override public String getHost() { return server.getHost(); diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonInitializer.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonInitializer.java index 1801247c..a7b5c64e 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonInitializer.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonInitializer.java @@ -4,6 +4,8 @@ import com.netflix.config.ConfigurationManager; import com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList; import org.springframework.cloud.netflix.ribbon.ServerListInitializer; +import static com.netflix.client.config.CommonClientConfigKey.*; + /** * @author Spencer Gibb */ @@ -12,8 +14,9 @@ public class EurekaRibbonInitializer implements ServerListInitializer { @Override public void initialize(String serviceId) { //TODO: should this look more like hibernate spring boot props? - setProp(serviceId, "NIWSServerListClassName", DiscoveryEnabledNIWSServerList.class.getName()); - setProp(serviceId, "DeploymentContextBasedVipAddresses", serviceId); //FIXME: what should this be? + //TODO: only set the property if it hasn't already been set? + setProp(serviceId, NIWSServerListClassName.key(), DiscoveryEnabledNIWSServerList.class.getName()); + setProp(serviceId, DeploymentContextBasedVipAddresses.key(), serviceId); //FIXME: what should this be? } protected void setProp(String serviceId, String suffix, String value) {