You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2022/01/07 03:34:44 UTC

[dubbo] branch 3.0 updated: fix meta service definition (#9540)

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

liujun pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new cdf3452  fix meta service definition (#9540)
cdf3452 is described below

commit cdf3452052372f500928c8f394e965c22f726160
Author: ken.lj <ke...@gmail.com>
AuthorDate: Fri Jan 7 11:34:32 2022 +0800

    fix meta service definition (#9540)
---
 .../org/apache/dubbo/config/ReferenceConfig.java   |  2 +
 .../org/apache/dubbo/config/ServiceConfig.java     |  6 +--
 .../registry/client/metadata/MetadataUtils.java    | 46 ++++++++++++++++------
 3 files changed, 38 insertions(+), 16 deletions(-)

diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index 03875d9..0632cd3 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
@@ -33,6 +33,7 @@ import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.support.Parameter;
 import org.apache.dubbo.config.utils.ConfigValidationUtils;
 import org.apache.dubbo.metadata.ServiceNameMapping;
+import org.apache.dubbo.registry.client.metadata.MetadataUtils;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.ProxyFactory;
@@ -402,6 +403,7 @@ public class ReferenceConfig<T> extends ReferenceConfigBase<T> {
             referenceParameters.get(INTERFACE_KEY), referenceParameters);
         consumerUrl = consumerUrl.setScopeModel(getScopeModel());
         consumerUrl = consumerUrl.setServiceModel(consumerModel);
+        MetadataUtils.publishServiceDefinition(interfaceName, consumerUrl, getScopeModel(), getApplicationModel());
 
         // create service proxy
         return (T) proxyFactory.getProxy(invoker, ProtocolUtils.isGeneric(generic));
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index 9dc68a9..b0596fc 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
@@ -571,11 +571,7 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> {
                 if (!isGeneric(generic) && !isMetadataService(interfaceName)) {
                     ServiceDescriptor descriptor = getScopeModel().getServiceRepository().getService(interfaceName);
                     if (descriptor != null) {
-                        MetadataUtils.publishServiceDefinition(
-                            getScopeModel().getServiceRepository().getService(interfaceName),
-                            version == null ? "" : version,
-                            group == null ? "" : group,
-                            getApplicationModel());
+                        MetadataUtils.publishServiceDefinition(interfaceName, url, getScopeModel(), getApplicationModel());
                     }
                 }
             }
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java
index ffbbb95..694c999 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java
@@ -34,6 +34,7 @@ import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.Protocol;
 import org.apache.dubbo.rpc.ProxyFactory;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.ModuleModel;
 import org.apache.dubbo.rpc.model.ScopeModel;
 import org.apache.dubbo.rpc.model.ServiceDescriptor;
 
@@ -43,6 +44,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;
 import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;
 import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;
 import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;
@@ -63,29 +65,51 @@ public class MetadataUtils {
         return metadataServiceProxies.computeIfAbsent(computeKey(instance), k -> referProxy(k, instance));
     }
 
-    public static void publishServiceDefinition(ServiceDescriptor serviceDescriptor, String version, String group, ApplicationModel applicationModel) {
+    public static void publishServiceDefinition(String serviceName, URL url, ModuleModel scopeModel, ApplicationModel applicationModel) {
         if (getMetadataReports(applicationModel).size() == 0) {
             String msg = "Remote Metadata Report Server not hasn't been configured or unavailable . Unable to get Metadata from remote!";
             logger.warn(msg);
         }
 
-        String serviceName = serviceDescriptor.getServiceName();
-        FullServiceDefinition serviceDefinition = serviceDescriptor.getServiceDefinition(serviceName);
-
         try {
-            if (StringUtils.isNotEmpty(serviceName)) {
+            String side = url.getSide();
+            if (PROVIDER_SIDE.equalsIgnoreCase(side)) {
+                ServiceDescriptor serviceDescriptor = scopeModel.getServiceRepository().getService(serviceName);
+                if (serviceDescriptor == null) {
+                    return;
+                }
+                FullServiceDefinition serviceDefinition = serviceDescriptor.getServiceDefinition(serviceName);
+
+                if (StringUtils.isNotEmpty(serviceName) && serviceDefinition != null) {
+                    serviceDefinition.setParameters(url.getParameters());
+                    for (Map.Entry<String, MetadataReport> entry : getMetadataReports(applicationModel).entrySet()) {
+                        MetadataReport metadataReport = entry.getValue();
+                        metadataReport.storeProviderMetadata(
+                            new MetadataIdentifier(
+                                serviceName,
+                                url.getVersion() == null ? "" : url.getVersion(),
+                                url.getGroup() == null ? "" : url.getGroup(),
+                                PROVIDER_SIDE,
+                                applicationModel.getApplicationName())
+                            , serviceDefinition);
+                    }
+                }
+            } else {
                 for (Map.Entry<String, MetadataReport> entry : getMetadataReports(applicationModel).entrySet()) {
                     MetadataReport metadataReport = entry.getValue();
-                    metadataReport.storeProviderMetadata(new MetadataIdentifier(serviceName,
-                        version, group,
-                        PROVIDER_SIDE, applicationModel.getApplicationName()), serviceDefinition);
+                    metadataReport.storeConsumerMetadata(
+                        new MetadataIdentifier(
+                            serviceName,
+                            url.getVersion() == null ? "" : url.getVersion(),
+                            url.getGroup() == null ? "" : url.getGroup(),
+                            CONSUMER_SIDE,
+                            applicationModel.getApplicationName()),
+                        url.getParameters());
                 }
-                return;
             }
-            logger.error("publishProvider interfaceName is empty.");
         } catch (Exception e) {
             //ignore error
-            logger.error("publishProvider getServiceDescriptor error.", e);
+            logger.error("publish service definition metadata error.", e);
         }
     }