You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by vi...@apache.org on 2019/10/12 05:00:17 UTC

[dubbo] branch 2.7.4-release updated: fix re-register can not work when curator session expires. (#5135)

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

victory pushed a commit to branch 2.7.4-release
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/2.7.4-release by this push:
     new 1d7e8fa  fix re-register can not work when curator session expires. (#5135)
1d7e8fa is described below

commit 1d7e8fac4523d7482d5f2d8f25dd024807e3d3d5
Author: ken.lj <ke...@gmail.com>
AuthorDate: Sat Oct 12 13:00:01 2019 +0800

    fix re-register can not work when curator session expires. (#5135)
    
    * fix re-register can not work when curator session expires.
    
    * Enhance zookeeper registry client recovery mechanism:
    1. Ignore connection event in children watcher.
    2. Fetch latest urls after connection recovery.
    
    * add same delete&create logic to createEphemeral(path, data)
    
    * remoting config from RegistryConfig and ConfigCenter both can take effect.
---
 .../dubbo/config/AbstractInterfaceConfig.java      |   8 +-
 .../dubbo/registry/support/FailbackRegistry.java   |   2 +-
 .../registry/zookeeper/ZookeeperRegistry.java      |  39 ++++++-
 .../dubbo/remoting/zookeeper/StateListener.java    |   6 +-
 .../zookeeper/curator/CuratorZookeeperClient.java  | 113 +++++++++++++++------
 .../zookeeper/support/AbstractZookeeperClient.java |   3 +
 .../support/AbstractZookeeperTransporter.java      |   3 +-
 .../support/AbstractZookeeperTransporterTest.java  |  30 ------
 8 files changed, 134 insertions(+), 70 deletions(-)

diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
index 8505c46..9e3952c 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
@@ -58,6 +58,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;
 import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;
 import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL;
+import static org.apache.dubbo.common.constants.CommonConstants.D_REGISTRY_SPLIT_PATTERN;
 import static org.apache.dubbo.common.constants.CommonConstants.FILE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;
@@ -69,7 +70,6 @@ import static org.apache.dubbo.common.constants.CommonConstants.SHUTDOWN_WAIT_SE
 import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
 import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;
 import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;
-import static org.apache.dubbo.common.constants.CommonConstants.D_REGISTRY_SPLIT_PATTERN;
 import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;
 import static org.apache.dubbo.config.Constants.DUBBO_IP_TO_REGISTRY;
 import static org.apache.dubbo.config.Constants.LAYER_KEY;
@@ -620,7 +620,11 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
             Environment.getInstance().getDynamicConfiguration().orElseGet(() -> {
                 ConfigManager configManager = ConfigManager.getInstance();
                 ConfigCenterConfig cc = configManager.getConfigCenter().orElse(new ConfigCenterConfig());
-                cc.setParameters(new HashMap<>());
+                if (rc.getParameters() != null) {
+                    Map<String, String> configParams = cc.getParameters() == null ? new HashMap<>() : cc.getParameters();
+                    configParams.putAll(rc.getParameters());
+                    cc.setParameters(configParams);
+                }
                 cc.getParameters().put(org.apache.dubbo.remoting.Constants.CLIENT_KEY,rc.getClient());
                 cc.setProtocol(rc.getProtocol());
                 cc.setAddress(rc.getAddress());
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/FailbackRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/FailbackRegistry.java
index f4c21b7..18062f3 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/FailbackRegistry.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/FailbackRegistry.java
@@ -138,7 +138,7 @@ public abstract class FailbackRegistry extends AbstractRegistry {
         }
     }
 
-    private void addFailedSubscribed(URL url, NotifyListener listener) {
+    protected void addFailedSubscribed(URL url, NotifyListener listener) {
         Holder h = new Holder(url, listener);
         FailedSubscribedTask oldOne = failedSubscribed.get(h);
         if (oldOne != null) {
diff --git a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperRegistry.java b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperRegistry.java
index fbfc750..9fda052 100644
--- a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperRegistry.java
+++ b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/ZookeeperRegistry.java
@@ -33,7 +33,9 @@ import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
 import org.apache.dubbo.rpc.RpcException;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -81,13 +83,26 @@ public class ZookeeperRegistry extends FailbackRegistry {
         }
         this.root = group;
         zkClient = zookeeperTransporter.connect(url);
-        zkClient.addStateListener(state -> {
+        zkClient.addStateListener((state) -> {
             if (state == StateListener.RECONNECTED) {
+                logger.warn("Trying to fetch the latest urls, in case there're provider changes during connection loss.\n" +
+                        " Since ephemeral ZNode will not get deleted for a connection lose, " +
+                        "there's no need to re-register url of this instance.");
+                ZookeeperRegistry.this.fetchLatestAddresses();
+            } else if (state == StateListener.NEW_SESSION_CREATED) {
+                logger.warn("Trying to re-register urls and re-subscribe listeners of this instance to registry...");
                 try {
-                    recover();
+                    ZookeeperRegistry.this.recover();
                 } catch (Exception e) {
                     logger.error(e.getMessage(), e);
                 }
+            } else if (state == StateListener.SESSION_LOST) {
+                logger.warn("Url of this instance will be deleted from registry soon. " +
+                        "Dubbo client will try to re-register once a new session is created.");
+            } else if (state == StateListener.SUSPENDED) {
+
+            } else if (state == StateListener.CONNECTED) {
+
             }
         });
     }
@@ -293,4 +308,24 @@ public class ZookeeperRegistry extends FailbackRegistry {
         return urls;
     }
 
+    /**
+     * When zookeeper connection recovered from a connection loss, it need to fetch the latest provider list.
+     * re-register watcher is only a side effect and is not mandate.
+     */
+    private void fetchLatestAddresses() {
+        // subscribe
+        Map<URL, Set<NotifyListener>> recoverSubscribed = new HashMap<URL, Set<NotifyListener>>(getSubscribed());
+        if (!recoverSubscribed.isEmpty()) {
+            if (logger.isInfoEnabled()) {
+                logger.info("Fetching the latest urls of " + recoverSubscribed.keySet());
+            }
+            for (Map.Entry<URL, Set<NotifyListener>> entry : recoverSubscribed.entrySet()) {
+                URL url = entry.getKey();
+                for (NotifyListener listener : entry.getValue()) {
+                    addFailedSubscribed(url, listener);
+                }
+            }
+        }
+    }
+
 }
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/StateListener.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/StateListener.java
index a9da719..ca4dbe0 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/StateListener.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/StateListener.java
@@ -18,12 +18,16 @@ package org.apache.dubbo.remoting.zookeeper;
 
 public interface StateListener {
 
-    int DISCONNECTED = 0;
+    int SESSION_LOST = 0;
 
     int CONNECTED = 1;
 
     int RECONNECTED = 2;
 
+    int SUSPENDED = 3;
+
+    int NEW_SESSION_CREATED = 4;
+
     void stateChanged(int connected);
 
 }
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClient.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClient.java
index 501931c..2de8962 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClient.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClient.java
@@ -19,7 +19,6 @@ package org.apache.dubbo.remoting.zookeeper.curator;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
-import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.remoting.zookeeper.ChildListener;
 import org.apache.dubbo.remoting.zookeeper.DataListener;
 import org.apache.dubbo.remoting.zookeeper.EventType;
@@ -39,9 +38,9 @@ import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException.NoNodeException;
 import org.apache.zookeeper.KeeperException.NodeExistsException;
 import org.apache.zookeeper.WatchedEvent;
+import org.apache.zookeeper.Watcher;
 
 import java.nio.charset.Charset;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -53,37 +52,28 @@ import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
 public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorZookeeperClient.CuratorWatcherImpl, CuratorZookeeperClient.CuratorWatcherImpl> {
 
     protected static final Logger logger = LoggerFactory.getLogger(CuratorZookeeperClient.class);
+    private static final String ZK_SESSION_EXPIRE_KEY = "zk.session.expire";
 
     static final Charset CHARSET = Charset.forName("UTF-8");
     private final CuratorFramework client;
     private Map<String, TreeCache> treeCacheMap = new ConcurrentHashMap<>();
 
-
     public CuratorZookeeperClient(URL url) {
         super(url);
         try {
-            int timeout = url.getParameter(TIMEOUT_KEY, 5000);
+            int timeout = url.getParameter(TIMEOUT_KEY, DEFAULT_CONNECTION_TIMEOUT_MS);
+            int sessionExpireMs = url.getParameter(ZK_SESSION_EXPIRE_KEY, DEFAULT_SESSION_TIMEOUT_MS);
             CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
                     .connectString(url.getBackupAddress())
                     .retryPolicy(new RetryNTimes(1, 1000))
-                    .connectionTimeoutMs(timeout);
+                    .connectionTimeoutMs(timeout)
+                    .sessionTimeoutMs(sessionExpireMs);
             String authority = url.getAuthority();
             if (authority != null && authority.length() > 0) {
                 builder = builder.authorization("digest", authority.getBytes());
             }
             client = builder.build();
-            client.getConnectionStateListenable().addListener(new ConnectionStateListener() {
-                @Override
-                public void stateChanged(CuratorFramework client, ConnectionState state) {
-                    if (state == ConnectionState.LOST) {
-                        CuratorZookeeperClient.this.stateChanged(StateListener.DISCONNECTED);
-                    } else if (state == ConnectionState.CONNECTED) {
-                        CuratorZookeeperClient.this.stateChanged(StateListener.CONNECTED);
-                    } else if (state == ConnectionState.RECONNECTED) {
-                        CuratorZookeeperClient.this.stateChanged(StateListener.RECONNECTED);
-                    }
-                }
-            });
+            client.getConnectionStateListenable().addListener(new CuratorConnectionStateListener(url));
             client.start();
             boolean connected = client.blockUntilConnected(timeout, TimeUnit.MILLISECONDS);
             if (!connected) {
@@ -99,6 +89,7 @@ public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorZooke
         try {
             client.create().forPath(path);
         } catch (NodeExistsException e) {
+            logger.warn("ZNode " + path + " already exists.", e);
         } catch (Exception e) {
             throw new IllegalStateException(e.getMessage(), e);
         }
@@ -109,6 +100,12 @@ public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorZooke
         try {
             client.create().withMode(CreateMode.EPHEMERAL).forPath(path);
         } catch (NodeExistsException e) {
+            logger.warn("ZNode " + path + " already exists, since we will only try to recreate a node on a session expiration" +
+                    ", this duplication might be caused by a delete delay from the zk server, which means the old expired session" +
+                    " may still holds this ZNode and the server just hasn't got time to do the deletion. In this case, " +
+                    "we can just try to delete and create again.", e);
+            deletePath(path);
+            createEphemeral(path);
         } catch (Exception e) {
             throw new IllegalStateException(e.getMessage(), e);
         }
@@ -136,11 +133,12 @@ public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorZooke
         try {
             client.create().withMode(CreateMode.EPHEMERAL).forPath(path, dataBytes);
         } catch (NodeExistsException e) {
-            try {
-                client.setData().forPath(path, dataBytes);
-            } catch (Exception e1) {
-                throw new IllegalStateException(e.getMessage(), e1);
-            }
+            logger.warn("ZNode " + path + " already exists, since we will only try to recreate a node on a session expiration" +
+                    ", this duplication might be caused by a delete delay from the zk server, which means the old expired session" +
+                    " may still holds this ZNode and the server just hasn't got time to do the deletion. In this case, " +
+                    "we can just try to delete and create again.", e);
+            deletePath(path);
+            createEphemeral(path, data);
         } catch (Exception e) {
             throw new IllegalStateException(e.getMessage(), e);
         }
@@ -203,7 +201,7 @@ public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorZooke
 
     @Override
     public CuratorZookeeperClient.CuratorWatcherImpl createTargetChildListener(String path, ChildListener listener) {
-        return new CuratorZookeeperClient.CuratorWatcherImpl(client, listener);
+        return new CuratorZookeeperClient.CuratorWatcherImpl(client, listener, path);
     }
 
     @Override
@@ -264,11 +262,12 @@ public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorZooke
         private CuratorFramework client;
         private volatile ChildListener childListener;
         private volatile DataListener dataListener;
+        private String path;
 
-
-        public CuratorWatcherImpl(CuratorFramework client, ChildListener listener) {
+        public CuratorWatcherImpl(CuratorFramework client, ChildListener listener, String path) {
             this.client = client;
             this.childListener = listener;
+            this.path = path;
         }
 
         public CuratorWatcherImpl(CuratorFramework client, DataListener dataListener) {
@@ -284,15 +283,14 @@ public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorZooke
 
         @Override
         public void process(WatchedEvent event) throws Exception {
+            // if client connect or disconnect to server, zookeeper will queue
+            // watched event(Watcher.Event.EventType.None, .., path = null).
+            if (event.getType() == Watcher.Event.EventType.None) {
+                return;
+            }
+
             if (childListener != null) {
-                String path = event.getPath() == null ? "" : event.getPath();
-                childListener.childChanged(path,
-                        // if path is null, curator using watcher will throw NullPointerException.
-                        // if client connect or disconnect to server, zookeeper will queue
-                        // watched event(Watcher.Event.EventType.None, .., path = null).
-                        StringUtils.isNotEmpty(path)
-                                ? client.getChildren().usingWatcher(this).forPath(path)
-                                : Collections.<String>emptyList());
+                childListener.childChanged(path, client.getChildren().usingWatcher(this).forPath(path));
             }
         }
 
@@ -340,6 +338,55 @@ public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorZooke
         }
     }
 
+    private class CuratorConnectionStateListener implements ConnectionStateListener {
+        private final long UNKNOWN_SESSION_ID = -1L;
+
+        private long lastSessionId;
+        private URL url;
+
+        public CuratorConnectionStateListener(URL url) {
+            this.url = url;
+        }
+
+        @Override
+        public void stateChanged(CuratorFramework client, ConnectionState state) {
+            int timeout = url.getParameter(TIMEOUT_KEY, DEFAULT_CONNECTION_TIMEOUT_MS);
+            int sessionExpireMs = url.getParameter(ZK_SESSION_EXPIRE_KEY, DEFAULT_SESSION_TIMEOUT_MS);
+
+            long sessionId = UNKNOWN_SESSION_ID;
+            try {
+                sessionId = client.getZookeeperClient().getZooKeeper().getSessionId();
+            } catch (Exception e) {
+                logger.warn("Curator client state changed, but failed to get the related zk session instance.");
+            }
+
+            if (state == ConnectionState.LOST) {
+                logger.warn("Curator zookeeper session " + Long.toHexString(lastSessionId) + " expired.");
+                CuratorZookeeperClient.this.stateChanged(StateListener.SESSION_LOST);
+            } else if (state == ConnectionState.SUSPENDED) {
+                logger.warn("Curator zookeeper connection of session " + Long.toHexString(sessionId) + " timed out. " +
+                        "connection timeout value is " + timeout + ", session expire timeout value is " + sessionExpireMs);
+                CuratorZookeeperClient.this.stateChanged(StateListener.SUSPENDED);
+            } else if (state == ConnectionState.CONNECTED) {
+                lastSessionId = sessionId;
+                logger.info("Curator zookeeper client instance initiated successfully, session id is " + Long.toHexString(sessionId));
+                CuratorZookeeperClient.this.stateChanged(StateListener.CONNECTED);
+            } else if (state == ConnectionState.RECONNECTED) {
+                if (lastSessionId == sessionId && sessionId != UNKNOWN_SESSION_ID) {
+                    logger.warn("Curator zookeeper connection recovered from connection lose, " +
+                            "reuse the old session " + Long.toHexString(sessionId));
+                    CuratorZookeeperClient.this.stateChanged(StateListener.RECONNECTED);
+                } else {
+                    logger.warn("New session created after old session lost, " +
+                            "old session " + Long.toHexString(lastSessionId) + ", new session " + Long.toHexString(sessionId));
+                    lastSessionId = sessionId;
+                    CuratorZookeeperClient.this.stateChanged(StateListener.NEW_SESSION_CREATED);
+                }
+            }
+        }
+
+    }
+
     /**
      * just for unit test
      *
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperClient.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperClient.java
index 2e54b05..c0258eb 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperClient.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperClient.java
@@ -36,6 +36,9 @@ public abstract class AbstractZookeeperClient<TargetDataListener, TargetChildLis
 
     protected static final Logger logger = LoggerFactory.getLogger(AbstractZookeeperClient.class);
 
+    protected int DEFAULT_CONNECTION_TIMEOUT_MS = 5 * 1000;
+    protected int DEFAULT_SESSION_TIMEOUT_MS = 60 * 1000;
+
     private final URL url;
 
     private final Set<StateListener> stateListeners = new CopyOnWriteArraySet<StateListener>();
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java
index 030f979..2b85d10 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporter.java
@@ -65,7 +65,7 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport
                 return zookeeperClient;
             }
 
-            zookeeperClient = createZookeeperClient(toClientURL(url));
+            zookeeperClient = createZookeeperClient(url);
             logger.info("No valid zookeeper client found from cache, therefore create a new client for url. " + url);
             writeToClientMap(addressList, zookeeperClient);
         }
@@ -143,6 +143,7 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport
         if (url.getParameter(RemotingConstants.BACKUP_KEY) != null) {
             parameterMap.put(RemotingConstants.BACKUP_KEY, url.getParameter(RemotingConstants.BACKUP_KEY));
         }
+
         return new URL(url.getProtocol(), url.getUsername(), url.getPassword(), url.getHost(), url.getPort(),
                 ZookeeperTransporter.class.getName(), parameterMap);
     }
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java
index a1644a3..43cf481 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperTransporterTest.java
@@ -19,7 +19,6 @@ package org.apache.dubbo.remoting.zookeeper.support;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperClient;
-import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
 import org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter;
 
 import org.apache.curator.test.TestingServer;
@@ -30,7 +29,6 @@ import org.junit.jupiter.api.Test;
 
 import java.util.List;
 
-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.IsNot.not;
 import static org.hamcrest.core.IsNull.nullValue;
@@ -66,34 +64,6 @@ public class AbstractZookeeperTransporterTest {
     }
 
     @Test
-    public void testCreateServerURL() {
-        URL url = URL.valueOf("zookeeper://127.0.0.1:" + zkServerPort + "/org.apache.dubbo.registry.RegistryService?application=metadatareport-local-xml-provider2&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=47418&specVersion=2.7.0-SNAPSHOT&timestamp=1547102428828&timeout=2300");
-        URL newUrl = abstractZookeeperTransporter.toClientURL(url);
-        Assertions.assertEquals(newUrl.getProtocol(), "zookeeper");
-        Assertions.assertEquals(newUrl.getHost(), "127.0.0.1");
-        Assertions.assertEquals(newUrl.getPort(), zkServerPort);
-        Assertions.assertNull(newUrl.getUsername());
-        Assertions.assertNull(newUrl.getPassword());
-        Assertions.assertEquals(newUrl.getParameter(TIMEOUT_KEY, 5000), 2300);
-        Assertions.assertEquals(newUrl.getParameters().size(), 1);
-        Assertions.assertEquals(newUrl.getPath(), ZookeeperTransporter.class.getName());
-    }
-
-
-    @Test
-    public void testToCreateURLWhenHasUser() {
-        URL url = URL.valueOf("zookeeper://us2:pw2@127.0.0.1:" + zkServerPort + "/org.apache.dubbo.registry.RegistryService?application=metadatareport-local-xml-provider2&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=47418&specVersion=2.7.0-SNAPSHOT&timestamp=1547102428828");
-        URL newUrl = abstractZookeeperTransporter.toClientURL(url);
-        Assertions.assertEquals(newUrl.getProtocol(), "zookeeper");
-        Assertions.assertEquals(newUrl.getHost(), "127.0.0.1");
-        Assertions.assertEquals(newUrl.getPort(), zkServerPort);
-        Assertions.assertEquals(newUrl.getUsername(), "us2");
-        Assertions.assertEquals(newUrl.getPassword(), "pw2");
-        Assertions.assertEquals(newUrl.getParameters().size(), 0);
-        Assertions.assertEquals(newUrl.getPath(), ZookeeperTransporter.class.getName());
-    }
-
-    @Test
     public void testGetURLBackupAddress() {
         URL url = URL.valueOf("zookeeper://127.0.0.1:" + zkServerPort + "/org.apache.dubbo.registry.RegistryService?backup=127.0.0.1:" + 9099 + "&application=metadatareport-local-xml-provider2&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=47418&specVersion=2.7.0-SNAPSHOT&timestamp=1547102428828");
         List<String> stringList = abstractZookeeperTransporter.getURLBackupAddress(url);