diff --git a/dubbo-configcenter/dubbo-configcenter-zookeeper/pom.xml b/dubbo-configcenter/dubbo-configcenter-zookeeper/pom.xml
index db4c1e457b..8166ca072d 100644
--- a/dubbo-configcenter/dubbo-configcenter-zookeeper/pom.xml
+++ b/dubbo-configcenter/dubbo-configcenter-zookeeper/pom.xml
@@ -61,4 +61,20 @@
zookeeper
+
+
+
+ curator5
+
+ [17,)
+
+
+
+ org.apache.dubbo
+ dubbo-remoting-zookeeper-curator5
+ ${project.parent.version}
+
+
+
+
diff --git a/dubbo-distribution/dubbo-all/pom.xml b/dubbo-distribution/dubbo-all/pom.xml
index 52ec97128f..bd516f32ab 100644
--- a/dubbo-distribution/dubbo-all/pom.xml
+++ b/dubbo-distribution/dubbo-all/pom.xml
@@ -87,6 +87,13 @@
compile
true
+
+ org.apache.dubbo
+ dubbo-remoting-zookeeper-curator5
+ ${project.version}
+ compile
+ true
+
org.apache.dubbo
dubbo-rpc-api
@@ -411,6 +418,7 @@
org.apache.dubbo:dubbo-remoting-netty4
org.apache.dubbo:dubbo-remoting-netty
org.apache.dubbo:dubbo-remoting-zookeeper
+ org.apache.dubbo:dubbo-remoting-zookeeper-curator5
org.apache.dubbo:dubbo-remoting
org.apache.dubbo:dubbo-rpc-api
org.apache.dubbo:dubbo-rpc-dubbo
diff --git a/dubbo-distribution/dubbo-bom/pom.xml b/dubbo-distribution/dubbo-bom/pom.xml
index b4e4ee02db..a477c4dca2 100644
--- a/dubbo-distribution/dubbo-bom/pom.xml
+++ b/dubbo-distribution/dubbo-bom/pom.xml
@@ -93,6 +93,11 @@
dubbo-remoting-zookeeper
${project.version}
+
+ org.apache.dubbo
+ dubbo-remoting-zookeeper-curator5
+ ${project.version}
+
org.apache.dubbo
dubbo-rpc-api
diff --git a/dubbo-metadata/dubbo-metadata-report-zookeeper/pom.xml b/dubbo-metadata/dubbo-metadata-report-zookeeper/pom.xml
index baf20b36d2..6df0fc86cc 100644
--- a/dubbo-metadata/dubbo-metadata-report-zookeeper/pom.xml
+++ b/dubbo-metadata/dubbo-metadata-report-zookeeper/pom.xml
@@ -60,4 +60,20 @@
zookeeper
+
+
+
+ curator5
+
+ [17,)
+
+
+
+ org.apache.dubbo
+ dubbo-remoting-zookeeper-curator5
+ ${project.parent.version}
+
+
+
+
diff --git a/dubbo-registry/dubbo-registry-zookeeper/pom.xml b/dubbo-registry/dubbo-registry-zookeeper/pom.xml
index 48caaf0bb8..fd518e13e1 100644
--- a/dubbo-registry/dubbo-registry-zookeeper/pom.xml
+++ b/dubbo-registry/dubbo-registry-zookeeper/pom.xml
@@ -45,4 +45,20 @@
curator-x-discovery
+
+
+
+ curator5
+
+ [17,)
+
+
+
+ org.apache.dubbo
+ dubbo-remoting-zookeeper-curator5
+ ${project.parent.version}
+
+
+
+
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper-curator5/pom.xml b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/pom.xml
new file mode 100644
index 0000000000..6209329bb5
--- /dev/null
+++ b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/pom.xml
@@ -0,0 +1,63 @@
+
+
+ 4.0.0
+
+ org.apache.dubbo
+ dubbo-remoting
+ ${revision}
+ ../pom.xml
+
+ dubbo-remoting-zookeeper-curator5
+ jar
+ ${project.artifactId}
+ The zookeeper curator5 remoting module of dubbo project
+
+ false
+ 5.1.0
+ 3.7.0
+
+
+
+
+ org.apache.dubbo
+ dubbo-remoting-api
+ ${project.parent.version}
+
+
+ org.apache.dubbo
+ dubbo-common
+ ${project.parent.version}
+
+
+ org.apache.curator
+ curator-framework
+ ${curator5_version}
+
+
+ org.apache.curator
+ curator-recipes
+ ${curator5_version}
+
+
+ org.apache.zookeeper
+ zookeeper
+ ${zookeeper_version}
+
+
+
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/Curator5ZookeeperClient.java b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/main/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClient.java
similarity index 95%
rename from dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/Curator5ZookeeperClient.java
rename to dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/main/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClient.java
index 4311e1ed16..047ddd5940 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/Curator5ZookeeperClient.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/src/main/java/org/apache/dubbo/remoting/zookeeper/curator5/Curator5ZookeeperClient.java
@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.dubbo.remoting.zookeeper.curator;
+package org.apache.dubbo.remoting.zookeeper.curator5;
import org.apache.dubbo.common.URL;
import org.apache.dubbo.common.config.configcenter.ConfigItem;
@@ -257,8 +257,8 @@ public class Curator5ZookeeperClient extends AbstractZookeeperClient stringList = abstractZookeeperTransporter.getURLBackupAddress(url);
+ Assertions.assertEquals(stringList.size(), 2);
+ Assertions.assertEquals(stringList.get(0), "127.0.0.1:" + zookeeperServerPort1);
+ Assertions.assertEquals(stringList.get(1), "127.0.0.1:9099");
+ }
+
+ @Test
+ public void testGetURLBackupAddressNoBack() {
+ URL url = URL.valueOf(zookeeperConnectionAddress1 + "/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");
+ List stringList = abstractZookeeperTransporter.getURLBackupAddress(url);
+ Assertions.assertEquals(stringList.size(), 1);
+ Assertions.assertEquals(stringList.get(0), "127.0.0.1:" + zookeeperServerPort1);
+ }
+
+ @Test
+ public void testFetchAndUpdateZookeeperClientCache() throws Exception {
+ URL url = URL.valueOf(zookeeperConnectionAddress1 + "/org.apache.dubbo.registry.RegistryService?backup=127.0.0.1:" + zookeeperServerPort1 + ",127.0.0.1:" + zookeeperServerPort2 + "&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(), 2);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zookeeperServerPort1), newZookeeperClient);
+
+ URL url2 = URL.valueOf("zookeeper://127.0.0.1:" + zookeeperServerPort1 + "/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://127.0.0.1:8778/org.apache.dubbo.metadata.store.MetadataReport?backup=127.0.0.1:" + zookeeperServerPort2 + "&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);
+ }
+
+ private void checkFetchAndUpdateCacheNotNull(URL url) {
+ List addressList = abstractZookeeperTransporter.getURLBackupAddress(url);
+ ZookeeperClient zookeeperClient = abstractZookeeperTransporter.fetchAndUpdateZookeeperClientCache(addressList);
+ Assertions.assertNotNull(zookeeperClient);
+ }
+
+ @Test
+ public void testRepeatConnect() {
+ URL url = URL.valueOf(zookeeperConnectionAddress1 + "/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 url2 = URL.valueOf(zookeeperConnectionAddress1 + "/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");
+ ZookeeperClient newZookeeperClient = abstractZookeeperTransporter.connect(url);
+ //just for connected
+ newZookeeperClient.getContent("/dubbo/test");
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().size(), 1);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zookeeperServerPort1), newZookeeperClient);
+ Assertions.assertTrue(newZookeeperClient.isConnected());
+
+ ZookeeperClient newZookeeperClient2 = abstractZookeeperTransporter.connect(url2);
+ //just for connected
+ newZookeeperClient2.getContent("/dubbo/test");
+ Assertions.assertEquals(newZookeeperClient, newZookeeperClient2);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().size(), 1);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zookeeperServerPort1), newZookeeperClient);
+ }
+
+ @Test
+ public void testNotRepeatConnect() throws Exception {
+ URL url = URL.valueOf(zookeeperConnectionAddress1 + "/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 url2 = URL.valueOf(zookeeperConnectionAddress2 + "/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");
+ ZookeeperClient newZookeeperClient = abstractZookeeperTransporter.connect(url);
+ //just for connected
+ newZookeeperClient.getContent("/dubbo/test");
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().size(), 1);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zookeeperServerPort1), newZookeeperClient);
+
+ ZookeeperClient newZookeeperClient2 = abstractZookeeperTransporter.connect(url2);
+ //just for connected
+ newZookeeperClient2.getContent("/dubbo/test");
+ Assertions.assertNotEquals(newZookeeperClient, newZookeeperClient2);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().size(), 2);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zookeeperServerPort2), newZookeeperClient2);
+
+ }
+
+ @Test
+ public void testRepeatConnectForBackUpAdd() throws Exception {
+
+ URL url = URL.valueOf(zookeeperConnectionAddress1 + "/org.apache.dubbo.registry.RegistryService?backup=127.0.0.1:" + zookeeperServerPort1 + "&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 url2 = URL.valueOf(zookeeperConnectionAddress1 + "/org.apache.dubbo.metadata.store.MetadataReport?backup=127.0.0.1:" + zookeeperServerPort2 + "&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");
+ ZookeeperClient newZookeeperClient = abstractZookeeperTransporter.connect(url);
+ //just for connected
+ newZookeeperClient.getContent("/dubbo/test");
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().size(), 1);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zookeeperServerPort1), newZookeeperClient);
+
+ ZookeeperClient newZookeeperClient2 = abstractZookeeperTransporter.connect(url2);
+ //just for connected
+ newZookeeperClient2.getContent("/dubbo/test");
+ Assertions.assertEquals(newZookeeperClient, newZookeeperClient2);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().size(), 2);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zookeeperServerPort2), newZookeeperClient2);
+
+ }
+
+ @Test
+ public void testRepeatConnectForNoMatchBackUpAdd() throws Exception {
+
+ URL url = URL.valueOf(zookeeperConnectionAddress1 + "/org.apache.dubbo.registry.RegistryService?backup=127.0.0.1:" + zookeeperServerPort1 + "&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 url2 = URL.valueOf(zookeeperConnectionAddress2 + "/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");
+ ZookeeperClient newZookeeperClient = abstractZookeeperTransporter.connect(url);
+ //just for connected
+ newZookeeperClient.getContent("/dubbo/test");
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().size(), 1);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zookeeperServerPort1), newZookeeperClient);
+
+ ZookeeperClient newZookeeperClient2 = abstractZookeeperTransporter.connect(url2);
+ //just for connected
+ newZookeeperClient2.getContent("/dubbo/test");
+ Assertions.assertNotEquals(newZookeeperClient, newZookeeperClient2);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().size(), 2);
+ Assertions.assertEquals(abstractZookeeperTransporter.getZookeeperClientMap().get("127.0.0.1:" + zookeeperServerPort2), newZookeeperClient2);
+
+ }
+
+ @Test
+ public void testSameHostWithDifferentUser() throws Exception {
+ URL url1 = URL.valueOf("zookeeper://us1:pw1@127.0.0.1:" + zookeeperServerPort1 + "/path1");
+ URL url2 = URL.valueOf("zookeeper://us2:pw2@127.0.0.1:" + zookeeperServerPort1 + "/path2");
+ ZookeeperClient client1 = abstractZookeeperTransporter.connect(url1);
+ ZookeeperClient client2 = abstractZookeeperTransporter.connect(url2);
+ assertThat(client1, not(client2));
+ }
+}
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter
index 80528a2606..44f9374cd1 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter
@@ -1,2 +1 @@
curator=org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter
-curator5=org.apache.dubbo.remoting.zookeeper.curator.Curator5ZookeeperTransporter
diff --git a/dubbo-remoting/pom.xml b/dubbo-remoting/pom.xml
index bcf549265e..f1c154729e 100644
--- a/dubbo-remoting/pom.xml
+++ b/dubbo-remoting/pom.xml
@@ -35,6 +35,7 @@
dubbo-remoting-http
dubbo-remoting-netty
dubbo-remoting-zookeeper
+ dubbo-remoting-zookeeper-curator5
dubbo-remoting-netty4