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 ef8cdfc redefine MetadataReport ef8cdfc is described below commit ef8cdfcf49ca73d3cb31bf594526311d3eabe664 Author: ken.lj <ken.lj...@gmail.com> AuthorDate: Tue Jun 16 00:38:33 2020 +0800 redefine MetadataReport --- .../src/main/java/org/apache/dubbo/common/URL.java | 11 ++- .../dubbo/common/constants/CommonConstants.java | 6 ++ .../org/apache/dubbo/config/ServiceConfig.java | 7 +- .../event/listener/ServiceNameMappingListener.java | 55 ------------- .../metadata/DefaultMetadataParamsFilter.java | 3 +- .../DynamicConfigurationServiceNameMapping.java | 33 ++++---- .../org/apache/dubbo/metadata/MetadataInfo.java | 5 +- .../dubbo/metadata/MetadataServiceNameMapping.java | 71 +++++++++++++++++ .../apache/dubbo/metadata/ServiceNameMapping.java | 33 +++++--- .../dubbo/metadata/report/MetadataReport.java | 27 +++++-- .../org.apache.dubbo.metadata.ServiceNameMapping | 3 +- ...DynamicConfigurationServiceNameMappingTest.java | 90 ---------------------- .../apache/dubbo/metadata/MetadataInfoTest.java | 2 +- .../registry/client/DefaultServiceInstance.java | 2 +- .../registry/client/ServiceDiscoveryRegistry.java | 27 +------ .../listener/ServiceInstancesChangedListener.java | 6 +- .../registry/client/metadata/MetadataUtils.java | 1 - .../store/InMemoryWritableMetadataService.java | 3 +- 18 files changed, 172 insertions(+), 213 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java index e605643..e28cf12 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java @@ -793,6 +793,15 @@ class URL implements Serializable { return URL.decode(getMethodParameter(method, key, defaultValue)); } + public String getMethodParameterStrict(String method, String key) { + Map<String, String> keyMap = methodParameters.get(method); + String value = null; + if (keyMap != null) { + value = keyMap.get(key); + } + return value; + } + public String getMethodParameter(String method, String key) { Map<String, String> keyMap = methodParameters.get(method); String value = null; @@ -984,7 +993,7 @@ class URL implements Serializable { } return false; } - String value = getMethodParameter(method, key); + String value = getMethodParameterStrict(method, key); return StringUtils.isNotEmpty(value); } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java index cac52fe..c63ce71 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java @@ -183,6 +183,12 @@ public interface CommonConstants { String METADATA_KEY = "metadata-type"; + String MAPPING_KEY = "mapping-type"; + + String CONFIG_MAPPING_TYPE = "config"; + + String METADATA_MAPPING_TYPE = "metadata"; + String DEFAULT_METADATA_STORAGE_TYPE = "local"; String REMOTE_METADATA_STORAGE_TYPE = "remote"; 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 68dc97a..b279e67 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 @@ -37,6 +37,7 @@ import org.apache.dubbo.config.support.Parameter; import org.apache.dubbo.config.utils.ConfigValidationUtils; import org.apache.dubbo.event.Event; import org.apache.dubbo.event.EventDispatcher; +import org.apache.dubbo.metadata.ServiceNameMapping; import org.apache.dubbo.registry.client.metadata.MetadataUtils; import org.apache.dubbo.rpc.Exporter; import org.apache.dubbo.rpc.Invoker; @@ -71,6 +72,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE; import static org.apache.dubbo.common.constants.CommonConstants.DUBBO; import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_IP_TO_BIND; import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE; +import static org.apache.dubbo.common.constants.CommonConstants.MAPPING_KEY; import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY; import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY; import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY; @@ -209,7 +211,10 @@ public class ServiceConfig<T> extends ServiceConfigBase<T> { } public void exported() { - + List<URL> exportedURLs = this.getExportedUrls(); + exportedURLs.forEach(url -> { + ServiceNameMapping.getExtension(getApplication().getParameters().get(MAPPING_KEY)).map(url); + }); // dispatch a ServiceConfigExportedEvent since 2.7.4 dispatch(new ServiceConfigExportedEvent(this)); } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/event/listener/ServiceNameMappingListener.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/event/listener/ServiceNameMappingListener.java deleted file mode 100644 index 4dcfde3..0000000 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/event/listener/ServiceNameMappingListener.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.dubbo.config.event.listener; - -import org.apache.dubbo.common.URL; -import org.apache.dubbo.config.ServiceConfig; -import org.apache.dubbo.config.event.ServiceConfigExportedEvent; -import org.apache.dubbo.event.EventListener; -import org.apache.dubbo.metadata.ServiceNameMapping; - -import java.util.List; - -import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; -import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; -import static org.apache.dubbo.metadata.ServiceNameMapping.getDefaultExtension; - -/** - * An {@link EventListener event listener} for mapping {@link ServiceConfig#getExportedUrls() the exported Dubbo - * service inerface} to its service name - * - * @see ServiceNameMapping - * @see ServiceConfig#getExportedUrls() - * @since 2.7.5 - */ -public class ServiceNameMappingListener implements EventListener<ServiceConfigExportedEvent> { - - private final ServiceNameMapping serviceNameMapping = getDefaultExtension(); - - @Override - public void onEvent(ServiceConfigExportedEvent event) { - ServiceConfig serviceConfig = event.getServiceConfig(); - List<URL> exportedURLs = serviceConfig.getExportedUrls(); - exportedURLs.forEach(url -> { - String serviceInterface = url.getServiceInterface(); - String group = url.getParameter(GROUP_KEY); - String version = url.getParameter(VERSION_KEY); - String protocol = url.getProtocol(); - serviceNameMapping.map(serviceInterface, group, version, protocol); - }); - } -} diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DefaultMetadataParamsFilter.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DefaultMetadataParamsFilter.java index 0563e43..7a11096 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DefaultMetadataParamsFilter.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DefaultMetadataParamsFilter.java @@ -25,7 +25,6 @@ import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY; import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY; import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_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.remoting.Constants.CODEC_KEY; import static org.apache.dubbo.remoting.Constants.CONNECTIONS_KEY; @@ -44,7 +43,7 @@ public class DefaultMetadataParamsFilter implements MetadataParamsFilter { return new String[]{ CODEC_KEY, EXCHANGER_KEY, SERIALIZATION_KEY, CLUSTER_KEY, CONNECTIONS_KEY, DEPRECATED_KEY, GROUP_KEY, LOADBALANCE_KEY, MOCK_KEY, PATH_KEY, TIMEOUT_KEY, TOKEN_KEY, VERSION_KEY, WARMUP_KEY, - WEIGHT_KEY, TIMESTAMP_KEY, DUBBO_VERSION_KEY, RELEASE_KEY + WEIGHT_KEY, DUBBO_VERSION_KEY, RELEASE_KEY }; } } 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 d84eba0..a25d07a 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 @@ -16,6 +16,7 @@ */ package org.apache.dubbo.metadata; +import org.apache.dubbo.common.URL; import org.apache.dubbo.common.config.configcenter.DynamicConfiguration; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; @@ -27,7 +28,8 @@ import java.util.Set; import static java.lang.String.valueOf; import static java.util.Arrays.asList; -import static org.apache.dubbo.common.utils.StringUtils.SLASH; +import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; import static org.apache.dubbo.rpc.model.ApplicationModel.getName; /** @@ -42,7 +44,11 @@ public class DynamicConfigurationServiceNameMapping implements ServiceNameMappin private final Logger logger = LoggerFactory.getLogger(getClass()); @Override - public void map(String serviceInterface, String group, String version, String protocol) { + public void map(URL url) { + String serviceInterface = url.getServiceInterface(); + String group = url.getParameter(GROUP_KEY); + String version = url.getParameter(VERSION_KEY); + String protocol = url.getProtocol(); if (IGNORED_SERVICE_INTERFACES.contains(serviceInterface)) { return; @@ -55,8 +61,9 @@ public class DynamicConfigurationServiceNameMapping implements ServiceNameMappin // It does matter whatever the content is, we just need a record String key = getName(); String content = valueOf(System.currentTimeMillis()); + execute(() -> { - dynamicConfiguration.publishConfig(key, buildGroup(serviceInterface, group, version, protocol), content); + dynamicConfiguration.publishConfig(key, ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol), content); if (logger.isInfoEnabled()) { logger.info(String.format("Dubbo service[%s] mapped to interface name[%s].", group, serviceInterface, group)); @@ -65,28 +72,22 @@ public class DynamicConfigurationServiceNameMapping implements ServiceNameMappin } @Override - public Set<String> get(String serviceInterface, String group, String version, String protocol) { - + public Set<String> get(URL url) { + String serviceInterface = url.getServiceInterface(); + String group = url.getParameter(GROUP_KEY); + String version = url.getParameter(VERSION_KEY); + String protocol = url.getProtocol(); DynamicConfiguration dynamicConfiguration = DynamicConfiguration.getDynamicConfiguration(); Set<String> serviceNames = new LinkedHashSet<>(); execute(() -> { - Set<String> keys = dynamicConfiguration.getConfigKeys(buildGroup(serviceInterface, group, version, protocol)); + Set<String> keys = dynamicConfiguration + .getConfigKeys(ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol)); serviceNames.addAll(keys); }); return Collections.unmodifiableSet(serviceNames); } - 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(KEY_SEPARATOR).append(defaultString(group)) - // .append(KEY_SEPARATOR).append(defaultString(version)) - // .append(KEY_SEPARATOR).append(defaultString(protocol)); - // return groupBuilder.toString(); - return DEFAULT_MAPPING_GROUP + SLASH + serviceInterface; - } - private void execute(Runnable runnable) { try { runnable.run(); diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java index 01e3c09..f235655 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataInfo.java @@ -42,7 +42,8 @@ public class MetadataInfo implements Serializable { private String revision; private Map<String, ServiceInfo> services; - public MetadataInfo() { + public MetadataInfo(String app) { + this.app = app; this.services = new HashMap<>(); } @@ -166,7 +167,7 @@ public class MetadataInfo implements Serializable { String[] methods = url.getParameter(METHODS_KEY, (String[]) null); if (methods != null) { for (String method : methods) { - String mValue = url.getMethodParameter(method, p); + String mValue = url.getMethodParameterStrict(method, p); if (StringUtils.isNotEmpty(mValue)) { params.put(method + DOT_SEPARATOR + p, mValue); } diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataServiceNameMapping.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataServiceNameMapping.java new file mode 100644 index 0000000..9c0c600 --- /dev/null +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataServiceNameMapping.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.metadata; + +import org.apache.dubbo.common.URL; +import org.apache.dubbo.common.utils.CollectionUtils; +import org.apache.dubbo.metadata.report.MetadataReport; +import org.apache.dubbo.metadata.report.MetadataReportInstance; + +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import static java.util.Arrays.asList; +import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY; +import static org.apache.dubbo.rpc.model.ApplicationModel.getName; + +public class MetadataServiceNameMapping implements ServiceNameMapping { + private static final List<String> IGNORED_SERVICE_INTERFACES = asList(MetadataService.class.getName()); + + @Override + public void map(URL url) { + String serviceInterface = url.getServiceInterface(); + String group = url.getParameter(GROUP_KEY); + String version = url.getParameter(VERSION_KEY); + String protocol = url.getProtocol(); + + if (IGNORED_SERVICE_INTERFACES.contains(serviceInterface)) { + return; + } + + List<MetadataReport> metadataReports = MetadataReportInstance.getMetadataReports(true); + metadataReports.forEach(reporter -> { + reporter.registerServiceAppMapping(ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol), getName(), url); + }); + } + + @Override + public Set<String> get(URL url) { + String serviceInterface = url.getServiceInterface(); + String group = url.getParameter(GROUP_KEY); + String version = url.getParameter(VERSION_KEY); + String protocol = url.getProtocol(); + + List<MetadataReport> metadataReports = MetadataReportInstance.getMetadataReports(true); + Set<String> serviceNames = new LinkedHashSet<>(); + for (MetadataReport reporter : metadataReports) { + Set<String> apps = reporter.getServiceAppMapping(ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol), url); + if (CollectionUtils.isNotEmpty(apps)) { + serviceNames.addAll(apps); + break; + } + } + return serviceNames; + } +} diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/ServiceNameMapping.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/ServiceNameMapping.java index 74113f2..44d55c5 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/ServiceNameMapping.java +++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/ServiceNameMapping.java @@ -16,40 +16,35 @@ */ package org.apache.dubbo.metadata; +import org.apache.dubbo.common.URL; import org.apache.dubbo.common.extension.SPI; import java.util.Set; +import static org.apache.dubbo.common.constants.CommonConstants.CONFIG_MAPPING_TYPE; import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader; +import static org.apache.dubbo.common.utils.StringUtils.SLASH; +import static org.apache.dubbo.metadata.DynamicConfigurationServiceNameMapping.DEFAULT_MAPPING_GROUP; /** * The interface for Dubbo service name Mapping * * @since 2.7.5 */ -@SPI("default") +@SPI("config") public interface ServiceNameMapping { /** * Map the specified Dubbo service interface, group, version and protocol to current Dubbo service name - * - * @param serviceInterface the class name of Dubbo service interface - * @param group the group of Dubbo service interface (optional) - * @param version the version of Dubbo service interface version (optional) - * @param protocol the protocol of Dubbo service interface exported (optional) */ - void map(String serviceInterface, String group, String version, String protocol); + void map(URL url); /** * Get the service names from the specified Dubbo service interface, group, version and protocol * - * @param serviceInterface the class name of Dubbo service interface - * @param group the group of Dubbo service interface (optional) - * @param version the version of Dubbo service interface version (optional) - * @param protocol the protocol of Dubbo service interface exported (optional) * @return */ - Set<String> get(String serviceInterface, String group, String version, String protocol); + Set<String> get(URL url); /** @@ -61,4 +56,18 @@ public interface ServiceNameMapping { static ServiceNameMapping getDefaultExtension() { return getExtensionLoader(ServiceNameMapping.class).getDefaultExtension(); } + + static ServiceNameMapping getExtension(String name) { + return getExtensionLoader(ServiceNameMapping.class).getExtension(name == null ? CONFIG_MAPPING_TYPE : name); + } + + 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(KEY_SEPARATOR).append(defaultString(group)) + // .append(KEY_SEPARATOR).append(defaultString(version)) + // .append(KEY_SEPARATOR).append(defaultString(protocol)); + // return groupBuilder.toString(); + return DEFAULT_MAPPING_GROUP + SLASH + serviceInterface; + } } 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 4bc133d..256ae6e 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 @@ -24,20 +24,23 @@ 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.Collections; import java.util.List; import java.util.Map; import java.util.Set; public interface MetadataReport { + /** + * Service Definition -- START + **/ void storeProviderMetadata(MetadataIdentifier providerMetadataIdentifier, ServiceDefinition serviceDefinition); - void storeConsumerMetadata(MetadataIdentifier consumerMetadataIdentifier, Map<String, String> serviceParameterMap); - - List<String> getExportedURLs(ServiceMetadataIdentifier metadataIdentifier); - String getServiceDefinition(MetadataIdentifier metadataIdentifier); + /** + * Application Metadata -- START + **/ default void publishAppMetadata(SubscriberMetadataIdentifier identifier, MetadataInfo metadataInfo) { } @@ -46,8 +49,22 @@ public interface MetadataReport { } /** - * deprecated + * Service<-->Application Mapping -- START **/ + default Set<String> getServiceAppMapping(String serviceKey, URL url) { + return Collections.emptySet(); + } + + default void registerServiceAppMapping(String serviceKey, String application, URL url) { + return; + } + + /** + * deprecated or need triage + **/ + void storeConsumerMetadata(MetadataIdentifier consumerMetadataIdentifier, Map<String, String> serviceParameterMap); + + List<String> getExportedURLs(ServiceMetadataIdentifier metadataIdentifier); void saveServiceMetadata(ServiceMetadataIdentifier metadataIdentifier, URL url); diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping b/dubbo-metadata/dubbo-metadata-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping index 3975068..d43b342 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping +++ b/dubbo-metadata/dubbo-metadata-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping @@ -1 +1,2 @@ -default=org.apache.dubbo.metadata.DynamicConfigurationServiceNameMapping \ No newline at end of file +config=org.apache.dubbo.metadata.DynamicConfigurationServiceNameMapping +metadata=org.apache.dubbo.metadata.MetadataServiceNameMapping \ No newline at end of file diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMappingTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMappingTest.java deleted file mode 100644 index 0e677df..0000000 --- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMappingTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.dubbo.metadata; - -import org.apache.dubbo.common.config.configcenter.DynamicConfiguration; -import org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory; -import org.apache.dubbo.config.ApplicationConfig; -import org.apache.dubbo.rpc.model.ApplicationModel; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.util.Set; -import java.util.TreeSet; - -import static java.util.Arrays.asList; -import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader; -import static org.apache.dubbo.metadata.DynamicConfigurationServiceNameMapping.buildGroup; -import static org.apache.dubbo.metadata.ServiceNameMapping.getDefaultExtension; -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * {@link DynamicConfigurationServiceNameMapping} Test - * - * @since 2.7.5 - */ -public class DynamicConfigurationServiceNameMappingTest { - - - private final ServiceNameMapping serviceNameMapping = getDefaultExtension(); - - @BeforeAll - public static void setUp() throws Exception { - - DynamicConfiguration configuration = getExtensionLoader(DynamicConfigurationFactory.class) - .getExtension("file") - .getDynamicConfiguration(null); - - ApplicationModel.getEnvironment().setDynamicConfiguration(configuration); - } - - @Test - public void testBuildGroup() { - assertEquals("mapping/test", buildGroup("test", null, null, null)); - assertEquals("mapping/test", buildGroup("test", "default", null, null)); - assertEquals("mapping/test", buildGroup("test", "default", "1.0.0", null)); - assertEquals("mapping/test", buildGroup("test", "default", "1.0.0", "dubbo")); - } - - @Test - public void testMapAndGet() { - - String serviceName = "test"; - String serviceName2 = "test2"; - - ApplicationModel.getConfigManager().setApplication(new ApplicationConfig(serviceName)); - - String serviceInterface = "org.apache.dubbo.service.UserService"; - String group = null; - String version = null; - String protocol = null; - - serviceNameMapping.map(serviceInterface, group, version, protocol); - - ApplicationModel.getConfigManager().removeConfig(new ApplicationConfig(serviceName)); - ApplicationModel.getConfigManager().setApplication(new ApplicationConfig(serviceName2)); - - serviceNameMapping.map(serviceInterface, group, version, protocol); - - Set<String> serviceNames = serviceNameMapping.get(serviceInterface, group, version, protocol); - - assertEquals(new TreeSet(asList(serviceName, serviceName2)), serviceNames); - - ApplicationModel.getConfigManager().removeConfig(new ApplicationConfig(serviceName2)); - } -} diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java index 1d2f42e..be8c3fe 100644 --- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java +++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/MetadataInfoTest.java @@ -23,7 +23,7 @@ import org.junit.jupiter.api.Test; public class MetadataInfoTest { @Test public void revisionTest() { - MetadataInfo metadataInfo = new MetadataInfo(); + MetadataInfo metadataInfo = new MetadataInfo("demo"); metadataInfo.setApp("demo"); URL url = URL.valueOf("dubbo://10.230.11.211:20880/org.apache.dubbo.metadata.DemoService?timeout=1000&testKey=aaa"); diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java index 6c88e8c..3d80c22 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java @@ -46,7 +46,7 @@ public class DefaultServiceInstance implements ServiceInstance { private Map<String, String> metadata = new HashMap<>(); - private MetadataInfo serviceMetadata; + private transient MetadataInfo serviceMetadata; public DefaultServiceInstance() { } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java index 48ceffd..92db129 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java @@ -23,7 +23,6 @@ import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.StringUtils; -import org.apache.dubbo.metadata.MetadataService; import org.apache.dubbo.metadata.ServiceNameMapping; import org.apache.dubbo.metadata.WritableMetadataService; import org.apache.dubbo.registry.NotifyListener; @@ -33,7 +32,6 @@ import org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer; import org.apache.dubbo.registry.support.FailbackRegistry; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; @@ -49,9 +47,9 @@ import static java.util.Collections.emptySet; import static java.util.Collections.unmodifiableSet; import static java.util.stream.Collectors.toSet; import static java.util.stream.Stream.of; -import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_PROTOCOL; 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.MAPPING_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE; import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY; @@ -79,20 +77,6 @@ import static org.apache.dubbo.registry.client.ServiceDiscoveryFactory.getExtens * protocol associates with a kind of {@link ServiceDiscovery}'s implementation if present, or the * {@link FileSystemServiceDiscovery} will be the default one. Obviously, it's also allowed to extend * {@link ServiceDiscovery} using {@link SPI the Dubbo SPI}. - * <p> - * In the {@link #subscribe(URL, NotifyListener) subscription phase}, the {@link ServiceDiscovery} instance will be used - * to discovery the {@link ServiceInstance service instances} via the {@link ServiceDiscovery#getInstances(String)}. - * However, the argument of this method requires the service name that the subscribed {@link URL} can't find, thus, - * {@link ServiceNameMapping} will help to figure out one or more services that exported correlative Dubbo services. If - * the service names can be found, the exported {@link URL URLs} will be get from the remote {@link MetadataService} - * being deployed on all {@link ServiceInstance instances} of services. The whole process runs under the - * {@link #subscribeURLs(URL, NotifyListener, String, Collection)} method. It's very expensive to invoke - * {@link MetadataService} for each {@link ServiceInstance service instance}, thus {@link ServiceDiscoveryRegistry} - * introduces a cache to optimize the calculation with "revisions". If the revisions of N - * {@link ServiceInstance service instances} are same, {@link MetadataService} is invoked just only once, and then it - * does return the exported {@link URL URLs} as a template by which others are - * {@link #cloneExportedURLs(URL, Collection) cloned}. - * <p> * In contrast, current {@link ServiceInstance service instance} will not be registered to the registry whether any * Dubbo service is exported or not. * <p> @@ -130,7 +114,7 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { super(registryURL); this.serviceDiscovery = createServiceDiscovery(registryURL); this.subscribedServices = parseServices(registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY)); - this.serviceNameMapping = ServiceNameMapping.getDefaultExtension(); + this.serviceNameMapping = ServiceNameMapping.getExtension(registryURL.getParameter(MAPPING_KEY)); this.writableMetadataService = WritableMetadataService.getDefaultExtension(); } @@ -303,6 +287,7 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { listener.notifyServiceInstances(); } }); + serviceListener.setUrl(url); listener.addServiceListener(serviceListener); registerServiceInstancesChangedListener(url, serviceListener); } @@ -392,11 +377,7 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { * @return */ protected Set<String> findMappedServices(URL subscribedURL) { - String serviceInterface = subscribedURL.getServiceInterface(); - String group = subscribedURL.getParameter(GROUP_KEY); - String version = subscribedURL.getParameter(VERSION_KEY); - String protocol = subscribedURL.getParameter(PROTOCOL_KEY, DUBBO_PROTOCOL); - return serviceNameMapping.get(serviceInterface, group, version, protocol); + return serviceNameMapping.get(subscribedURL); } /** diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java index 5f40b2a..3bd4042 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java @@ -53,7 +53,7 @@ public abstract class ServiceInstancesChangedListener implements ConditionalEven private final String serviceName; private final ServiceDiscovery serviceDiscovery; - private final URL url; + private URL url; private List<ServiceInstance> instances; @@ -165,6 +165,10 @@ public abstract class ServiceInstancesChangedListener implements ConditionalEven return serviceName; } + public void setUrl(URL url) { + this.url = url; + } + public URL getUrl() { return url; } 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 9cbe577..2685a4a 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 @@ -37,7 +37,6 @@ import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataU public class MetadataUtils { - private static final Object LOCK = new Object(); private static final Object REMOTE_LOCK = new Object(); public static ConcurrentMap<String, MetadataService> metadataServiceProxies = new ConcurrentHashMap<>(); diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java index b9e7877..588c7ae 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java @@ -26,6 +26,7 @@ import org.apache.dubbo.metadata.MetadataService; import org.apache.dubbo.metadata.WritableMetadataService; import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder; import org.apache.dubbo.metadata.definition.model.ServiceDefinition; +import org.apache.dubbo.rpc.model.ApplicationModel; import org.apache.dubbo.rpc.support.ProtocolUtils; import com.google.gson.Gson; @@ -85,7 +86,7 @@ public class InMemoryWritableMetadataService implements WritableMetadataService ConcurrentNavigableMap<String, String> serviceDefinitions = new ConcurrentSkipListMap<>(); public InMemoryWritableMetadataService() { - this.metadataInfo = new MetadataInfo(); + this.metadataInfo = new MetadataInfo(ApplicationModel.getName()); } @Override