From 6dfddbfb2b32029272499735598cbcd80035c319 Mon Sep 17 00:00:00 2001 From: namelessssssssssss <100946116+namelessssssssssss@users.noreply.github.com> Date: Thu, 30 Nov 2023 19:19:29 +0800 Subject: [PATCH] Fix issue of metadata only registred to one nacos namespace (3.2.x) (#13439) * Fix nacos metadata namespace * Fix code style --------- Co-authored-by: nameless --- .../dubbo/metadata/MetadataConstants.java | 2 ++ .../report/MetadataReportInstance.java | 18 ++++++++++++++---- .../support/AbstractMetadataReportFactory.java | 6 +++++- .../nacos/NacosMetadataReportFactory.java | 14 ++++++++++++++ 4 files changed, 35 insertions(+), 5 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 8b808d7b24..d4e0f33e2d 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 @@ -28,4 +28,6 @@ public interface MetadataConstants { String REPORT_CONSUMER_URL_KEY = "report-consumer-definition"; String PATH_SEPARATOR = "/"; + + String NAMESPACE_KEY = "namespace"; } 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 3fd14dff0b..ded589b471 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 @@ -19,6 +19,7 @@ package org.apache.dubbo.metadata.report; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URLBuilder; import org.apache.dubbo.common.resource.Disposable; +import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.config.MetadataReportConfig; import org.apache.dubbo.metadata.report.support.NopMetadataReport; import org.apache.dubbo.rpc.model.ApplicationModel; @@ -35,6 +36,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA import static org.apache.dubbo.common.constants.CommonConstants.PORT_KEY; import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_LOCAL_FILE_CACHE_ENABLED; import static org.apache.dubbo.common.utils.StringUtils.isEmpty; +import static org.apache.dubbo.metadata.MetadataConstants.NAMESPACE_KEY; import static org.apache.dubbo.metadata.report.support.Constants.METADATA_REPORT_KEY; /** @@ -102,18 +104,26 @@ public class MetadataReportInstance implements Disposable { url = url.addParameterIfAbsent( REGISTRY_LOCAL_FILE_CACHE_ENABLED, String.valueOf(applicationModel.getCurrentConfig().getEnableFileCache())); - String relatedRegistryId = isEmpty(config.getRegistry()) - ? (isEmpty(config.getId()) ? DEFAULT_KEY : config.getId()) - : config.getRegistry(); // RegistryConfig registryConfig = applicationModel.getConfigManager().getRegistry(relatedRegistryId) // .orElseThrow(() -> new IllegalStateException("Registry id " + relatedRegistryId + " does not // exist.")); MetadataReport metadataReport = metadataReportFactory.getMetadataReport(url); if (metadataReport != null) { - metadataReports.put(relatedRegistryId, metadataReport); + metadataReports.put(getRelatedRegistryId(config, url), metadataReport); } } + private String getRelatedRegistryId(MetadataReportConfig config, URL url) { + String relatedRegistryId = isEmpty(config.getRegistry()) + ? (isEmpty(config.getId()) ? DEFAULT_KEY : config.getId()) + : config.getRegistry(); + String namespace = url.getParameter(NAMESPACE_KEY); + if (!StringUtils.isEmpty(namespace)) { + relatedRegistryId += ":" + namespace; + } + return relatedRegistryId; + } + public Map getMetadataReports(boolean checked) { return metadataReports; } diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactory.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactory.java index e0d156773d..7f1770291f 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactory.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReportFactory.java @@ -50,7 +50,7 @@ public abstract class AbstractMetadataReportFactory implements MetadataReportFac @Override public MetadataReport getMetadataReport(URL url) { url = url.setPath(MetadataReport.class.getName()).removeParameters(EXPORT_KEY, REFER_KEY); - String key = url.toServiceString(); + String key = toMetadataReportKey(url); MetadataReport metadataReport = serviceStoreMap.get(key); if (metadataReport != null) { @@ -88,6 +88,10 @@ public abstract class AbstractMetadataReportFactory implements MetadataReportFac } } + protected String toMetadataReportKey(URL url) { + return url.toServiceString(); + } + @Override public void destroy() { lock.lock(); diff --git a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReportFactory.java b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReportFactory.java index a858a0a1b1..338b4067b7 100644 --- a/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReportFactory.java +++ b/dubbo-metadata/dubbo-metadata-report-nacos/src/main/java/org/apache/dubbo/metadata/store/nacos/NacosMetadataReportFactory.java @@ -17,9 +17,12 @@ package org.apache.dubbo.metadata.store.nacos; import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.metadata.report.MetadataReport; import org.apache.dubbo.metadata.report.support.AbstractMetadataReportFactory; +import static org.apache.dubbo.metadata.MetadataConstants.NAMESPACE_KEY; + /** * metadata report factory impl for nacos */ @@ -28,4 +31,15 @@ public class NacosMetadataReportFactory extends AbstractMetadataReportFactory { protected MetadataReport createMetadataReport(URL url) { return new NacosMetadataReport(url); } + + @Override + protected String toMetadataReportKey(URL url) { + String namespace = url.getParameter(NAMESPACE_KEY); + if (!StringUtils.isEmpty(namespace)) { + return URL.valueOf(url.toServiceString()) + .addParameter(NAMESPACE_KEY, namespace) + .toString(); + } + return super.toMetadataReportKey(url); + } }