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×tamp=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×tamp=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×tamp=1547102428828");
List<String> stringList = abstractZookeeperTransporter.getURLBackupAddress(url);