From 2488b08d3e1dd4131ab94cf46b320307016cde50 Mon Sep 17 00:00:00 2001 From: xieshouyu <236498037@qq.com> Date: Sat, 29 Jul 2023 20:12:51 +0800 Subject: [PATCH] bugFix/fix is available timeout (#12796) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 1、Fix the issue of timeout for all calls to the isAvailable method after the zookeeper is disconnected 2、Move the isAvailable of NopServiceDiscovery into its own implementation class * 1、Fix the issue of timeout for all calls to the isAvailable method after the zookeeper is disconnected 2、Move the isAvailable of NopServiceDiscovery into its own implementation class * 1、submit empty after format error * 1、move destory to implementation class * 1、update comment description --- .../dubbo/registry/client/NopServiceDiscovery.java | 6 ++++++ .../dubbo/registry/client/ServiceDiscovery.java | 8 ++++++++ .../registry/client/ServiceDiscoveryRegistry.java | 9 +++------ .../zookeeper/ZookeeperServiceDiscovery.java | 13 +++++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/NopServiceDiscovery.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/NopServiceDiscovery.java index 7cf8d32930..2df58f9b19 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/NopServiceDiscovery.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/NopServiceDiscovery.java @@ -55,4 +55,10 @@ public class NopServiceDiscovery extends AbstractServiceDiscovery { public List getInstances(String serviceName) throws NullPointerException { return null; } + + @Override + public boolean isAvailable() { + // NopServiceDiscovery is designed for compatibility, check availability is meaningless, just return true + return true; + } } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscovery.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscovery.java index 29960b39e9..9f9cc984d5 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscovery.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscovery.java @@ -21,6 +21,7 @@ import java.util.Set; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.lang.Prioritized; +import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.metadata.MetadataInfo; import org.apache.dubbo.registry.RegistryService; import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener; @@ -94,6 +95,13 @@ public interface ServiceDiscovery extends RegistryService, Prioritized { return getUrl().getParameter(REGISTRY_DELAY_NOTIFICATION_KEY, 5000); } + /** + * Get services is the default way for service discovery to be available + */ + default boolean isAvailable() { + return !isDestroy() && CollectionUtils.isNotEmpty(getServices()); + } + /** * A human-readable description of the implementation * diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java index d808a05b97..9c6eb314de 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java @@ -110,7 +110,7 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { */ protected ServiceDiscovery createServiceDiscovery(URL registryURL) { return getServiceDiscovery(registryURL.addParameter(INTERFACE_KEY, ServiceDiscovery.class.getName()) - .removeParameter(REGISTRY_TYPE_KEY)); + .removeParameter(REGISTRY_TYPE_KEY)); } /** @@ -278,11 +278,8 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { @Override public boolean isAvailable() { - if (serviceDiscovery instanceof NopServiceDiscovery) { - // NopServiceDiscovery is designed for compatibility, check availability is meaningless, just return true - return true; - } - return !serviceDiscovery.isDestroy() && !serviceDiscovery.getServices().isEmpty(); + //serviceDiscovery isAvailable has a default method, which can be used as a reference when implementing + return serviceDiscovery.isAvailable(); } @Override diff --git a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscovery.java b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscovery.java index 1dd2ea8896..34ee84363a 100644 --- a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscovery.java +++ b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscovery.java @@ -34,6 +34,7 @@ import org.apache.dubbo.common.function.ThrowableConsumer; import org.apache.dubbo.common.function.ThrowableFunction; import org.apache.dubbo.common.logger.ErrorTypeAwareLogger; import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.registry.client.AbstractServiceDiscovery; import org.apache.dubbo.registry.client.ServiceDiscovery; import org.apache.dubbo.registry.client.ServiceInstance; @@ -179,6 +180,18 @@ public class ZookeeperServiceDiscovery extends AbstractServiceDiscovery { }); } + @Override + public boolean isAvailable() { + //Fix the issue of timeout for all calls to the isAvailable method after the zookeeper is disconnected + return !isDestroy() && isConnected() && CollectionUtils.isNotEmpty(getServices()); + } + + private boolean isConnected() { + if (curatorFramework == null || curatorFramework.getZookeeperClient() == null) { + return false; + } + return curatorFramework.getZookeeperClient().isConnected(); + } private void doInServiceRegistry(ThrowableConsumer consumer) { ThrowableConsumer.execute(serviceDiscovery, s -> consumer.accept(s));