diff --git a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java index b364df4143a..fec41dfdd21 100644 --- a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java +++ b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java @@ -17,6 +17,7 @@ package org.apache.dubbo.registry.nacos; import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.URLBuilder; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.UrlUtils; @@ -35,7 +36,6 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.LinkedList; @@ -59,6 +59,7 @@ import static org.apache.dubbo.common.constants.RegistryConstants.CONFIGURATORS_CATEGORY; import static org.apache.dubbo.common.constants.RegistryConstants.CONSUMERS_CATEGORY; import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_CATEGORY; +import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL; import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDERS_CATEGORY; import static org.apache.dubbo.common.constants.RegistryConstants.ROUTERS_CATEGORY; import static org.apache.dubbo.registry.Constants.ADMIN_PROTOCOL; @@ -369,15 +370,26 @@ private List doGetServiceNames(URL url) { return serviceNames; } - private List buildURLs(URL consumerURL, Collection instances) { - if (instances.isEmpty()) { - return Collections.emptyList(); + private List toUrlWithEmpty(URL consumerURL, Collection instances) { + List urls = buildURLs(consumerURL, instances); + if (urls.size() == 0) { + URL empty = URLBuilder.from(consumerURL) + .setProtocol(EMPTY_PROTOCOL) + .addParameter(CATEGORY_KEY, DEFAULT_CATEGORY) + .build(); + urls.add(empty); } + return urls; + } + + private List buildURLs(URL consumerURL, Collection instances) { List urls = new LinkedList<>(); - for (Instance instance : instances) { - URL url = buildURL(instance); - if (UrlUtils.isMatch(consumerURL, url)) { - urls.add(url); + if (instances != null && !instances.isEmpty()) { + for (Instance instance : instances) { + URL url = buildURL(instance); + if (UrlUtils.isMatch(consumerURL, url)) { + urls.add(url); + } } } return urls; @@ -406,9 +418,11 @@ private void subscribeEventListener(String serviceName, final URL url, final Not */ private void notifySubscriber(URL url, NotifyListener listener, Collection instances) { List healthyInstances = new LinkedList<>(instances); - // Healthy Instances - filterHealthyInstances(healthyInstances); - List urls = buildURLs(url, healthyInstances); + if (healthyInstances.size() > 0) { + // Healthy Instances + filterHealthyInstances(healthyInstances); + } + List urls = toUrlWithEmpty(url, healthyInstances); NacosRegistry.this.notify(url, listener, urls); }