This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new 2881761  Optimize the selection of invokers in the multi-registry 
scenario (#7446)
2881761 is described below

commit 2881761c444f9c269a48592fa96d4127329d2694
Author: xiaoheng1 <[email protected]>
AuthorDate: Thu Apr 1 20:56:39 2021 +0800

    Optimize the selection of invokers in the multi-registry scenario (#7446)
---
 .../org/apache/dubbo/config/ReferenceConfig.java   | 36 +++++++++++++++++++---
 1 file changed, 32 insertions(+), 4 deletions(-)

diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index bbaecb6..7c6e02d 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
@@ -298,7 +298,8 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
         if (StringUtils.isEmpty(hostToRegistry)) {
             hostToRegistry = NetUtils.getLocalHost();
         } else if (isInvalidLocalHost(hostToRegistry)) {
-            throw new IllegalArgumentException("Specified invalid registry ip 
from property:" + DUBBO_IP_TO_REGISTRY + ", value:" + hostToRegistry);
+            throw new IllegalArgumentException(
+                    "Specified invalid registry ip from property:" + 
DUBBO_IP_TO_REGISTRY + ", value:" + hostToRegistry);
         }
         map.put(REGISTER_IP_KEY, hostToRegistry);
 
@@ -360,7 +361,10 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
                         }
                     }
                     if (urls.isEmpty()) {
-                        throw new IllegalStateException("No such any registry 
to reference " + interfaceName + " on the consumer " + NetUtils.getLocalHost() 
+ " use dubbo version " + Version.getVersion() + ", please config 
<dubbo:registry address=\"...\" /> to your spring config.");
+                        throw new IllegalStateException(
+                                "No such any registry to reference " + 
interfaceName + " on the consumer " + NetUtils.getLocalHost() +
+                                        " use dubbo version " + 
Version.getVersion() +
+                                        ", please config <dubbo:registry 
address=\"...\" /> to your spring config.");
                     }
                 }
             }
@@ -371,11 +375,33 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
                 List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();
                 URL registryURL = null;
                 for (URL url : urls) {
-                    invokers.add(REF_PROTOCOL.refer(interfaceClass, url));
+                    Invoker<?> referInvoker = 
REF_PROTOCOL.refer(interfaceClass, url);
+                    if (shouldCheck()) {
+                        if (referInvoker.isAvailable()) {
+                            invokers.add(referInvoker);
+                        } else {
+                            referInvoker.destroy();
+                        }
+                    } else {
+                        invokers.add(referInvoker);
+                    }
+
                     if (UrlUtils.isRegistry(url)) {
                         registryURL = url; // use last registry url
                     }
                 }
+
+                if (shouldCheck() && invokers.size() == 0) {
+                    throw new IllegalStateException("Failed to check the 
status of the service "
+                            + interfaceName
+                            + ". No provider available for the service "
+                            + (group == null ? "" : group + "/")
+                            + interfaceName +
+                            (version == null ? "" : ":" + version)
+                            + " from the multi registry cluster"
+                            + " use dubbo version " + Version.getVersion());
+                }
+
                 if (registryURL != null) { // registry url is available
                     // for multi-subscription scenario, use 'zone-aware' 
policy by default
                     String cluster = registryURL.getParameter(CLUSTER_KEY, 
ZoneAwareCluster.NAME);
@@ -383,7 +409,9 @@ public class ReferenceConfig<T> extends 
ReferenceConfigBase<T> {
                     invoker = Cluster.getCluster(cluster, false).join(new 
StaticDirectory(registryURL, invokers));
                 } else { // not a registry url, must be direct invoke.
                     String cluster = CollectionUtils.isNotEmpty(invokers)
-                            ? (invokers.get(0).getUrl() != null ? 
invokers.get(0).getUrl().getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME) : 
Cluster.DEFAULT)
+                            ?
+                            (invokers.get(0).getUrl() != null ? 
invokers.get(0).getUrl().getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME) :
+                                    Cluster.DEFAULT)
                             : Cluster.DEFAULT;
                     invoker = Cluster.getCluster(cluster).join(new 
StaticDirectory(invokers));
                 }

Reply via email to