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/08/12 08:59:46 UTC

[dubbo] branch cloud-native updated (35e3aea -> 4549e02)

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

victory pushed a change to branch cloud-native
in repository https://gitbox.apache.org/repos/asf/dubbo.git.


    from 35e3aea  Fix compile problem
     new a09ba30  refactor metadata
     new 6136eea  Merge branch 'cloud-native' of github.com:apache/incubator-dubbo into cloud-native
     new 4549e02  metadata refactor

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/dubbo/bootstrap/DubboBootstrap.java |  5 +-
 .../DynamicConfigurationServiceNameMapping.java    |  6 +-
 .../apache/dubbo/metadata/MetadataConstants.java   | 12 ++++
 .../org/apache/dubbo/metadata/MetadataService.java |  4 +-
 .../org/apache/dubbo/metadata/MetadataUtil.java    |  8 +--
 .../dubbo/metadata/WritableMetadataService.java    |  2 +-
 .../dubbo/metadata/report/MetadataReport.java      | 13 ++--
 .../metadata/report/MetadataReportInstance.java    | 53 ++++++++++++++
 .../BaseApplicationMetadataIdentifier.java         | 50 ++++++++++++++
 .../identifier/BaseServiceMetadataIdentifier.java  | 69 +++++++++++++++++++
 .../report/identifier/MetadataIdentifier.java      | 49 ++-----------
 .../identifier/ServiceMetadataIdentifier.java      | 51 ++++++++++++++
 .../identifier/SubscriberMetadataIdentifier.java   | 55 +++++++++++++++
 .../report/support/AbstractMetadataReport.java     | 38 ++++++----
 .../store/InMemoryWritableMetadataService.java     |  4 +-
 .../store/RemoteWritableMetadataService.java       | 80 ++++------------------
 .../report/identifier/MetadataIdentifierTest.java  | 12 ++--
 .../support/AbstractMetadataReportFactoryTest.java | 15 ++--
 .../report/support/AbstractMetadataReportTest.java | 34 ++++++---
 .../store/RemoteWritableMeatadataServiceTest.java  |  3 +-
 .../metadata/test/JTestMetadataReport4Test.java    | 13 +++-
 .../store/consul/ConsulMetadataReport.java         | 13 +++-
 .../metadata/store/etcd/EtcdMetadataReport.java    | 13 +++-
 .../metadata/store/nacos/NacosMetadataReport.java  | 13 +++-
 .../metadata/store/redis/RedisMetadataReport.java  | 17 +++--
 .../store/zookeeper/ZookeeperMetadataReport.java   | 13 +++-
 dubbo-registry/dubbo-registry-api/pom.xml          |  5 --
 .../CompositeMetadataServiceURLBuilder.java        |  1 +
 .../metadata/RefreshServiceMetadataCustomizer.java |  2 +-
 .../proxy/BaseMetadataServiceProxyFactory.java     | 23 +++++++
 .../proxy/DefaultMetadataServiceProxyFactory.java  |  7 +-
 .../metadata/{ => proxy}/MetadataServiceProxy.java | 15 ++--
 .../metadata/proxy/RemoteMetadataServiceProxy.java | 71 +++++++++++++++++++
 .../proxy/RemoteMetadataServiceProxyFactory.java   |  6 +-
 34 files changed, 570 insertions(+), 205 deletions(-)
 create mode 100644 dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java
 create mode 100644 dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
 create mode 100644 dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseApplicationMetadataIdentifier.java
 create mode 100644 dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseServiceMetadataIdentifier.java
 create mode 100644 dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/ServiceMetadataIdentifier.java
 create mode 100644 dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/SubscriberMetadataIdentifier.java
 create mode 100644 dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/BaseMetadataServiceProxyFactory.java
 rename dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/{ => proxy}/MetadataServiceProxy.java (91%)
 create mode 100644 dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxy.java


[dubbo] 01/03: refactor metadata

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit a09ba30001b6e9e39d68746fac1d39a6a0701014
Author: cvictory <sh...@gmail.com>
AuthorDate: Mon Aug 12 09:57:27 2019 +0800

    refactor metadata
---
 .../org/apache/dubbo/bootstrap/DubboBootstrap.java |  5 +-
 .../DynamicConfigurationServiceNameMapping.java    |  6 +-
 .../apache/dubbo/metadata/MetadataConstants.java   | 11 ++++
 .../org/apache/dubbo/metadata/MetadataUtil.java    |  8 +--
 .../dubbo/metadata/report/MetadataReport.java      |  6 +-
 .../metadata/report/MetadataReportInstance.java    | 52 +++++++++++++++
 .../report/identifier/BaseMetadataIdentifier.java  | 67 +++++++++++++++++++
 .../report/identifier/MetadataIdentifier.java      | 49 ++------------
 .../identifier/ServiceMetadataIdentifier.java      | 51 +++++++++++++++
 .../report/support/AbstractMetadataReport.java     | 17 ++---
 .../store/InMemoryWritableMetadataService.java     |  2 +-
 .../store/RemoteWritableMetadataService.java       | 76 +++++-----------------
 .../store/RemoteWritableMeatadataServiceTest.java  |  3 +-
 .../store/consul/ConsulMetadataReport.java         |  5 +-
 .../metadata/store/etcd/EtcdMetadataReport.java    |  5 +-
 .../metadata/store/nacos/NacosMetadataReport.java  |  5 +-
 .../metadata/store/redis/RedisMetadataReport.java  |  7 +-
 dubbo-registry/dubbo-registry-api/pom.xml          |  5 --
 .../CompositeMetadataServiceURLBuilder.java        |  1 +
 .../proxy/BaseMetadataServiceProxyFactory.java     | 23 +++++++
 .../proxy/DefaultMetadataServiceProxyFactory.java  |  7 +-
 .../metadata/{ => proxy}/MetadataServiceProxy.java |  4 +-
 .../metadata/proxy/RemoteMetadataServiceProxy.java | 70 ++++++++++++++++++++
 .../proxy/RemoteMetadataServiceProxyFactory.java   |  6 +-
 24 files changed, 341 insertions(+), 150 deletions(-)

diff --git a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
index 005f11d..2c992f5 100644
--- a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
+++ b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java
@@ -48,6 +48,7 @@ import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;
 import org.apache.dubbo.event.EventDispatcher;
 import org.apache.dubbo.event.EventListener;
 import org.apache.dubbo.metadata.WritableMetadataService;
+import org.apache.dubbo.metadata.report.MetadataReportInstance;
 import org.apache.dubbo.metadata.store.RemoteWritableMetadataService;
 import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;
 import org.apache.dubbo.registry.client.DefaultServiceInstance;
@@ -584,9 +585,7 @@ public class DubboBootstrap {
             return;
         }
 
-        RemoteWritableMetadataService remoteMetadataService =
-                (RemoteWritableMetadataService) WritableMetadataService.getExtension(metadataType);
-        remoteMetadataService.initMetadataReport(metadataReportConfig.toUrl());
+        MetadataReportInstance.init(metadataReportConfig.toUrl());
     }
 
     private void startConfigCenter() {
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMapping.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMapping.java
index db22c6c..f7c6440 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMapping.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMapping.java
@@ -81,9 +81,9 @@ public class DynamicConfigurationServiceNameMapping implements ServiceNameMappin
     protected static String buildGroup(String serviceInterface, String group, String version, String protocol) {
         //        the issue : https://github.com/apache/dubbo/issues/4671
         //        StringBuilder groupBuilder = new StringBuilder(serviceInterface)
-        //                .append(SEPARATOR).append(defaultString(group))
-        //                .append(SEPARATOR).append(defaultString(version))
-        //                .append(SEPARATOR).append(defaultString(protocol));
+        //                .append(KEY_SEPARATOR).append(defaultString(group))
+        //                .append(KEY_SEPARATOR).append(defaultString(version))
+        //                .append(KEY_SEPARATOR).append(defaultString(protocol));
         //        return groupBuilder.toString();
         return serviceInterface;
     }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java
new file mode 100644
index 0000000..cc4da29
--- /dev/null
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java
@@ -0,0 +1,11 @@
+package org.apache.dubbo.metadata;
+
+/**
+ * @author cvictory ON 2019-08-09
+ */
+public class MetadataConstants {
+    public static final String KEY_SEPARATOR = ":";
+    public static final String DEFAULT_PATH_TAG = "metadata";
+    public static final String META_DATA_STORE_TAG = ".metaData";
+    public static final String SERVICE_META_DATA_STORE_TAG = ".smd";
+}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataUtil.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataUtil.java
index 6418571..51f5b5f 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataUtil.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataUtil.java
@@ -12,10 +12,10 @@ public class MetadataUtil {
 //
 //    private String getIdentifierKey() {
 //        return serviceInterface
-//                + SEPARATOR + (version == null ? "" : version)
-//                + SEPARATOR + (group == null ? "" : group)
-//                + SEPARATOR + (side == null ? "" : side)
-//                + SEPARATOR + application;
+//                + KEY_SEPARATOR + (version == null ? "" : version)
+//                + KEY_SEPARATOR + (group == null ? "" : group)
+//                + KEY_SEPARATOR + (side == null ? "" : side)
+//                + KEY_SEPARATOR + application;
 //    }
 //
 //    private String getFilePathKey() {
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java
index ab6f7a8..63b5385 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java
@@ -20,11 +20,13 @@ package org.apache.dubbo.metadata.report;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
 
 import java.util.List;
 import java.util.Map;
 
 /**
+ *
  */
 public interface MetadataReport {
 
@@ -32,9 +34,9 @@ public interface MetadataReport {
 
     void storeConsumerMetadata(MetadataIdentifier consumerMetadataIdentifier, Map<String, String> serviceParameterMap);
 
-    void saveMetadata(URL url);
+    void saveServiceMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url);
 
-    void removeMetadata(URL url);
+    void removeServiceMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url);
 
     List<String> getExportedURLs(MetadataIdentifier metadataIdentifier);
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
new file mode 100644
index 0000000..c3418b7
--- /dev/null
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
@@ -0,0 +1,52 @@
+package org.apache.dubbo.metadata.report;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.URLBuilder;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_DIRECTORY;
+import static org.apache.dubbo.metadata.report.support.Constants.METADATA_REPORT_KEY;
+
+/**
+ * 2019-08-09
+ */
+public class MetadataReportInstance {
+
+    private static AtomicBoolean init = new AtomicBoolean(false);
+
+    private static MetadataReport metadataReport;
+
+    public static void init(URL metadataReportURL) {
+        if (init.get()) {
+            return;
+        }
+        MetadataReportFactory metadataReportFactory = ExtensionLoader.getExtensionLoader(MetadataReportFactory.class).getAdaptiveExtension();
+        if (METADATA_REPORT_KEY.equals(metadataReportURL.getProtocol())) {
+            String protocol = metadataReportURL.getParameter(METADATA_REPORT_KEY, DEFAULT_DIRECTORY);
+            metadataReportURL = URLBuilder.from(metadataReportURL)
+                    .setProtocol(protocol)
+                    .removeParameter(METADATA_REPORT_KEY)
+                    .build();
+        }
+        metadataReport = metadataReportFactory.getMetadataReport(metadataReportURL);
+    }
+
+    public static MetadataReport getMetadataReport() {
+        return getMetadataReport(false);
+    }
+
+    public static MetadataReport getMetadataReport(boolean checked) {
+        if (checked) {
+            checkInit();
+        }
+        return metadataReport;
+    }
+
+    private static void checkInit() {
+        if (!init.get()) {
+            throw new IllegalStateException("the metadata report was not inited.");
+        }
+    }
+}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseMetadataIdentifier.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseMetadataIdentifier.java
new file mode 100644
index 0000000..79f517d
--- /dev/null
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseMetadataIdentifier.java
@@ -0,0 +1,67 @@
+package org.apache.dubbo.metadata.report.identifier;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.utils.StringUtils;
+
+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;
+import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;
+import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_PATH_TAG;
+import static org.apache.dubbo.metadata.MetadataConstants.KEY_SEPARATOR;
+
+/**
+ * @author cvictory ON 2019-08-09
+ */
+public class BaseMetadataIdentifier {
+    String serviceInterface;
+    String version;
+    String group;
+    String side;
+
+    String getUniqueKey(MetadataIdentifier.KeyTypeEnum keyType, String... params) {
+        if (keyType == MetadataIdentifier.KeyTypeEnum.PATH) {
+            return getFilePathKey(params);
+        }
+        return getIdentifierKey(params);
+    }
+
+    String getIdentifierKey(String... params) {
+
+        return serviceInterface
+                + KEY_SEPARATOR + (version == null ? "" : version)
+                + KEY_SEPARATOR + (group == null ? "" : group)
+                + KEY_SEPARATOR + (side == null ? "" : side)
+                + joinParams(KEY_SEPARATOR, params);
+    }
+
+    private String joinParams(String joinChar, String... params) {
+        if (params == null || params.length == 0) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder();
+        for (String param : params) {
+            sb.append(joinChar);
+            sb.append(param);
+        }
+        return sb.toString();
+    }
+
+    private String getFilePathKey(String... params) {
+        return getFilePathKey(DEFAULT_PATH_TAG, params);
+    }
+
+    private String getFilePathKey(String pathTag, String... params) {
+        return pathTag
+                + (StringUtils.isEmpty(toServicePath()) ? "" : (PATH_SEPARATOR + toServicePath()))
+                + (version == null ? "" : (PATH_SEPARATOR + version))
+                + (group == null ? "" : (PATH_SEPARATOR + group))
+                + (side == null ? "" : (PATH_SEPARATOR + side))
+                + joinParams(PATH_SEPARATOR, params);
+    }
+
+    private String toServicePath() {
+        if (ANY_VALUE.equals(serviceInterface)) {
+            return "";
+        }
+        return URL.encode(serviceInterface);
+    }
+}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
index 1e70a1d..7cdc759 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
@@ -17,28 +17,20 @@
 package org.apache.dubbo.metadata.report.identifier;
 
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.utils.StringUtils;
 
-import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;
 import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
-import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;
 import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
+import static org.apache.dubbo.metadata.MetadataConstants.KEY_SEPARATOR;
 
 /**
+ * The MetadataIdentifier is used to store method descriptor.
+ * <p>
  * 2018/10/25
  */
-public class MetadataIdentifier {
+public class MetadataIdentifier extends BaseMetadataIdentifier {
 
-    public static final String SEPARATOR = ":";
-    public final static String DEFAULT_PATH_TAG = "metadata";
-    public final static String META_DATA_STORE_TAG = ".metaData";
-
-    private String serviceInterface;
-    private String version;
-    private String group;
-    private String side;
     private String application;
 
     public MetadataIdentifier() {
@@ -52,6 +44,7 @@ public class MetadataIdentifier {
         this.application = application;
     }
 
+
     public MetadataIdentifier(URL url) {
         this.serviceInterface = url.getServiceInterface();
         this.version = url.getParameter(VERSION_KEY);
@@ -61,41 +54,13 @@ public class MetadataIdentifier {
     }
 
     public String getUniqueKey(KeyTypeEnum keyType) {
-        if (keyType == KeyTypeEnum.PATH) {
-            return getFilePathKey();
-        }
-        return getIdentifierKey();
+        return super.getUniqueKey(keyType, application);
     }
 
     public String getIdentifierKey() {
-        return serviceInterface
-                + SEPARATOR + (version == null ? "" : version)
-                + SEPARATOR + (group == null ? "" : group)
-                + SEPARATOR + (side == null ? "" : side)
-                + SEPARATOR + application;
+        return super.getIdentifierKey(application);
     }
 
-    private String getFilePathKey() {
-        return getFilePathKey(DEFAULT_PATH_TAG);
-    }
-
-    private String getFilePathKey(String pathTag) {
-        return pathTag
-                + (StringUtils.isEmpty(toServicePath()) ? "" : (PATH_SEPARATOR + toServicePath()))
-                + (version == null ? "" : (PATH_SEPARATOR + version))
-                + (group == null ? "" : (PATH_SEPARATOR + group))
-                + (side == null ? "" : (PATH_SEPARATOR + side))
-                + (getApplication() == null ? "" : (PATH_SEPARATOR + getApplication()));
-    }
-
-    private String toServicePath() {
-        if (ANY_VALUE.equals(serviceInterface)) {
-            return "";
-        }
-        return URL.encode(serviceInterface);
-    }
-
-
     public String getServiceInterface() {
         return serviceInterface;
     }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/ServiceMetadataIdentifier.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/ServiceMetadataIdentifier.java
new file mode 100644
index 0000000..6b07605
--- /dev/null
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/ServiceMetadataIdentifier.java
@@ -0,0 +1,51 @@
+package org.apache.dubbo.metadata.report.identifier;
+
+import org.apache.dubbo.common.URL;
+
+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
+
+/**
+ * The ServiceMetadataIdentifier is used to store the {@link org.apache.dubbo.common.URL}
+ * that are from provider and consumer
+ * <p>
+ * 2019-08-09
+ */
+public class ServiceMetadataIdentifier extends BaseMetadataIdentifier {
+
+    private String serviceInterface;
+    private String version;
+    private String group;
+    private String side;
+    private String revision;
+
+    public ServiceMetadataIdentifier() {
+    }
+
+    public ServiceMetadataIdentifier(String serviceInterface, String version, String group, String side, String revision) {
+        this.serviceInterface = serviceInterface;
+        this.version = version;
+        this.group = group;
+        this.side = side;
+        this.revision = revision;
+    }
+
+
+    public ServiceMetadataIdentifier(URL url) {
+        this.serviceInterface = url.getServiceInterface();
+        this.version = url.getParameter(VERSION_KEY);
+        this.group = url.getParameter(GROUP_KEY);
+        this.side = url.getParameter(SIDE_KEY);
+        this.revision = (url.getParameter(REVISION_KEY));
+    }
+
+    public String getUniqueKey(MetadataIdentifier.KeyTypeEnum keyType) {
+        return super.getUniqueKey(keyType, revision);
+    }
+
+    public String getIdentifierKey() {
+        return super.getIdentifierKey(revision);
+    }
+}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
index a64c887..5d3576c 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
@@ -25,6 +25,7 @@ import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
 import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
 import org.apache.dubbo.metadata.report.MetadataReport;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
 
 import com.google.gson.Gson;
 
@@ -284,20 +285,20 @@ public abstract class AbstractMetadataReport implements MetadataReport {
     }
 
     @Override
-    public void saveMetadata(URL url) {
+    public void saveServiceMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
         if (syncReport) {
-            doSaveMetadata(url);
+            doSaveMetadata(metadataIdentifier, url);
         } else {
-            reportCacheExecutor.execute(() -> doSaveMetadata(url));
+            reportCacheExecutor.execute(() -> doSaveMetadata(metadataIdentifier, url));
         }
     }
 
     @Override
-    public void removeMetadata(URL url) {
+    public void removeServiceMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
         if (syncReport) {
-            doRemoveMetadata(url);
+            doRemoveMetadata(metadataIdentifier, url);
         } else {
-            reportCacheExecutor.execute(() -> doRemoveMetadata(url));
+            reportCacheExecutor.execute(() -> doRemoveMetadata(metadataIdentifier, url));
         }
     }
 
@@ -422,9 +423,9 @@ public abstract class AbstractMetadataReport implements MetadataReport {
 
     protected abstract void doStoreConsumerMetadata(MetadataIdentifier consumerMetadataIdentifier, String serviceParameterString);
 
-    protected abstract void doSaveMetadata(URL url);
+    protected abstract void doSaveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url);
 
-    protected abstract void doRemoveMetadata(URL url);
+    protected abstract void doRemoveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url);
 
     protected abstract List<String> doGetExportedURLs();
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/InMemoryWritableMetadataService.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/InMemoryWritableMetadataService.java
index 7902477..50ec417 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/InMemoryWritableMetadataService.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/InMemoryWritableMetadataService.java
@@ -52,7 +52,7 @@ import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;
 
 /**
  * The {@link WritableMetadataService} implementation stores the metadata of Dubbo services in memory locally when they
- * exported.
+ * exported. It is used by server (provider).
  *
  * @see MetadataService
  * @see WritableMetadataService
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/RemoteWritableMetadataService.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/RemoteWritableMetadataService.java
index 0888b5d..e7144ef 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/RemoteWritableMetadataService.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/RemoteWritableMetadataService.java
@@ -17,71 +17,52 @@
 package org.apache.dubbo.metadata.store;
 
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.URLBuilder;
-import org.apache.dubbo.common.extension.ExtensionLoader;
 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.common.utils.UrlUtils;
 import org.apache.dubbo.metadata.WritableMetadataService;
 import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;
 import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
 import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
 import org.apache.dubbo.metadata.report.MetadataReport;
-import org.apache.dubbo.metadata.report.MetadataReportFactory;
+import org.apache.dubbo.metadata.report.MetadataReportInstance;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
 import org.apache.dubbo.remoting.Constants;
 import org.apache.dubbo.rpc.RpcException;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.SortedSet;
-import java.util.TreeSet;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Consumer;
 
 import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;
-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_DIRECTORY;
 import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;
-import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
-import static org.apache.dubbo.metadata.report.support.Constants.METADATA_REPORT_KEY;
 
 /**
+ * The {@link WritableMetadataService} implementation stores the metadata of Dubbo services in metadata center when they
+ * exported.
+ * It is used by server (provider).
+ *
  * @since 2.7.0
  */
 public class RemoteWritableMetadataService extends InMemoryWritableMetadataService implements WritableMetadataService {
 
     protected final Logger logger = LoggerFactory.getLogger(getClass());
 
-    private MetadataReportFactory metadataReportFactory = ExtensionLoader.getExtensionLoader(MetadataReportFactory.class).getAdaptiveExtension();
-    private MetadataReport metadataReport;
+
     private AtomicBoolean init;
 
     public RemoteWritableMetadataService() {
-    }
 
-    public void initMetadataReport(URL metadataReportURL) {
-        if (!init.compareAndSet(false, true)) {
-            return;
-        }
-        if (METADATA_REPORT_KEY.equals(metadataReportURL.getProtocol())) {
-            String protocol = metadataReportURL.getParameter(METADATA_REPORT_KEY, DEFAULT_DIRECTORY);
-            metadataReportURL = URLBuilder.from(metadataReportURL)
-                    .setProtocol(protocol)
-                    .removeParameter(METADATA_REPORT_KEY)
-                    .build();
-        }
-        metadataReport = metadataReportFactory.getMetadataReport(metadataReportURL);
     }
 
+
     public MetadataReport getMetadataReport() {
-        return metadataReport;
+        return MetadataReportInstance.getMetadataReport(true);
     }
 
     @Override
@@ -91,7 +72,7 @@ public class RemoteWritableMetadataService extends InMemoryWritableMetadataServi
             if (StringUtils.isNotEmpty(interfaceName)) {
                 Class interfaceClass = Class.forName(interfaceName);
                 ServiceDefinition serviceDefinition = ServiceDefinitionBuilder.build(interfaceClass);
-                metadataReport.storeProviderMetadata(new MetadataIdentifier(providerUrl.getServiceInterface(),
+                getMetadataReport().storeProviderMetadata(new MetadataIdentifier(providerUrl.getServiceInterface(),
                         providerUrl.getParameter(VERSION_KEY), providerUrl.getParameter(GROUP_KEY),
                         null, null), serviceDefinition);
                 return;
@@ -117,7 +98,7 @@ public class RemoteWritableMetadataService extends InMemoryWritableMetadataServi
             if (StringUtils.isNotEmpty(interfaceName)) {
                 Class interfaceClass = Class.forName(interfaceName);
                 FullServiceDefinition fullServiceDefinition = ServiceDefinitionBuilder.buildFullDefinition(interfaceClass, providerUrl.getParameters());
-                metadataReport.storeProviderMetadata(new MetadataIdentifier(providerUrl.getServiceInterface(),
+                getMetadataReport().storeProviderMetadata(new MetadataIdentifier(providerUrl.getServiceInterface(),
                         providerUrl.getParameter(VERSION_KEY), providerUrl.getParameter(GROUP_KEY),
                         PROVIDER_SIDE, providerUrl.getParameter(APPLICATION_KEY)), fullServiceDefinition);
                 return;
@@ -132,7 +113,7 @@ public class RemoteWritableMetadataService extends InMemoryWritableMetadataServi
     @Deprecated
     public void publishConsumer(URL consumerURL) throws RpcException {
         consumerURL = consumerURL.removeParameters(PID_KEY, TIMESTAMP_KEY, Constants.BIND_IP_KEY, Constants.BIND_PORT_KEY, TIMESTAMP_KEY);
-        metadataReport.storeConsumerMetadata(new MetadataIdentifier(consumerURL.getServiceInterface(),
+        getMetadataReport().storeConsumerMetadata(new MetadataIdentifier(consumerURL.getServiceInterface(),
                 consumerURL.getParameter(VERSION_KEY), consumerURL.getParameter(GROUP_KEY), CONSUMER_SIDE,
                 consumerURL.getParameter(APPLICATION_KEY)), consumerURL.getParameters());
     }
@@ -145,53 +126,26 @@ public class RemoteWritableMetadataService extends InMemoryWritableMetadataServi
     @Override
     public boolean unexportURL(URL url) {
         super.unexportURL(url);
-        return throwableAction(metadataReport::removeMetadata, url);
+        return throwableAction(getMetadataReport()::removeServiceMetadata, url);
     }
 
     @Override
     public boolean subscribeURL(URL url) {
         super.subscribeURL(url);
-        return throwableAction(metadataReport::saveMetadata, url);
+        return throwableAction(getMetadataReport()::saveServiceMetadata, url);
     }
 
     @Override
     public boolean unsubscribeURL(URL url) {
         super.unsubscribeURL(url);
-        return throwableAction(metadataReport::removeMetadata, url);
+        return throwableAction(getMetadataReport()::removeServiceMetadata, url);
     }
 
     @Override
     protected boolean finishRefreshExportedMetadata(URL url) {
-        return throwableAction(metadataReport::saveMetadata, url);
+        return throwableAction(getMetadataReport()::saveServiceMetadata, url);
     }
 
-    @Override
-    public SortedSet<String> getSubscribedURLs() {
-        return toSortedStrings(metadataReport.getSubscribedURLs());
-    }
-
-    // TODO, protocol should be used
-    @Override
-    public SortedSet<String> getExportedURLs(String serviceInterface, String group, String version, String protocol) {
-        return toSortedStrings(metadataReport.getExportedURLs(new MetadataIdentifier(serviceInterface, group, version, null, null)));
-    }
-
-    private static SortedSet<String> toSortedStrings(Collection<String> values) {
-        return Collections.unmodifiableSortedSet(new TreeSet<>(values));
-    }
-
-    @Override
-    public String getServiceDefinition(String interfaceName, String version, String group) {
-        return metadataReport.getServiceDefinition(new MetadataIdentifier(interfaceName,
-                version, group, null, null));
-    }
-
-    @Override
-    public String getServiceDefinition(String serviceKey) {
-        String[] services = UrlUtils.parseServiceKey(serviceKey);
-        return metadataReport.getServiceDefinition(new MetadataIdentifier(services[1],
-                services[0], services[2], null, null));
-    }
 
     private boolean throwableAction(Consumer<URL> consumer, URL url) {
         try {
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/store/RemoteWritableMeatadataServiceTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/store/RemoteWritableMeatadataServiceTest.java
index 18e8b70..fe2b4f6 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/store/RemoteWritableMeatadataServiceTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/store/RemoteWritableMeatadataServiceTest.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.metadata.WritableMetadataService;
 import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
+import org.apache.dubbo.metadata.report.MetadataReportInstance;
 import org.apache.dubbo.metadata.test.JTestMetadataReport4Test;
 
 import com.google.gson.Gson;
@@ -41,7 +42,7 @@ public class RemoteWritableMeatadataServiceTest {
     @BeforeEach
     public void before() {
         metadataReportService1 = (RemoteWritableMetadataService) WritableMetadataService.getExtension(METADATA_REMOTE);
-        metadataReportService1.initMetadataReport(url);
+        MetadataReportInstance.init(url);
     }
 
     @Test
diff --git a/dubbo-metadata/dubbo-metadata-report-consul/src/main/java/org/apache/dubbo/metadata/store/consul/ConsulMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-consul/src/main/java/org/apache/dubbo/metadata/store/consul/ConsulMetadataReport.java
index 89227e5..3c84263 100644
--- a/dubbo-metadata/dubbo-metadata-report-consul/src/main/java/org/apache/dubbo/metadata/store/consul/ConsulMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-consul/src/main/java/org/apache/dubbo/metadata/store/consul/ConsulMetadataReport.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 import org.apache.dubbo.rpc.RpcException;
 
@@ -56,12 +57,12 @@ public class ConsulMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
-    protected void doSaveMetadata(URL url) {
+    protected void doSaveMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
     @Override
-    protected void doRemoveMetadata(URL url) {
+    protected void doRemoveMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
diff --git a/dubbo-metadata/dubbo-metadata-report-etcd/src/main/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-etcd/src/main/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReport.java
index d01e02d..30609fb 100644
--- a/dubbo-metadata/dubbo-metadata-report-etcd/src/main/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-etcd/src/main/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReport.java
@@ -37,6 +37,7 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 import org.apache.dubbo.remoting.etcd.jetcd.JEtcdClient;
 
@@ -83,12 +84,12 @@ public class EtcdMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
-    protected void doSaveMetadata(URL url) {
+    protected void doSaveMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
     @Override
-    protected void doRemoveMetadata(URL url) {
+    protected void doRemoveMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
diff --git a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
index 1f3fc1a..bdaadeb 100644
--- a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
@@ -22,6 +22,7 @@ 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.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 import org.apache.dubbo.rpc.RpcException;
 
@@ -124,12 +125,12 @@ public class NacosMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
-    protected void doSaveMetadata(URL url) {
+    protected void doSaveMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
     @Override
-    protected void doRemoveMetadata(URL url) {
+    protected void doRemoveMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
diff --git a/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
index 9a0ad1f..8232b44 100644
--- a/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 import org.apache.dubbo.rpc.RpcException;
 
@@ -37,7 +38,7 @@ import java.util.Set;
 import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;
 import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
-import static org.apache.dubbo.metadata.report.identifier.MetadataIdentifier.META_DATA_STORE_TAG;
+import static org.apache.dubbo.metadata.MetadataConstants.META_DATA_STORE_TAG;
 
 /**
  * RedisMetadataReport
@@ -79,12 +80,12 @@ public class RedisMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
-    protected void doSaveMetadata(URL url) {
+    protected void doSaveMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url) {
 
     }
 
     @Override
-    protected void doRemoveMetadata(URL url) {
+    protected void doRemoveMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url) {
 
     }
 
diff --git a/dubbo-registry/dubbo-registry-api/pom.xml b/dubbo-registry/dubbo-registry-api/pom.xml
index db0c175..9d47281 100644
--- a/dubbo-registry/dubbo-registry-api/pom.xml
+++ b/dubbo-registry/dubbo-registry-api/pom.xml
@@ -68,11 +68,6 @@
             <artifactId>dubbo-metadata-api</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-metadata-api</artifactId>
-            <version>${project.parent.version}</version>
-        </dependency>
 
         <dependency>
             <groupId>org.apache.curator</groupId>
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/CompositeMetadataServiceURLBuilder.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/CompositeMetadataServiceURLBuilder.java
index 9ced03a..8006c85 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/CompositeMetadataServiceURLBuilder.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/CompositeMetadataServiceURLBuilder.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.registry.client.metadata;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.metadata.MetadataService;
 import org.apache.dubbo.registry.client.ServiceInstance;
+import org.apache.dubbo.registry.client.metadata.proxy.MetadataServiceProxy;
 
 import java.util.Iterator;
 import java.util.LinkedList;
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/BaseMetadataServiceProxyFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/BaseMetadataServiceProxyFactory.java
new file mode 100644
index 0000000..eba2553
--- /dev/null
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/BaseMetadataServiceProxyFactory.java
@@ -0,0 +1,23 @@
+package org.apache.dubbo.registry.client.metadata.proxy;
+
+import org.apache.dubbo.metadata.MetadataService;
+import org.apache.dubbo.registry.client.ServiceInstance;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;
+
+/**
+ * 2019-08-09
+ */
+abstract class BaseMetadataServiceProxyFactory implements MetadataServiceProxyFactory {
+    private final Map<String, MetadataService> proxies = new HashMap<>();
+
+    public final MetadataService getProxy(ServiceInstance serviceInstance) {
+        return proxies.computeIfAbsent(serviceInstance.getServiceName() + "##" +
+                serviceInstance.getMetadata().getOrDefault(REVISION_KEY, ""), id -> createProxy(serviceInstance));
+    }
+
+    protected abstract MetadataService createProxy(ServiceInstance serviceInstance);
+}
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/DefaultMetadataServiceProxyFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/DefaultMetadataServiceProxyFactory.java
index 06248f9..f25f492 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/DefaultMetadataServiceProxyFactory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/DefaultMetadataServiceProxyFactory.java
@@ -39,9 +39,8 @@ import static org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilde
  *
  * @since 2.7.4
  */
-public class DefaultMetadataServiceProxyFactory implements MetadataServiceProxyFactory {
+public class DefaultMetadataServiceProxyFactory extends BaseMetadataServiceProxyFactory implements MetadataServiceProxyFactory {
 
-    private final Map<String, MetadataService> proxies = new HashMap<>();
 
     private ProxyFactory proxyFactory;
 
@@ -57,10 +56,6 @@ public class DefaultMetadataServiceProxyFactory implements MetadataServiceProxyF
         this.proxyFactory = proxyFactory;
     }
 
-    @Override
-    public MetadataService getProxy(ServiceInstance serviceInstance) {
-        return proxies.computeIfAbsent(serviceInstance.getId(), id -> createProxy(serviceInstance));
-    }
 
     protected MetadataService createProxy(ServiceInstance serviceInstance) {
         List<URL> urls = composite().build(serviceInstance);
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceProxy.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxy.java
similarity index 97%
rename from dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceProxy.java
rename to dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxy.java
index 45ce42a..018460e 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceProxy.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxy.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.registry.client.metadata;
+package org.apache.dubbo.registry.client.metadata.proxy;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
@@ -41,7 +41,7 @@ import static org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilde
  * @see MetadataService
  * @since 2.7.4
  */
-class MetadataServiceProxy implements MetadataService {
+public class MetadataServiceProxy implements MetadataService {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxy.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxy.java
new file mode 100644
index 0000000..2c661b9
--- /dev/null
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxy.java
@@ -0,0 +1,70 @@
+package org.apache.dubbo.registry.client.metadata.proxy;
+
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.UrlUtils;
+import org.apache.dubbo.metadata.MetadataService;
+import org.apache.dubbo.metadata.report.MetadataReport;
+import org.apache.dubbo.metadata.report.MetadataReportInstance;
+import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.registry.client.ServiceInstance;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;
+
+/**
+ * 2019-08-09
+ */
+public class RemoteMetadataServiceProxy implements MetadataService {
+    protected final Logger logger = LoggerFactory.getLogger(getClass());
+
+    private String serviceName;
+
+
+    public RemoteMetadataServiceProxy(ServiceInstance serviceInstance) {
+        this.serviceName = serviceInstance.getServiceName();
+    }
+
+    @Override
+    public String serviceName() {
+        return serviceName;
+    }
+
+    @Override
+    public SortedSet<String> getSubscribedURLs() {
+        return toSortedStrings(getMetadataReport().getSubscribedURLs());
+    }
+
+    // TODO, protocol should be used
+    @Override
+    public SortedSet<String> getExportedURLs(String serviceInterface, String group, String version, String protocol) {
+        return toSortedStrings(getMetadataReport().getExportedURLs(new MetadataIdentifier(serviceInterface, group, version, null, null)));
+    }
+
+    private static SortedSet<String> toSortedStrings(Collection<String> values) {
+        return Collections.unmodifiableSortedSet(new TreeSet<>(values));
+    }
+
+    @Override
+    public String getServiceDefinition(String interfaceName, String version, String group) {
+        return getMetadataReport().getServiceDefinition(new MetadataIdentifier(interfaceName,
+                version, group, PROVIDER_SIDE, serviceName));
+    }
+
+    @Override
+    public String getServiceDefinition(String serviceKey) {
+        String[] services = UrlUtils.parseServiceKey(serviceKey);
+        return getMetadataReport().getServiceDefinition(new MetadataIdentifier(services[1],
+                services[0], services[2], PROVIDER_SIDE, serviceName));
+    }
+
+    MetadataReport getMetadataReport() {
+        return MetadataReportInstance.getMetadataReport(true);
+    }
+
+
+}
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxyFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxyFactory.java
index 3544294..add90c8 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxyFactory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxyFactory.java
@@ -25,11 +25,11 @@ import static org.apache.dubbo.common.constants.CommonConstants.METADATA_REMOTE;
 /**
  *
  */
-public class RemoteMetadataServiceProxyFactory implements MetadataServiceProxyFactory {
+public class RemoteMetadataServiceProxyFactory extends BaseMetadataServiceProxyFactory implements MetadataServiceProxyFactory {
 
     @Override
-    public MetadataService getProxy(ServiceInstance serviceInstance) {
-        return WritableMetadataService.getExtension(METADATA_REMOTE);
+    public MetadataService createProxy(ServiceInstance serviceInstance) {
+        return new RemoteMetadataServiceProxy();
     }
 
 }


[dubbo] 03/03: metadata refactor

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 4549e02caa246941de9a718f147227b308e2cb3e
Author: cvictory <sh...@gmail.com>
AuthorDate: Mon Aug 12 16:59:21 2019 +0800

    metadata refactor
---
 .../apache/dubbo/metadata/MetadataConstants.java   |  1 +
 .../org/apache/dubbo/metadata/MetadataService.java |  4 +-
 .../dubbo/metadata/WritableMetadataService.java    |  2 +-
 .../dubbo/metadata/report/MetadataReport.java      | 11 +++--
 .../metadata/report/MetadataReportInstance.java    |  1 +
 ...java => BaseApplicationMetadataIdentifier.java} | 31 +++---------
 ...ier.java => BaseServiceMetadataIdentifier.java} |  6 ++-
 .../report/identifier/MetadataIdentifier.java      |  2 +-
 .../identifier/ServiceMetadataIdentifier.java      |  2 +-
 .../identifier/SubscriberMetadataIdentifier.java   | 55 ++++++++++++++++++++++
 .../report/support/AbstractMetadataReport.java     | 33 +++++++++----
 .../store/InMemoryWritableMetadataService.java     |  2 +-
 .../store/RemoteWritableMetadataService.java       |  8 ----
 .../report/identifier/MetadataIdentifierTest.java  | 12 ++---
 .../support/AbstractMetadataReportFactoryTest.java | 15 ++++--
 .../report/support/AbstractMetadataReportTest.java | 34 ++++++++-----
 .../metadata/test/JTestMetadataReport4Test.java    | 13 +++--
 .../store/consul/ConsulMetadataReport.java         |  8 +++-
 .../metadata/store/etcd/EtcdMetadataReport.java    |  8 +++-
 .../metadata/store/nacos/NacosMetadataReport.java  |  8 +++-
 .../metadata/store/redis/RedisMetadataReport.java  | 10 +++-
 .../store/zookeeper/ZookeeperMetadataReport.java   | 13 +++--
 .../metadata/RefreshServiceMetadataCustomizer.java |  2 +-
 .../metadata/proxy/MetadataServiceProxy.java       | 11 ++---
 .../metadata/proxy/RemoteMetadataServiceProxy.java | 13 ++---
 .../proxy/RemoteMetadataServiceProxyFactory.java   |  2 +-
 26 files changed, 207 insertions(+), 100 deletions(-)

diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java
index cc4da29..0dcc2d4 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java
@@ -8,4 +8,5 @@ public class MetadataConstants {
     public static final String DEFAULT_PATH_TAG = "metadata";
     public static final String META_DATA_STORE_TAG = ".metaData";
     public static final String SERVICE_META_DATA_STORE_TAG = ".smd";
+    public static final String CONSUMER_META_DATA_STORE_TAG = ".cmd";
 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java
index 71b48d3..490abcb 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java
@@ -88,7 +88,9 @@ public interface MetadataService {
      * @see #toSortedStrings(Stream)
      * @see URL#toFullString()
      */
-    SortedSet<String> getSubscribedURLs();
+    default SortedSet<String> getSubscribedURLs(){
+        throw new UnsupportedOperationException("This operation is not supported for consumer.");
+    }
 
     /**
      * Get the {@link SortedSet sorted set} of String that presents all Dubbo exported {@link URL urls}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/WritableMetadataService.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/WritableMetadataService.java
index 8081ca3..07cd5a5 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/WritableMetadataService.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/WritableMetadataService.java
@@ -64,7 +64,7 @@ public interface WritableMetadataService extends MetadataService {
      *
      * @return If success , return <code>true</code>
      */
-    default boolean refreshExportedMetadata(String revision){
+    default boolean refreshMetadata(String revision){
         return true;
     }
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java
index 63b5385..2a03ce1 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
 import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 
 import java.util.List;
 import java.util.Map;
@@ -34,13 +35,15 @@ public interface MetadataReport {
 
     void storeConsumerMetadata(MetadataIdentifier consumerMetadataIdentifier, Map<String, String> serviceParameterMap);
 
-    void saveServiceMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url);
+    void saveServiceMetadata(URL url);
 
-    void removeServiceMetadata(ServiceMetadataIdentifier serviceMetadataIdentifier, URL url);
+    void removeServiceMetadata(URL url);
 
-    List<String> getExportedURLs(MetadataIdentifier metadataIdentifier);
+    List<String> getExportedURLs(ServiceMetadataIdentifier metadataIdentifier);
 
-    List<String> getSubscribedURLs();
+    void saveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls);
+
+    List<String> getSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier);
 
     String getServiceDefinition(MetadataIdentifier consumerMetadataIdentifier);
 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
index c3418b7..79fc566 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
@@ -31,6 +31,7 @@ public class MetadataReportInstance {
                     .build();
         }
         metadataReport = metadataReportFactory.getMetadataReport(metadataReportURL);
+        init.set(true);
     }
 
     public static MetadataReport getMetadataReport() {
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseMetadataIdentifier.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseApplicationMetadataIdentifier.java
similarity index 55%
copy from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseMetadataIdentifier.java
copy to dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseApplicationMetadataIdentifier.java
index 79f517d..7844e64 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseMetadataIdentifier.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseApplicationMetadataIdentifier.java
@@ -1,21 +1,16 @@
 package org.apache.dubbo.metadata.report.identifier;
 
-import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.utils.StringUtils;
-
-import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;
 import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;
 import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_PATH_TAG;
 import static org.apache.dubbo.metadata.MetadataConstants.KEY_SEPARATOR;
 
 /**
- * @author cvictory ON 2019-08-09
+ * The Base class of MetadataIdentifier for service scope
+ * <p>
+ * 2019-08-09
  */
-public class BaseMetadataIdentifier {
-    String serviceInterface;
-    String version;
-    String group;
-    String side;
+public class BaseApplicationMetadataIdentifier {
+    String application;
 
     String getUniqueKey(MetadataIdentifier.KeyTypeEnum keyType, String... params) {
         if (keyType == MetadataIdentifier.KeyTypeEnum.PATH) {
@@ -26,10 +21,7 @@ public class BaseMetadataIdentifier {
 
     String getIdentifierKey(String... params) {
 
-        return serviceInterface
-                + KEY_SEPARATOR + (version == null ? "" : version)
-                + KEY_SEPARATOR + (group == null ? "" : group)
-                + KEY_SEPARATOR + (side == null ? "" : side)
+        return application
                 + joinParams(KEY_SEPARATOR, params);
     }
 
@@ -51,17 +43,8 @@ public class BaseMetadataIdentifier {
 
     private String getFilePathKey(String pathTag, String... params) {
         return pathTag
-                + (StringUtils.isEmpty(toServicePath()) ? "" : (PATH_SEPARATOR + toServicePath()))
-                + (version == null ? "" : (PATH_SEPARATOR + version))
-                + (group == null ? "" : (PATH_SEPARATOR + group))
-                + (side == null ? "" : (PATH_SEPARATOR + side))
+                + application
                 + joinParams(PATH_SEPARATOR, params);
     }
 
-    private String toServicePath() {
-        if (ANY_VALUE.equals(serviceInterface)) {
-            return "";
-        }
-        return URL.encode(serviceInterface);
-    }
 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseMetadataIdentifier.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseServiceMetadataIdentifier.java
similarity index 94%
rename from dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseMetadataIdentifier.java
rename to dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseServiceMetadataIdentifier.java
index 79f517d..76645cc 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseMetadataIdentifier.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/BaseServiceMetadataIdentifier.java
@@ -9,9 +9,11 @@ import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_PATH_TAG;
 import static org.apache.dubbo.metadata.MetadataConstants.KEY_SEPARATOR;
 
 /**
- * @author cvictory ON 2019-08-09
+ * The Base class of MetadataIdentifier for service scope
+ * <p>
+ * 2019-08-09
  */
-public class BaseMetadataIdentifier {
+public class BaseServiceMetadataIdentifier {
     String serviceInterface;
     String version;
     String group;
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
index 7cdc759..335e3f0 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java
@@ -29,7 +29,7 @@ import static org.apache.dubbo.metadata.MetadataConstants.KEY_SEPARATOR;
  * <p>
  * 2018/10/25
  */
-public class MetadataIdentifier extends BaseMetadataIdentifier {
+public class MetadataIdentifier extends BaseServiceMetadataIdentifier {
 
     private String application;
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/ServiceMetadataIdentifier.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/ServiceMetadataIdentifier.java
index 6b07605..174dcfa 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/ServiceMetadataIdentifier.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/ServiceMetadataIdentifier.java
@@ -13,7 +13,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
  * <p>
  * 2019-08-09
  */
-public class ServiceMetadataIdentifier extends BaseMetadataIdentifier {
+public class ServiceMetadataIdentifier extends BaseServiceMetadataIdentifier {
 
     private String serviceInterface;
     private String version;
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/SubscriberMetadataIdentifier.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/SubscriberMetadataIdentifier.java
new file mode 100644
index 0000000..a227f1e
--- /dev/null
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/SubscriberMetadataIdentifier.java
@@ -0,0 +1,55 @@
+package org.apache.dubbo.metadata.report.identifier;
+
+import org.apache.dubbo.common.URL;
+
+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;
+
+/**
+ *
+ * 2019-08-12
+ */
+public class SubscriberMetadataIdentifier extends BaseApplicationMetadataIdentifier{
+
+    private String revision;
+
+    public SubscriberMetadataIdentifier() {
+    }
+
+    public SubscriberMetadataIdentifier(String application, String revision) {
+        this.application = application;
+        this.revision = revision;
+    }
+
+
+    public SubscriberMetadataIdentifier(URL url) {
+        this.application = url.getParameter(APPLICATION_KEY, "");
+        this.revision = url.getParameter(REVISION_KEY, "");
+    }
+
+    public String getUniqueKey(MetadataIdentifier.KeyTypeEnum keyType) {
+        return super.getUniqueKey(keyType, revision);
+    }
+
+    public String getIdentifierKey() {
+        return super.getIdentifierKey(revision);
+    }
+
+    public String getApplication() {
+        return application;
+    }
+
+    public void setApplication(String application) {
+        this.application = application;
+    }
+
+    public String getRevision() {
+        return revision;
+    }
+
+    public void setRevision(String revision) {
+        this.revision = revision;
+    }
+
+
+}
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
index 5d3576c..c7d34d9 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java
@@ -26,6 +26,7 @@ import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
 import org.apache.dubbo.metadata.report.MetadataReport;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
 import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 
 import com.google.gson.Gson;
 
@@ -285,33 +286,43 @@ public abstract class AbstractMetadataReport implements MetadataReport {
     }
 
     @Override
-    public void saveServiceMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
+    public void saveServiceMetadata(URL url) {
         if (syncReport) {
-            doSaveMetadata(metadataIdentifier, url);
+            doSaveMetadata(new ServiceMetadataIdentifier(url), url);
         } else {
-            reportCacheExecutor.execute(() -> doSaveMetadata(metadataIdentifier, url));
+            reportCacheExecutor.execute(() -> doSaveMetadata(new ServiceMetadataIdentifier(url), url));
         }
     }
 
     @Override
-    public void removeServiceMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
+    public void removeServiceMetadata(URL url) {
         if (syncReport) {
-            doRemoveMetadata(metadataIdentifier, url);
+            doRemoveMetadata(new ServiceMetadataIdentifier(url), url);
         } else {
-            reportCacheExecutor.execute(() -> doRemoveMetadata(metadataIdentifier, url));
+            reportCacheExecutor.execute(() -> doRemoveMetadata(new ServiceMetadataIdentifier(url), url));
         }
     }
 
     @Override
-    public List<String> getExportedURLs(MetadataIdentifier metadataIdentifier) {
+    public List<String> getExportedURLs(ServiceMetadataIdentifier metadataIdentifier) {
         // TODO, fallback to local cache
         return doGetExportedURLs();
     }
 
     @Override
-    public List<String> getSubscribedURLs() {
+    public void saveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls) {
+        if (syncReport) {
+            doSaveSubscriberData(subscriberMetadataIdentifier, urls);
+        } else {
+            reportCacheExecutor.execute(() -> doSaveSubscriberData(subscriberMetadataIdentifier, urls));
+        }
+    }
+
+
+    @Override
+    public List<String> getSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier) {
         // TODO, fallback to local cache
-        return doGetSubscribedURLs();
+        return doGetSubscribedURLs(subscriberMetadataIdentifier);
     }
 
     String getProtocol(URL url) {
@@ -429,6 +440,8 @@ public abstract class AbstractMetadataReport implements MetadataReport {
 
     protected abstract List<String> doGetExportedURLs();
 
-    protected abstract List<String> doGetSubscribedURLs();
+    protected abstract void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls);
+
+    protected abstract List<String> doGetSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier);
 
 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/InMemoryWritableMetadataService.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/InMemoryWritableMetadataService.java
index 50ec417..0f73ebe 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/InMemoryWritableMetadataService.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/InMemoryWritableMetadataService.java
@@ -122,7 +122,7 @@ public class InMemoryWritableMetadataService implements WritableMetadataService
     }
 
     @Override
-    public boolean refreshExportedMetadata(String revision) {
+    public boolean refreshMetadata(String revision) {
         boolean result = true;
         for (SortedSet<URL> urls : exportedServiceURLs.values()) {
             Iterator<URL> iterator = urls.iterator();
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/RemoteWritableMetadataService.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/RemoteWritableMetadataService.java
index e7144ef..79090b1 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/RemoteWritableMetadataService.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/RemoteWritableMetadataService.java
@@ -53,14 +53,6 @@ public class RemoteWritableMetadataService extends InMemoryWritableMetadataServi
 
     protected final Logger logger = LoggerFactory.getLogger(getClass());
 
-
-    private AtomicBoolean init;
-
-    public RemoteWritableMetadataService() {
-
-    }
-
-
     public MetadataReport getMetadataReport() {
         return MetadataReportInstance.getMetadataReport(true);
     }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java
index 3d2823f..cb19880 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java
@@ -14,9 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metadata.identifier;
+package org.apache.dubbo.metadata.report.identifier;
 
-import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.MetadataConstants;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier.KeyTypeEnum;
 
 import org.junit.jupiter.api.Assertions;
@@ -43,9 +43,9 @@ public class MetadataIdentifierTest {
                         + (group == null ? "" : (group + PATH_SEPARATOR)) + PROVIDER_SIDE
                         + PATH_SEPARATOR + application);
         Assertions.assertEquals(providerMetadataIdentifier.getUniqueKey(MetadataIdentifier.KeyTypeEnum.UNIQUE_KEY),
-                interfaceName + MetadataIdentifier.SEPARATOR +
-                        (version == null ? "" : version) + MetadataIdentifier.SEPARATOR
-                        + (group == null ? "" : group) + MetadataIdentifier.SEPARATOR
-                        + PROVIDER_SIDE + MetadataIdentifier.SEPARATOR + application);
+                interfaceName + MetadataConstants.KEY_SEPARATOR +
+                        (version == null ? "" : version) + MetadataConstants.KEY_SEPARATOR
+                        + (group == null ? "" : group) + MetadataConstants.KEY_SEPARATOR
+                        + PROVIDER_SIDE + MetadataConstants.KEY_SEPARATOR + application);
     }
 }
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactoryTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactoryTest.java
index 1dfc4e7..31fb771 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactoryTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactoryTest.java
@@ -21,6 +21,8 @@ import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.metadata.definition.model.ServiceDefinition;
 import org.apache.dubbo.metadata.report.MetadataReport;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 
 import com.alibaba.fastjson.JSON;
 import org.junit.jupiter.api.Assertions;
@@ -46,22 +48,27 @@ public class AbstractMetadataReportFactoryTest {
                 }
 
                 @Override
-                public void saveMetadata(URL url) {
+                public void saveServiceMetadata(URL url) {
 
                 }
 
                 @Override
-                public void removeMetadata(URL url) {
+                public void removeServiceMetadata(URL url) {
 
                 }
 
                 @Override
-                public List<String> getExportedURLs(MetadataIdentifier metadataIdentifier) {
+                public List<String> getExportedURLs(ServiceMetadataIdentifier metadataIdentifier) {
                     return null;
                 }
 
                 @Override
-                public List<String> getSubscribedURLs() {
+                public void saveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls) {
+
+                }
+
+                @Override
+                public List<String> getSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier) {
                     return null;
                 }
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportTest.java
index bef9c85..b5bd687 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportTest.java
@@ -21,6 +21,8 @@ import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;
 import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 
 import com.google.gson.Gson;
 import org.junit.jupiter.api.Assertions;
@@ -114,7 +116,7 @@ public class AbstractMetadataReportTest {
         retryReport.metadataReportRetry.retryPeriod = 400L;
         URL url = URL.valueOf("dubbo://" + NetUtils.getLocalAddress().getHostName() + ":4444/org.apache.dubbo.TestService?version=1.0.0&application=vic");
         Assertions.assertNull(retryReport.metadataReportRetry.retryScheduledFuture);
-        Assertions.assertEquals(0,retryReport.metadataReportRetry.retryCounter.get());
+        Assertions.assertEquals(0, retryReport.metadataReportRetry.retryCounter.get());
         Assertions.assertTrue(retryReport.store.isEmpty());
         Assertions.assertTrue(retryReport.failedReports.isEmpty());
 
@@ -158,7 +160,7 @@ public class AbstractMetadataReportTest {
         URL url = URL.valueOf("xxx://" + NetUtils.getLocalAddress().getHostName() + ":4444/" + interfaceName + "?version=" + version + "&application="
                 + application + (group == null ? "" : "&group=" + group) + "&testPKey=8989");
 
-        MetadataIdentifier providerMetadataIdentifier = new MetadataIdentifier(interfaceName, version, group, PROVIDER_SIDE,application);
+        MetadataIdentifier providerMetadataIdentifier = new MetadataIdentifier(interfaceName, version, group, PROVIDER_SIDE, application);
         Class interfaceClass = Class.forName(interfaceName);
         FullServiceDefinition fullServiceDefinition = ServiceDefinitionBuilder.buildFullDefinition(interfaceClass, url.getParameters());
 
@@ -208,16 +210,16 @@ public class AbstractMetadataReportTest {
         Map tmpMapResult = (Map) abstractMetadataReport.allMetadataReports.get(consumerMetadataIdentifier);
         Assertions.assertEquals(tmpMapResult.get("testPKey"), "9090");
         Assertions.assertEquals(tmpMapResult.get("testKey"), "value");
-        Assertions.assertEquals(3,abstractMetadataReport.store.size());
+        Assertions.assertEquals(3, abstractMetadataReport.store.size());
 
         abstractMetadataReport.store.clear();
 
-        Assertions.assertEquals(0,abstractMetadataReport.store.size());
+        Assertions.assertEquals(0, abstractMetadataReport.store.size());
 
         abstractMetadataReport.publishAll();
         Thread.sleep(200);
 
-        Assertions.assertEquals(3,abstractMetadataReport.store.size());
+        Assertions.assertEquals(3, abstractMetadataReport.store.size());
 
         String v = abstractMetadataReport.store.get(providerMetadataIdentifier1.getUniqueKey(MetadataIdentifier.KeyTypeEnum.UNIQUE_KEY));
         Gson gson = new Gson();
@@ -290,12 +292,12 @@ public class AbstractMetadataReportTest {
         }
 
         @Override
-        protected void doSaveMetadata(URL url) {
+        protected void doSaveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
             throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
         }
 
         @Override
-        protected void doRemoveMetadata(URL url) {
+        protected void doRemoveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
             throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
         }
 
@@ -305,7 +307,12 @@ public class AbstractMetadataReportTest {
         }
 
         @Override
-        protected List<String> doGetSubscribedURLs() {
+        protected void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls) {
+
+        }
+
+        @Override
+        protected List<String> doGetSubscribedURLs(SubscriberMetadataIdentifier metadataIdentifier) {
             throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
         }
 
@@ -346,12 +353,12 @@ public class AbstractMetadataReportTest {
         }
 
         @Override
-        protected void doSaveMetadata(URL url) {
+        protected void doSaveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
             throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
         }
 
         @Override
-        protected void doRemoveMetadata(URL url) {
+        protected void doRemoveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
             throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
         }
 
@@ -361,7 +368,12 @@ public class AbstractMetadataReportTest {
         }
 
         @Override
-        protected List<String> doGetSubscribedURLs() {
+        protected void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls) {
+
+        }
+
+        @Override
+        protected List<String> doGetSubscribedURLs(SubscriberMetadataIdentifier metadataIdentifier) {
             throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
         }
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/test/JTestMetadataReport4Test.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/test/JTestMetadataReport4Test.java
index 603a27f..941d098 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/test/JTestMetadataReport4Test.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/test/JTestMetadataReport4Test.java
@@ -20,6 +20,8 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 
 import java.util.List;
@@ -60,12 +62,12 @@ public class JTestMetadataReport4Test extends AbstractMetadataReport {
     }
 
     @Override
-    protected void doSaveMetadata(URL url) {
+    protected void doSaveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
     @Override
-    protected void doRemoveMetadata(URL url) {
+    protected void doRemoveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
@@ -75,7 +77,12 @@ public class JTestMetadataReport4Test extends AbstractMetadataReport {
     }
 
     @Override
-    protected List<String> doGetSubscribedURLs() {
+    protected void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls) {
+
+    }
+
+    @Override
+    protected List<String> doGetSubscribedURLs(SubscriberMetadataIdentifier metadataIdentifier) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
diff --git a/dubbo-metadata/dubbo-metadata-report-consul/src/main/java/org/apache/dubbo/metadata/store/consul/ConsulMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-consul/src/main/java/org/apache/dubbo/metadata/store/consul/ConsulMetadataReport.java
index 3c84263..5d5eac7 100644
--- a/dubbo-metadata/dubbo-metadata-report-consul/src/main/java/org/apache/dubbo/metadata/store/consul/ConsulMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-consul/src/main/java/org/apache/dubbo/metadata/store/consul/ConsulMetadataReport.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
 import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 import org.apache.dubbo.rpc.RpcException;
 
@@ -72,7 +73,12 @@ public class ConsulMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
-    protected List<String> doGetSubscribedURLs() {
+    protected void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls) {
+
+    }
+
+    @Override
+    protected List<String> doGetSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
diff --git a/dubbo-metadata/dubbo-metadata-report-etcd/src/main/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-etcd/src/main/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReport.java
index 30609fb..350eb77 100644
--- a/dubbo-metadata/dubbo-metadata-report-etcd/src/main/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-etcd/src/main/java/org/apache/dubbo/metadata/store/etcd/EtcdMetadataReport.java
@@ -38,6 +38,7 @@ import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
 import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 import org.apache.dubbo.remoting.etcd.jetcd.JEtcdClient;
 
@@ -99,7 +100,12 @@ public class EtcdMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
-    protected List<String> doGetSubscribedURLs() {
+    protected void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls) {
+
+    }
+
+    @Override
+    protected List<String> doGetSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
diff --git a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
index bdaadeb..a533774 100644
--- a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReport.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
 import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 import org.apache.dubbo.rpc.RpcException;
 
@@ -140,7 +141,12 @@ public class NacosMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
-    protected List<String> doGetSubscribedURLs() {
+    protected void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls) {
+        throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
+    }
+
+    @Override
+    protected List<String> doGetSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier) {
         throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
diff --git a/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
index 8232b44..91d6771 100644
--- a/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
 import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 import org.apache.dubbo.rpc.RpcException;
 
@@ -95,8 +96,13 @@ public class RedisMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
-    protected List<String> doGetSubscribedURLs() {
-        return null;
+    protected void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls) {
+        throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
+    }
+
+    @Override
+    protected List<String> doGetSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier) {
+        throw new UnsupportedOperationException("This extension does not support working as a remote metadata center.");
     }
 
     @Override
diff --git a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
index 5649933..8c1c86c 100644
--- a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
@@ -20,6 +20,8 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperClient;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
@@ -71,12 +73,12 @@ public class ZookeeperMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
-    protected void doSaveMetadata(URL url) {
+    protected void doSaveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
 //        zkClient.create(, URL.encode(url.toFullString()));
     }
 
     @Override
-    protected void doRemoveMetadata(URL url) {
+    protected void doRemoveMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url) {
 
     }
 
@@ -86,7 +88,12 @@ public class ZookeeperMetadataReport extends AbstractMetadataReport {
     }
 
     @Override
-    protected List<String> doGetSubscribedURLs() {
+    protected void doSaveSubscriberData(SubscriberMetadataIdentifier subscriberMetadataIdentifier, List<String> urls) {
+
+    }
+
+    @Override
+    protected List<String> doGetSubscribedURLs(SubscriberMetadataIdentifier subscriberMetadataIdentifier) {
         return null;
     }
 
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RefreshServiceMetadataCustomizer.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RefreshServiceMetadataCustomizer.java
index 93cc9b5..5b2622e 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RefreshServiceMetadataCustomizer.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RefreshServiceMetadataCustomizer.java
@@ -19,6 +19,6 @@ public class RefreshServiceMetadataCustomizer implements ServiceInstanceCustomiz
         // FIXME to define the constant
         WritableMetadataService remoteWritableMetadataService =
                 WritableMetadataService.getExtension(serviceInstance.getMetadata().getOrDefault("", DEFAULT_KEY));
-        remoteWritableMetadataService.refreshExportedMetadata(serviceInstance.getMetadata().get(EXPORTED_SERVICES_REVISION_KEY));
+        remoteWritableMetadataService.refreshMetadata(serviceInstance.getMetadata().get(EXPORTED_SERVICES_REVISION_KEY));
     }
 }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxy.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxy.java
index 018460e..a5b7384 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxy.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxy.java
@@ -64,11 +64,6 @@ public class MetadataServiceProxy implements MetadataService {
     }
 
     @Override
-    public SortedSet<String> getSubscribedURLs() {
-        return doInMetadataService(MetadataService::getSubscribedURLs);
-    }
-
-    @Override
     public SortedSet<String> getExportedURLs(String serviceInterface, String group, String version, String protocol) {
         return doInMetadataService(metadataService ->
                 metadataService.getExportedURLs(serviceInterface, group, version, protocol));
@@ -76,12 +71,14 @@ public class MetadataServiceProxy implements MetadataService {
 
     @Override
     public String getServiceDefinition(String interfaceName, String version, String group) {
-        return null;
+        return doInMetadataService(metadataService ->
+                metadataService.getServiceDefinition(interfaceName, version, group));
     }
 
     @Override
     public String getServiceDefinition(String serviceKey) {
-        return null;
+        return doInMetadataService(metadataService ->
+                metadataService.getServiceDefinition(serviceKey));
     }
 
     protected <T> T doInMetadataService(Function<MetadataService, T> callback) {
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxy.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxy.java
index 2c661b9..4976de9 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxy.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxy.java
@@ -7,6 +7,8 @@ import org.apache.dubbo.metadata.MetadataService;
 import org.apache.dubbo.metadata.report.MetadataReport;
 import org.apache.dubbo.metadata.report.MetadataReportInstance;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 import org.apache.dubbo.registry.client.ServiceInstance;
 
 import java.util.Collection;
@@ -15,6 +17,7 @@ import java.util.SortedSet;
 import java.util.TreeSet;
 
 import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;
+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;
 
 /**
  * 2019-08-09
@@ -23,10 +26,13 @@ public class RemoteMetadataServiceProxy implements MetadataService {
     protected final Logger logger = LoggerFactory.getLogger(getClass());
 
     private String serviceName;
+    // FIXME this is provider revison. it also need consumer revison.
+    private String revision;
 
 
     public RemoteMetadataServiceProxy(ServiceInstance serviceInstance) {
         this.serviceName = serviceInstance.getServiceName();
+        this.revision = serviceInstance.getMetadata().getOrDefault(REVISION_KEY, "");
     }
 
     @Override
@@ -34,15 +40,10 @@ public class RemoteMetadataServiceProxy implements MetadataService {
         return serviceName;
     }
 
-    @Override
-    public SortedSet<String> getSubscribedURLs() {
-        return toSortedStrings(getMetadataReport().getSubscribedURLs());
-    }
-
     // TODO, protocol should be used
     @Override
     public SortedSet<String> getExportedURLs(String serviceInterface, String group, String version, String protocol) {
-        return toSortedStrings(getMetadataReport().getExportedURLs(new MetadataIdentifier(serviceInterface, group, version, null, null)));
+        return toSortedStrings(getMetadataReport().getExportedURLs(new ServiceMetadataIdentifier(serviceInterface, group, version, PROVIDER_SIDE, revision)));
     }
 
     private static SortedSet<String> toSortedStrings(Collection<String> values) {
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxyFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxyFactory.java
index add90c8..a4815be 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxyFactory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxyFactory.java
@@ -29,7 +29,7 @@ public class RemoteMetadataServiceProxyFactory extends BaseMetadataServiceProxyF
 
     @Override
     public MetadataService createProxy(ServiceInstance serviceInstance) {
-        return new RemoteMetadataServiceProxy();
+        return new RemoteMetadataServiceProxy(serviceInstance);
     }
 
 }


[dubbo] 02/03: Merge branch 'cloud-native' of github.com:apache/incubator-dubbo into cloud-native

Posted by vi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 6136eea12a60e1c4dc84255f6aa23390a61cab01
Merge: a09ba30 35e3aea
Author: cvictory <sh...@gmail.com>
AuthorDate: Mon Aug 12 09:57:37 2019 +0800

    Merge branch 'cloud-native' of github.com:apache/incubator-dubbo into cloud-native

 .../org/apache/dubbo/bootstrap/DubboBootstrap.java |  83 ++++++++-
 .../dubbo/config/AbstractInterfaceConfig.java      |  15 +-
 .../dubbo/config/AbstractReferenceConfig.java      |   4 +-
 .../apache/dubbo/config/AbstractServiceConfig.java |   2 -
 .../org/apache/dubbo/config/ReferenceConfig.java   |  11 +-
 .../org/apache/dubbo/config/ServiceConfig.java     |  19 ++
 .../apache/dubbo/config/context/ConfigManager.java |  13 ++
 dubbo-config/dubbo-config-spring/pom.xml           |  11 ++
 .../dubbo/config/spring/ApplicationBean.java       |  89 +++++++++
 .../apache/dubbo/config/spring/ReferenceBean.java  | 163 +---------------
 .../apache/dubbo/config/spring/ServiceBean.java    | 206 ---------------------
 .../spring/schema/DubboNamespaceHandler.java       |  13 +-
 .../consumer/DemoServiceConsumerBootstrap.java     |   6 +-
 .../consumer/DemoServiceConsumerXmlBootstrap.java  |   6 +-
 .../provider/DemoServiceProviderBootstrap.java     |   7 +-
 .../provider/DemoServiceProviderXmlBootstrap.java  |   8 +-
 .../nacos}/demo/service/DefaultService.java        |   2 +-
 .../registry/nacos}/demo/service/DemoService.java  |   2 +-
 .../nacos}/nacos/NacosServiceNameTest.java         |   8 +-
 .../spring/dubbo-nacos-consumer-context.xml        |   0
 .../spring/dubbo-nacos-provider-context.xml        |   0
 .../resources/nacos-consumer-config.properties     |   0
 .../resources/nacos-provider-config.properties     |   0
 .../support/etcd/EtcdDynamicConfigurationTest.java |   4 +-
 .../dubbo-demo-api/dubbo-demo-api-provider/pom.xml |   4 +
 .../consul/ConsulServiceDiscoveryFactory.java      |   6 +-
 dubbo-registry/dubbo-registry-nacos/pom.xml        |  10 -
 27 files changed, 268 insertions(+), 424 deletions(-)