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 2020/02/05 06:58:06 UTC
[dubbo] 02/02: optimize the zk connection condition. #4991
This is an automated email from the ASF dual-hosted git repository.
victory pushed a commit to branch issue_4991
in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit 70da28da1823a90ecb924117a6f3b70d4da6b876
Author: cvictory <sh...@gmail.com>
AuthorDate: Wed Feb 5 14:56:35 2020 +0800
optimize the zk connection condition. #4991
---
.../support/AbstractZookeeperTransporter.java | 25 +++++++----
.../support/AbstractZookeeperTransporterTest.java | 49 +++++++++++++++++++++-
2 files changed, 65 insertions(+), 9 deletions(-)
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 2b85d10..4a13df0 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
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.constants.RemotingConstants;
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.ZookeeperClient;
import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
@@ -54,20 +55,20 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport
ZookeeperClient zookeeperClient;
List<String> addressList = getURLBackupAddress(url);
// The field define the zookeeper server , including protocol, host, port, username, password
- if ((zookeeperClient = fetchAndUpdateZookeeperClientCache(addressList)) != null && zookeeperClient.isConnected()) {
+ if ((zookeeperClient = fetchAndUpdateZookeeperClientCache(addressList, url.getUsername())) != null && zookeeperClient.isConnected()) {
logger.info("find valid zookeeper client from the cache for address: " + url);
return zookeeperClient;
}
// avoid creating too many connections, so add lock
synchronized (zookeeperClientMap) {
- if ((zookeeperClient = fetchAndUpdateZookeeperClientCache(addressList)) != null && zookeeperClient.isConnected()) {
+ if ((zookeeperClient = fetchAndUpdateZookeeperClientCache(addressList, url.getUsername())) != null && zookeeperClient.isConnected()) {
logger.info("find valid zookeeper client from the cache for address: " + url);
return zookeeperClient;
}
zookeeperClient = createZookeeperClient(url);
logger.info("No valid zookeeper client found from cache, therefore create a new client for url. " + url);
- writeToClientMap(addressList, zookeeperClient);
+ writeToClientMap(addressList, url.getUsername(), zookeeperClient);
}
return zookeeperClient;
}
@@ -88,16 +89,17 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport
* @param addressList
* @return
*/
- ZookeeperClient fetchAndUpdateZookeeperClientCache(List<String> addressList) {
+ ZookeeperClient fetchAndUpdateZookeeperClientCache(List<String> addressList, String userName) {
ZookeeperClient zookeeperClient = null;
for (String address : addressList) {
- if ((zookeeperClient = zookeeperClientMap.get(address)) != null && zookeeperClient.isConnected()) {
+ if ((zookeeperClient = zookeeperClientMap.get(getZookeeperMapKey(userName, address))) != null
+ && zookeeperClient.isConnected()) {
break;
}
}
if (zookeeperClient != null && zookeeperClient.isConnected()) {
- writeToClientMap(addressList, zookeeperClient);
+ writeToClientMap(addressList, userName, zookeeperClient);
}
return zookeeperClient;
}
@@ -122,9 +124,9 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport
* @param addressList
* @param zookeeperClient
*/
- void writeToClientMap(List<String> addressList, ZookeeperClient zookeeperClient) {
+ void writeToClientMap(List<String> addressList, String userName, ZookeeperClient zookeeperClient) {
for (String address : addressList) {
- zookeeperClientMap.put(address, zookeeperClient);
+ zookeeperClientMap.put(getZookeeperMapKey(userName, address), zookeeperClient);
}
}
@@ -156,4 +158,11 @@ public abstract class AbstractZookeeperTransporter implements ZookeeperTransport
Map<String, ZookeeperClient> getZookeeperClientMap() {
return zookeeperClientMap;
}
+
+ private String getZookeeperMapKey(String userName, String address) {
+ if (StringUtils.isEmpty(userName)) {
+ return address;
+ }
+ return userName + "@" + address;
+ }
}
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 43cf481..c9fe1e7 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
@@ -99,6 +99,41 @@ public class AbstractZookeeperTransporterTest {
checkFetchAndUpdateCacheNotNull(url2);
URL url3 = URL.valueOf("zookeeper://127.0.0.1:8778/org.apache.dubbo.metadata.store.MetadataReport?backup=127.0.0.1:" + zkServerPort3 + "&address=zookeeper://127.0.0.1:2181&application=metadatareport-local-xml-provider2&cycle-report=false&interface=org.apache.dubbo.metadata.store.MetadataReport&retry-period=4590&retry-times=23&sync-report=true");
checkFetchAndUpdateCacheNotNull(url3);
+ Assertions.assertTrue(checkFetchAndUpdateCacheTheSame(url2, url3));
+ Assertions.assertTrue(checkFetchAndUpdateCacheTheSame(url2, url));
+ zkServer2.stop();
+ zkServer3.stop();
+ }
+
+ @Test
+ public void testFetchAndUpdateZookeeperClientCacheWhenDiffUser() throws Exception {
+ int zkServerPort2 = NetUtils.getAvailablePort();
+ TestingServer zkServer2 = new TestingServer(zkServerPort2, true);
+
+ int zkServerPort3 = NetUtils.getAvailablePort();
+ TestingServer zkServer3 = new TestingServer(zkServerPort3, true);
+
+ URL url = URL.valueOf("zookeeper://u1:p1@127.0.0.1:" + zkServerPort + "/org.apache.dubbo.registry.RegistryService?backup=127.0.0.1:" + zkServerPort3 + ",127.0.0.1:" + zkServerPort2 + "&application=metadatareport-local-xml-provider2&dubbo=2.0.2&interface=org.apache.dubbo.registry.RegistryService&pid=47418&specVersion=2.7.0-SNAPSHOT×tamp=1547102428828");
+ ZookeeperClient newZookeeperClient = abstractZookeeperTransporter.connect(url);
+ //just for connected
+ newZookeeperClient.getContent("/dubbo/test");
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().size(), 3);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("u1@127.0.0.1:" + zkServerPort), newZookeeperClient);
+ Assertions.assertNull(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zkServerPort));
+
+ URL url2 = URL.valueOf("zookeeper://u1:p1@127.0.0.1:" + zkServerPort + "/org.apache.dubbo.metadata.store.MetadataReport?address=zookeeper://127.0.0.1:2181&application=metadatareport-local-xml-provider2&cycle-report=false&interface=org.apache.dubbo.metadata.store.MetadataReport&retry-period=4590&retry-times=23&sync-report=true");
+ checkFetchAndUpdateCacheNotNull(url2);
+ URL url3 = URL.valueOf("zookeeper://u2:p2@127.0.0.1:8778/org.apache.dubbo.metadata.store.MetadataReport?backup=127.0.0.1:" + zkServerPort3 + "&address=zookeeper://127.0.0.1:2181&application=metadatareport-local-xml-provider2&cycle-report=false&interface=org.apache.dubbo.metadata.store.MetadataReport&retry-period=4590&retry-times=23&sync-report=true");
+ checkFetchAndUpdateCacheNull(url3);
+ abstractZookeeperTransporter.connect(url3);
+ checkFetchAndUpdateCacheNotNull(url3);
+ URL url4 = URL.valueOf("zookeeper://127.0.0.1:8778/org.apache.dubbo.metadata.store.MetadataReport?backup=127.0.0.1:" + zkServerPort3 + "&address=zookeeper://127.0.0.1:2181&application=metadatareport-local-xml-provider2&cycle-report=false&interface=org.apache.dubbo.metadata.store.MetadataReport&retry-period=4590&retry-times=23&sync-report=true");
+ checkFetchAndUpdateCacheNull(url4);
+ abstractZookeeperTransporter.connect(url4);
+ checkFetchAndUpdateCacheNotNull(url4);
+ Assertions.assertTrue(checkFetchAndUpdateCacheTheSame(url2, url));
+ Assertions.assertFalse(checkFetchAndUpdateCacheTheSame(url, url3));
+ Assertions.assertFalse(checkFetchAndUpdateCacheTheSame(url4, url3));
zkServer2.stop();
zkServer3.stop();
@@ -106,9 +141,21 @@ public class AbstractZookeeperTransporterTest {
private void checkFetchAndUpdateCacheNotNull(URL url) {
List<String> addressList = abstractZookeeperTransporter.getURLBackupAddress(url);
- ZookeeperClient zookeeperClient = abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList);
+ ZookeeperClient zookeeperClient = abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList, url.getUsername());
Assertions.assertNotNull(zookeeperClient);
}
+ private void checkFetchAndUpdateCacheNull(URL url) {
+ List<String> addressList = abstractZookeeperTransporter.getURLBackupAddress(url);
+ ZookeeperClient zookeeperClient = abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList, url.getUsername());
+ Assertions.assertNull(zookeeperClient);
+ }
+
+ private boolean checkFetchAndUpdateCacheTheSame(URL url1, URL url2) {
+ List<String> addressList1 = abstractZookeeperTransporter.getURLBackupAddress(url1);
+ List<String> addressList2 = abstractZookeeperTransporter.getURLBackupAddress(url2);
+ return abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList1, url1.getUsername())
+ == abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList2, url2.getUsername());
+ }
@Test
public void testRepeatConnect() {