This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch call-non-dubbo-provider in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit a36f7130e112252f1c3d30c7153772acf2cc003d Author: ken.lj <ken.lj...@gmail.com> AuthorDate: Wed Aug 28 17:10:48 2019 +0800 ServiceDiscovery related bufixes when doing integration test --- .../configcenter/DynamicConfigurationFactory.java | 4 +- .../configcenter/nop/NopDynamicConfiguration.java | 4 +- .../wrapper/CompositeDynamicConfiguration.java | 3 + .../dubbo/common/constants/RegistryConstants.java | 3 +- .../dubbo/config/AbstractReferenceConfig.java | 14 ++++ .../ConfigurableMetadataServiceExporter.java | 9 ++- .../src/main/resources/META-INF/compat/dubbo.xsd | 6 ++ .../src/main/resources/META-INF/dubbo.xsd | 6 ++ .../DynamicConfigurationServiceNameMapping.java | 5 +- .../registry/client/ServiceDiscoveryRegistry.java | 75 +++++++++++++--------- .../RestProtocolSubscribedURLsSynthesizer.java | 28 +------- .../SpringCloudMetadataServiceURLBuilder.java | 2 + .../proxy/DefaultMetadataServiceProxyFactory.java | 7 +- .../proxy/MetadataServiceProxyFactory.java | 3 +- ...ient.metadata.proxy.MetadataServiceProxyFactory | 2 +- .../client/ServieDiscoveryRegistryTest.java | 24 +++++++ .../registry/consul/ConsulServiceDiscovery.java | 24 ++++++- .../registry/eureka/EurekaServiceDiscovery.java | 9 +-- 18 files changed, 155 insertions(+), 73 deletions(-) diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java index 649eec6..228baad 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/DynamicConfigurationFactory.java @@ -25,7 +25,7 @@ import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoad /** * The factory interface to create the instance of {@link DynamicConfiguration} */ -@SPI("file") // 2.7.4 change the default SPI implementation +@SPI("nop") // 2.7.4 change the default SPI implementation public interface DynamicConfigurationFactory { DynamicConfiguration getDynamicConfiguration(URL url); @@ -41,6 +41,6 @@ public interface DynamicConfigurationFactory { static DynamicConfigurationFactory getDynamicConfigurationFactory(String name) { Class<DynamicConfigurationFactory> factoryClass = DynamicConfigurationFactory.class; ExtensionLoader<DynamicConfigurationFactory> loader = getExtensionLoader(factoryClass); - return loader.hasExtension(name) ? loader.getExtension(name) : loader.getDefaultExtension(); + return loader.getOrDefaultExtension(name); } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java index e61af12..c6c5328 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/nop/NopDynamicConfiguration.java @@ -22,8 +22,6 @@ import org.apache.dubbo.common.config.configcenter.DynamicConfiguration; import java.util.SortedSet; -import static java.util.Collections.emptySortedSet; - /** * The default extension of {@link DynamicConfiguration}. If user does not specify a config centre, or specifies one * that is not a valid extension, it will default to this one. @@ -69,6 +67,6 @@ public class NopDynamicConfiguration implements DynamicConfiguration { */ @Override public SortedSet<String> getConfigKeys(String group) { - return emptySortedSet(); + return null; } } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java index 8310827..9ee727e 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/config/configcenter/wrapper/CompositeDynamicConfiguration.java @@ -99,6 +99,9 @@ public class CompositeDynamicConfiguration implements DynamicConfiguration { Object value = null; for (DynamicConfiguration configuration : configurations) { value = func.apply(configuration); + if (value != null) { + break; + } } return value; } diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java index 03eb9b2..b7fe96b 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/RegistryConstants.java @@ -81,8 +81,7 @@ public interface RegistryConstants { */ String SUBSCRIBED_SERVICE_NAMES_KEY = "subscribed-services"; - String SUBSCRIBED_PROTOCOL_DEFAULT = "rest"; - + String PROVIDED_BY = "provided-by"; /** * The request size of service instances diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java index 7dcb70f..ca2846d 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractReferenceConfig.java @@ -86,6 +86,11 @@ public abstract class AbstractReferenceConfig extends AbstractInterfaceConfig { */ protected String group; + /** + * declares which app or service this interface belongs to + */ + protected String providedBy; + public Boolean isCheck() { return check; } @@ -222,4 +227,13 @@ public abstract class AbstractReferenceConfig extends AbstractInterfaceConfig { checkKey(GROUP_KEY, group); this.group = group; } + + @Parameter(key = "provided-by") + public String getProvidedBy() { + return providedBy; + } + + public void setProvidedBy(String providedBy) { + this.providedBy = providedBy; + } } diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java index c59726a..8c69e32 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java @@ -128,8 +128,15 @@ public class ConfigurableMetadataServiceExporter implements MetadataServiceExpor private ProtocolConfig getDefaultProtocol() { ProtocolConfig defaultProtocol = new ProtocolConfig(); defaultProtocol.setName(DUBBO); - // auto-increment port defaultProtocol.setPort(-1); + + List<ProtocolConfig> defaultProtocols = configManager.getDefaultProtocols(); + if (defaultProtocols != null) { + return defaultProtocols.stream() + .filter(protocolConfig -> DUBBO.equals(protocolConfig.getName())) + .findFirst() + .orElse(defaultProtocol); + } return defaultProtocol; } } diff --git a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd index 0966179..20d1ff1 100644 --- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd +++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd @@ -232,6 +232,12 @@ <xsd:documentation><![CDATA[ lazy create connection. ]]></xsd:documentation> </xsd:annotation> </xsd:attribute> + <xsd:attribute name="provided-by" type="xsd:string"> + <xsd:annotation> + <xsd:documentation> + <![CDATA[ declares which app or service this interface belongs to. ]]></xsd:documentation> + </xsd:annotation> + </xsd:attribute> </xsd:extension> </xsd:complexContent> </xsd:complexType> diff --git a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd index 29ea4f2..044d92a 100644 --- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd +++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd @@ -232,6 +232,12 @@ <xsd:documentation><![CDATA[ lazy create connection. ]]></xsd:documentation> </xsd:annotation> </xsd:attribute> + <xsd:attribute name="provided-by" type="xsd:string"> + <xsd:annotation> + <xsd:documentation> + <![CDATA[ declares which app or service this interface belongs to. ]]></xsd:documentation> + </xsd:annotation> + </xsd:attribute> </xsd:extension> </xsd:complexContent> </xsd:complexType> 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 f7c6440..0ba8f28 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 @@ -60,7 +60,7 @@ public class DynamicConfigurationServiceNameMapping implements ServiceNameMappin dynamicConfiguration.publishConfig(key, buildGroup(serviceInterface, group, version, protocol), content); if (logger.isInfoEnabled()) { logger.info(String.format("The Dubbo service key[%s] mapped to service name[%s] with content : %s", - key, group, content)); + key, serviceInterface, content)); } }); } @@ -75,6 +75,9 @@ public class DynamicConfigurationServiceNameMapping implements ServiceNameMappin Set<String> keys = dynamicConfiguration.getConfigKeys(buildGroup(serviceInterface, group, version, protocol)); serviceNames.addAll(keys); }); + System.err.println(dynamicConfiguration.getClass()); + System.err.println(buildGroup(serviceInterface, group, version, protocol)); + System.err.println(serviceNames); return Collections.unmodifiableSet(serviceNames); } 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 581e388..30ecdd1 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 @@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URLBuilder; 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; @@ -67,6 +68,7 @@ import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE; import static org.apache.dubbo.common.constants.CommonConstants.SIDE_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.common.constants.RegistryConstants.PROVIDED_BY; import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY; import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_TYPE; import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY; @@ -125,7 +127,7 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { public ServiceDiscoveryRegistry(URL registryURL) { super(registryURL); this.serviceDiscovery = createServiceDiscovery(registryURL); - this.subscribedServices = getSubscribedServices(registryURL); + this.subscribedServices = parseServices(registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY)); this.serviceNameMapping = ServiceNameMapping.getDefaultExtension(); String metadataStorageType = getMetadataStorageType(registryURL); this.writableMetadataService = WritableMetadataService.getExtension(metadataStorageType); @@ -133,21 +135,6 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { } /** - * Get the subscribed services from the specified registry {@link URL url} - * - * @param registryURL the specified registry {@link URL url} - * @return non-null - */ - public static Set<String> getSubscribedServices(URL registryURL) { - String subscribedServiceNames = registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY); - return isBlank(subscribedServiceNames) ? emptySet() : - unmodifiableSet(of(subscribedServiceNames.split(",")) - .map(String::trim) - .filter(StringUtils::isNotEmpty) - .collect(toSet())); - } - - /** * Create the {@link ServiceDiscovery} from the registry {@link URL} * * @param registryURL the {@link URL} to connect the registry @@ -295,6 +282,9 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { writableMetadataService.subscribeURL(url); Set<String> serviceNames = getServices(url); + if (CollectionUtils.isEmpty(serviceNames)) { + throw new IllegalStateException("Should has at least one way to know which services this interface belongs to, subscription url: " + url); + } serviceNames.forEach(serviceName -> subscribeURLs(url, listener, serviceName)); @@ -372,7 +362,6 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { List<ServiceInstance> serviceInstances = instances.stream() .filter(ServiceInstance::isEnabled) .filter(ServiceInstance::isHealthy) - .filter(ServiceInstanceMetadataUtils::isDubboServiceInstance) .collect(Collectors.toList()); int size = serviceInstances.size(); @@ -461,9 +450,9 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { return templateURL; } - URLBuilder clonedURLBuilder = from(templateURL) // remove the parameters from the template URL - .setHost(host) // reset the host - .setPort(port); // reset the port + URLBuilder clonedURLBuilder = from(templateURL); // remove the parameters from the template URL +// .setHost(host) // reset the host +// .setPort(port); // reset the port return clonedURLBuilder.build(); }) @@ -641,8 +630,10 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { MetadataService metadataService = MetadataServiceProxyFactory .getExtension(metadataStorageType == null ? DEFAULT_EXTENSION : metadataStorageType) .getProxy(providerServiceInstance); - SortedSet<String> urls = metadataService.getExportedURLs(); - exportedURLs = urls.stream().map(URL::valueOf).collect(Collectors.toList()); + if (metadataService != null) { + SortedSet<String> urls = metadataService.getExportedURLs(); + exportedURLs = urls.stream().map(URL::valueOf).collect(Collectors.toList()); + } } catch (Throwable e) { if (logger.isErrorEnabled()) { logger.error(format("It's failed to get the exported URLs from the target service instance[%s]", @@ -675,8 +666,10 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { MetadataService metadataService = MetadataServiceProxyFactory .getExtension(metadataStorageType == null ? DEFAULT_EXTENSION : metadataStorageType) .getProxy(providerServiceInstance); - SortedSet<String> urls = metadataService.getExportedURLs(serviceInterface, group, version, protocol); - exportedURLs = urls.stream().map(URL::valueOf).collect(Collectors.toList()); + if (metadataService != null) { + SortedSet<String> urls = metadataService.getExportedURLs(serviceInterface, group, version, protocol); + exportedURLs = urls.stream().map(URL::valueOf).collect(Collectors.toList()); + } } catch (Throwable e) { if (logger.isErrorEnabled()) { logger.error(e.getMessage(), e); @@ -700,13 +693,37 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { .collect(Collectors.toList()); } - + /** + * 1.developer explicitly specifies the application name this interface belongs to + * 2.check Interface-App mapping + * 3.use the services specified in registry url. + * + * @param subscribedURL + * @return + */ protected Set<String> getServices(URL subscribedURL) { - Set<String> serviceNames = getSubscribedServices(); - if (isEmpty(serviceNames)) { - serviceNames = findMappedServices(subscribedURL); + Set<String> subscribedServices = new LinkedHashSet<>(); + + String serviceNames = subscribedURL.getParameter(PROVIDED_BY); + if (StringUtils.isNotEmpty(serviceNames)) { + subscribedServices = parseServices(serviceNames); + } + + if (isEmpty(subscribedServices)) { + subscribedServices = findMappedServices(subscribedURL); + if (isEmpty(subscribedServices)) { + subscribedServices = getSubscribedServices(); + } } - return serviceNames; + return subscribedServices; + } + + public static Set<String> parseServices(String literalServices) { + return isBlank(literalServices) ? emptySet() : + unmodifiableSet(of(literalServices.split(",")) + .map(String::trim) + .filter(StringUtils::isNotEmpty) + .collect(toSet())); } /** diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java index e37bc4f..31ae20d 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java @@ -18,25 +18,19 @@ package org.apache.dubbo.registry.client.metadata; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.URLBuilder; -import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.registry.client.ServiceInstance; import org.apache.dubbo.rpc.Protocol; import java.util.Collection; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; import static java.lang.Boolean.TRUE; -import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY; +import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY; import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER; import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY; -import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY; -import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY; import static org.apache.dubbo.registry.Constants.REGISTER_KEY; -import static org.apache.dubbo.rpc.Constants.LAZY_CONNECT_KEY; -import static org.apache.dubbo.rpc.cluster.Constants.CLUSTER_STICKY_KEY; /** * {@link SubscribedURLsSynthesizer} implementation for REST {@link Protocol protocol} @@ -56,15 +50,6 @@ public class RestProtocolSubscribedURLsSynthesizer implements SubscribedURLsSynt String protocol = subscribedURL.getParameter(PROTOCOL_KEY); - Map<String, String> parametersToCopy = subscribedURL.removeParameter(CATEGORY_KEY) - .removeParameter(PROTOCOL_KEY) - .removeParameter(SIDE_KEY) - .removeParameter(CLUSTER_STICKY_KEY) - .removeParameter(TIMESTAMP_KEY) - .removeParameter(PID_KEY) - .removeParameter(LAZY_CONNECT_KEY) - .getParameters(); - return serviceInstances.stream().map(serviceInstance -> { URLBuilder urlBuilder = new URLBuilder() .setProtocol(protocol) @@ -72,20 +57,11 @@ public class RestProtocolSubscribedURLsSynthesizer implements SubscribedURLsSynt .setPort(serviceInstance.getPort()) .setPath(subscribedURL.getServiceInterface()) .addParameter(SIDE_KEY, PROVIDER) + .addParameter(APPLICATION_KEY, serviceInstance.getServiceName()) .addParameter(REGISTER_KEY, TRUE.toString()); - // Copy the parameters - parametersToCopy.forEach((key, value) -> { - urlBuilder.addParameter(key, value); - }); - return urlBuilder.build(); }).collect(Collectors.toList()); } - private void addParameter(URLBuilder urlBuilder, String key, String value) { - if (StringUtils.isNotEmpty(value)) { - urlBuilder.addParameter(key, value); - } - } } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java index efc3253..0bcf905 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java @@ -32,6 +32,8 @@ import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataU /** * The {@link MetadataServiceURLBuilder} implementation for The standard Dubbo scenario * + * Works with Spring Cloud Alibaba + * * @since 2.7.4 */ public class SpringCloudMetadataServiceURLBuilder implements MetadataServiceURLBuilder { 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 f25f492..b6f2be9 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 @@ -18,6 +18,7 @@ package org.apache.dubbo.registry.client.metadata.proxy; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.extension.ExtensionLoader; +import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.metadata.MetadataService; import org.apache.dubbo.registry.client.ServiceInstance; import org.apache.dubbo.rpc.Invoker; @@ -27,9 +28,7 @@ import org.apache.dubbo.rpc.cluster.Cluster; import org.apache.dubbo.rpc.cluster.directory.StaticDirectory; import org.apache.dubbo.rpc.cluster.support.AvailableCluster; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; import static org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder.composite; @@ -63,6 +62,10 @@ public class DefaultMetadataServiceProxyFactory extends BaseMetadataServiceProxy .map(url -> protocol.refer(MetadataService.class, url)) .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(invokers)) { + return null; + } + Invoker<MetadataService> invoker = cluster.join(new StaticDirectory<>(invokers)); return proxyFactory.getProxy(invoker); } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxyFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxyFactory.java index fd55bb7..e4f7061 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxyFactory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxyFactory.java @@ -20,6 +20,7 @@ import org.apache.dubbo.common.extension.SPI; import org.apache.dubbo.metadata.MetadataService; import org.apache.dubbo.registry.client.ServiceInstance; +import static org.apache.dubbo.common.constants.CommonConstants.METADATA_DEFAULT; import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader; /** @@ -29,7 +30,7 @@ import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoad * @see MetadataService * @since 2.7.4 */ -@SPI("default") +@SPI(METADATA_DEFAULT) public interface MetadataServiceProxyFactory { /** diff --git a/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.proxy.MetadataServiceProxyFactory b/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.proxy.MetadataServiceProxyFactory index 359dbe8..d9283de 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.proxy.MetadataServiceProxyFactory +++ b/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.proxy.MetadataServiceProxyFactory @@ -1,2 +1,2 @@ -default=org.apache.dubbo.registry.client.metadata.proxy.DefaultMetadataServiceProxyFactory +local=org.apache.dubbo.registry.client.metadata.proxy.DefaultMetadataServiceProxyFactory remote=org.apache.dubbo.registry.client.metadata.proxy.RemoteMetadataServiceProxyFactory \ No newline at end of file diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java new file mode 100644 index 0000000..e30b17d --- /dev/null +++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/ServieDiscoveryRegistryTest.java @@ -0,0 +1,24 @@ +/* + * 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.registry.client; + +/** + * + */ +public class ServieDiscoveryRegistryTest { + +} diff --git a/dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java b/dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java index 6ed9871..94b9765 100644 --- a/dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java +++ b/dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java @@ -37,6 +37,8 @@ import com.ecwid.consul.v1.health.model.HealthService; import java.util.ArrayList; import java.util.Arrays; +import java.util.Base64; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -163,6 +165,7 @@ public class ConsulServiceDiscovery implements ServiceDiscovery, EventListener<S private Map<String, String> getMetadata(HealthService.Service service) { Map<String, String> metadata = service.getMeta(); + metadata = decodeMetadata(metadata); if (CollectionUtils.isEmptyMap(metadata)) { metadata = getScCompatibleMetadata(service.getTags()); } @@ -203,7 +206,7 @@ public class ConsulServiceDiscovery implements ServiceDiscovery, EventListener<S service.setName(serviceInstance.getServiceName()); service.setCheck(buildCheck(serviceInstance)); service.setTags(buildTags(serviceInstance)); - service.setMeta(buildMetadata(serviceInstance)); +// service.setMeta(buildMetadata(serviceInstance)); return service; } @@ -226,9 +229,28 @@ public class ConsulServiceDiscovery implements ServiceDiscovery, EventListener<S if (CollectionUtils.isNotEmptyMap(serviceInstance.getMetadata())) { metadata.putAll(serviceInstance.getMetadata()); } + metadata = encodeMetadata(metadata); return metadata; } + private Map<String, String> encodeMetadata(Map<String, String> metadata) { + if (metadata == null) { + return metadata; + } + Map<String, String> encoded = new HashMap<>(metadata.size()); + metadata.forEach((k, v) -> encoded.put(Base64.getEncoder().encodeToString(k.getBytes()), v)); + return encoded; + } + + private Map<String, String> decodeMetadata(Map<String, String> metadata) { + if (metadata == null) { + return metadata; + } + Map<String, String> decoded = new HashMap<>(metadata.size()); + metadata.forEach((k, v) -> decoded.put(new String(Base64.getDecoder().decode(k)), v)); + return decoded; + } + private NewService.Check buildCheck(ServiceInstance serviceInstance) { NewService.Check check = new NewService.Check(); check.setTtl((checkPassInterval / 1000) + "s"); diff --git a/dubbo-registry/dubbo-registry-eureka/src/main/java/org/apache/dubbo/registry/eureka/EurekaServiceDiscovery.java b/dubbo-registry/dubbo-registry-eureka/src/main/java/org/apache/dubbo/registry/eureka/EurekaServiceDiscovery.java index 26c9345..8ca36bf 100644 --- a/dubbo-registry/dubbo-registry-eureka/src/main/java/org/apache/dubbo/registry/eureka/EurekaServiceDiscovery.java +++ b/dubbo-registry/dubbo-registry-eureka/src/main/java/org/apache/dubbo/registry/eureka/EurekaServiceDiscovery.java @@ -46,8 +46,9 @@ import java.util.Properties; import java.util.Set; import static java.util.Collections.emptyList; +import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY; import static org.apache.dubbo.event.EventDispatcher.getDefaultExtension; -import static org.apache.dubbo.registry.client.ServiceDiscoveryRegistry.getSubscribedServices; +import static org.apache.dubbo.registry.client.ServiceDiscoveryRegistry.parseServices; /** * Eureka {@link ServiceDiscovery} implementation based on Eureka API @@ -60,7 +61,7 @@ public class EurekaServiceDiscovery implements ServiceDiscovery { private EurekaClient eurekaClient; - private Map<String, String> subscribedServices; + private Set<String> subscribedServices; /** * last apps hash code is used to identify the {@link Applications} is changed or not @@ -99,7 +100,7 @@ public class EurekaServiceDiscovery implements ServiceDiscovery { * @param registryURL the {@link URL url} to connect Eureka */ private void initSubscribedServices(URL registryURL) { - this.subscribedServices = getSubscribedServices(registryURL); + this.subscribedServices = parseServices(registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY)); } private boolean filterEurekaProperty(Map.Entry<String, String> propertyEntry) { @@ -184,7 +185,7 @@ public class EurekaServiceDiscovery implements ServiceDiscovery { } private void dispatchServiceInstancesChangedEvent() { - subscribedServices.forEach((serviceName, protocol) -> { + subscribedServices.forEach((serviceName) -> { eventDispatcher.dispatch(new ServiceInstancesChangedEvent(serviceName, getInstances(serviceName))); }); }