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));
}