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 7cf8d329307..2df58f9b193 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 Set getServices() { 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 29960b39e97..9f9cc984d5d 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 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 @@ default long getDelay() { 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 d808a05b977..9c6eb314de2 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 ServiceDiscovery getServiceDiscovery() { */ 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 List lookup(URL url) { @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 1dd2ea8896c..34ee84363a8 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.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 void removeServiceInstancesChangedListener(ServiceInstancesChangedListene }); } + @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));