From a666ddc8cbdb141444cf2efa6c6575bc587b7523 Mon Sep 17 00:00:00 2001 From: mercyblitz Date: Thu, 1 Aug 2019 10:27:29 +0800 Subject: [PATCH] Polish spring-cloud-incubator/spring-cloud-alibaba#623 : Add EMPTY_PROTOCOL URLs when no service instance is available --- ...ubboServiceDiscoveryAutoConfiguration.java | 6 ++ .../registry/AbstractSpringCloudRegistry.java | 62 ++++++++++++------- .../event/ServiceInstancesChangedEvent.java | 2 +- 3 files changed, 47 insertions(+), 23 deletions(-) diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java index c6233819..6aa9bccd 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/autoconfigure/DubboServiceDiscoveryAutoConfiguration.java @@ -442,12 +442,18 @@ public class DubboServiceDiscoveryAutoConfiguration { } } + /** + * Consul Customized Configuration + */ @Configuration @ConditionalOnBean(name = CONSUL_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME) class ConsulConfiguration { } + /** + * Nacos Customized Configuration + */ @Configuration @ConditionalOnBean(name = NACOS_DISCOVERY_AUTO_CONFIGURATION_CLASS_NAME) class NacosConfiguration { diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java index 1c8e3986..e2c06570 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/AbstractSpringCloudRegistry.java @@ -32,6 +32,7 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.util.CollectionUtils; import java.util.Collection; import java.util.HashSet; @@ -41,12 +42,15 @@ import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import static java.util.Arrays.asList; import static java.util.Collections.emptyList; +import static org.apache.dubbo.common.URLBuilder.from; import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE; import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY; import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; +import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL; import static org.apache.dubbo.registry.Constants.ADMIN_PROTOCOL; import static org.springframework.util.StringUtils.hasText; @@ -182,12 +186,12 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { String serviceName = event.getServiceName(); Collection serviceInstances = event.getServiceInstances(); if (logger.isInfoEnabled()) { - logger.info("The event of the service instances[name : {} , size: {}] changed has been arrived", + logger.info("The event of the service instances[name : {} , size: {}] change has been arrived", serviceName, serviceInstances.size()); } subscribeDubboServiceURLs(url, listener, serviceName, s -> serviceInstances); // Mark event to be processed - event.process(); + event.processed(); } }); } @@ -222,36 +226,50 @@ public abstract class AbstractSpringCloudRegistry extends FailbackRegistry { return; } - List exportedURLs = getExportedURLs(dubboMetadataService, url); + Collection serviceInstances = serviceInstancesFunction.apply(serviceName); + List allSubscribedURLs = new LinkedList<>(); - for (URL exportedURL : exportedURLs) { - Collection serviceInstances = serviceInstancesFunction.apply(serviceName); - String protocol = exportedURL.getProtocol(); - List subscribedURLs = new LinkedList<>(); - serviceInstances.forEach(serviceInstance -> { - Integer port = repository.getDubboProtocolPort(serviceInstance, protocol); - String host = serviceInstance.getHost(); - if (port == null) { - if (logger.isWarnEnabled()) { - logger.warn("The protocol[{}] port of Dubbo service instance[host : {}] " + - "can't be resolved", protocol, host); + + if (CollectionUtils.isEmpty(serviceInstances)) { + /** + * URLs with {@link RegistryConstants#EMPTY_PROTOCOL} + */ + allSubscribedURLs.addAll(emptyURLs(url)); + } else { + List exportedURLs = getExportedURLs(dubboMetadataService, url); + + for (URL exportedURL : exportedURLs) { + String protocol = exportedURL.getProtocol(); + List subscribedURLs = new LinkedList<>(); + serviceInstances.forEach(serviceInstance -> { + Integer port = repository.getDubboProtocolPort(serviceInstance, protocol); + String host = serviceInstance.getHost(); + if (port == null) { + if (logger.isWarnEnabled()) { + logger.warn("The protocol[{}] port of Dubbo service instance[host : {}] " + + "can't be resolved", protocol, host); + } + } else { + URL subscribedURL = new URL(protocol, host, port, exportedURL.getParameters()); + subscribedURLs.add(subscribedURL); } - } else { - URL subscribedURL = new URL(protocol, host, port, exportedURL.getParameters()); - subscribedURLs.add(subscribedURL); + }); + + if (logger.isDebugEnabled()) { + logger.debug("The subscribed URL[{}] will notify all URLs : {}", url, subscribedURLs); } - }); - if (logger.isDebugEnabled()) { - logger.debug("The subscribed URL[{}] will notify all URLs : {}", url, subscribedURLs); + allSubscribedURLs.addAll(subscribedURLs); } - - allSubscribedURLs.addAll(subscribedURLs); } listener.notify(allSubscribedURLs); } + private List emptyURLs(URL url) { + return asList(from(url).setProtocol(EMPTY_PROTOCOL).build()); + } + private List getServiceInstances(String serviceName) { return hasText(serviceName) ? doGetServiceInstances(serviceName) : emptyList(); } diff --git a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancesChangedEvent.java b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancesChangedEvent.java index 01a5fd62..0aa110d7 100644 --- a/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancesChangedEvent.java +++ b/spring-cloud-alibaba-dubbo/src/main/java/com/alibaba/cloud/dubbo/registry/event/ServiceInstancesChangedEvent.java @@ -70,7 +70,7 @@ public class ServiceInstancesChangedEvent extends ApplicationEvent { /** * Mark current event being processed */ - public void process() { + public void processed() { processed = true; }