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)));
         });
     }

Reply via email to