You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2020/07/23 02:46:10 UTC

[dubbo] 03/03: Merge branch 'master' into 3.0

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

commit 0d785f1346f48abf34a1a7690b437c3615780beb
Merge: 7bef551 7702fcf
Author: ken.lj <ke...@gmail.com>
AuthorDate: Wed Jul 22 14:45:08 2020 +0800

    Merge branch 'master' into 3.0
    
    # Conflicts:
    #	dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/directory/AbstractDirectory.java
    #	dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
    #	dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/event/listener/ServiceNameMappingListener.java
    #	dubbo-dependencies-bom/pom.xml
    #	dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMapping.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataConstants.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/ServiceNameMapping.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/URLRevisionResolver.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/WritableMetadataService.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReport.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/store/RemoteWritableMetadataService.java
    #	dubbo-metadata/dubbo-metadata-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping
    #	dubbo-metadata/dubbo-metadata-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.metadata.WritableMetadataService
    #	dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/DynamicConfigurationServiceNameMappingTest.java
    #	dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/InMemoryWritableMetadataServiceTest.java
    #	dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/URLRevisionResolverTest.java
    #	dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/store/InMemoryWritableMetadataServiceTest.java
    #	dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/store/RemoteWritableMetadataServiceTest.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/listener/CustomizableServiceInstanceListener.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ExportedServicesRevisionMetadataCustomizer.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/SubscribedServicesRevisionMetadataCustomizer.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/BaseMetadataServiceProxyFactory.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/MetadataServiceProxyFactory.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/proxy/RemoteMetadataServiceProxy.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java
    #	dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryInvokerWrapper.java
    #	dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.event.EventListener
    #	dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.proxy.MetadataServiceProxyFactory
    #	pom.xml

 .gitignore                                         |    3 +
 README.md                                          |    8 +-
 dubbo-all/pom.xml                                  |    8 +
 .../java/org/apache/dubbo/rpc/cluster/Cluster.java |   15 +-
 .../cluster/{Cluster.java => ClusterInvoker.java}  |   84 +-
 .../org/apache/dubbo/rpc/cluster/Configurator.java |    5 +-
 .../cluster/configurator/parser/ConfigParser.java  |   26 +
 .../router/condition/config/ListenableRouter.java  |    2 +-
 .../cluster/router/mock/MockInvokersSelector.java  |    2 +-
 .../dubbo/rpc/cluster/router/tag/TagRouter.java    |   12 +
 .../cluster/support/AbstractClusterInvoker.java    |    3 +-
 .../support/registry/ZoneAwareClusterInvoker.java  |   32 +-
 .../support/wrapper/MockClusterInvoker.java        |    8 +-
 .../configurator/parser/ConfigParserTest.java      |   16 +
 .../support/AbstractClusterInvokerTest.java        |    2 +-
 .../src/main/java/org/apache/dubbo/common/URL.java |   60 +-
 .../configcenter/AbstractDynamicConfiguration.java |  103 +-
 .../AbstractDynamicConfigurationFactory.java       |    2 +-
 .../config/configcenter/DynamicConfiguration.java  |   10 +
 .../configcenter/TreePathDynamicConfiguration.java |  186 ++
 .../file/FileSystemDynamicConfiguration.java       |  150 +-
 .../dubbo/common/constants/CommonConstants.java    |   41 +-
 .../dubbo/common/constants/RegistryConstants.java  |    2 +
 .../org/apache/dubbo/common/convert/Converter.java |   17 +
 .../convert/multiple/MultiValueConverter.java      |   28 +
 .../dubbo/common/extension/ExtensionLoader.java    | 2069 ++++++++++----------
 .../org/apache/dubbo/common/extension/Wrapper.java |   17 +-
 .../extension/support/ActivateComparator.java      |    4 +-
 ...ivateComparator.java => WrapperComparator.java} |  232 +--
 .../org/apache/dubbo/common/utils/ArrayUtils.java  |   22 +
 .../org/apache/dubbo/common/utils/PathUtils.java   |    7 +-
 .../org/apache/dubbo/common/utils/PojoUtils.java   |   56 +-
 .../utils/StringConstantFieldValuePredicate.java   |   67 +
 .../org/apache/dubbo/common/utils/StringUtils.java |   57 +-
 .../apache/dubbo/config/MetadataReportConfig.java  |    4 +-
 .../java/org/apache/dubbo/config/MethodConfig.java |    7 +-
 .../apache/dubbo/config/ReferenceConfigBase.java   |    7 +-
 .../org/apache/dubbo/config/RegistryConfig.java    |   37 +-
 .../org/apache/dubbo/config/ServiceConfigBase.java |   25 +-
 .../dubbo/config/annotation/DubboReference.java    |    9 +
 .../apache/dubbo/config/context/ConfigManager.java |   13 +-
 .../java/org/apache/dubbo/event/EventListener.java |    2 +-
 .../org/apache/dubbo/rpc/model/ConsumerModel.java  |    7 +-
 .../test/java/org/apache/dubbo/common/URLTest.java | 1777 ++++++++---------
 .../AbstractDynamicConfigurationTest.java          |   60 +-
 .../file/FileSystemDynamicConfigurationTest.java   |   45 +-
 .../common/constants/CommonConstantsTest.java      |   41 +
 .../convert/ConverterTest.java}                    |   39 +-
 .../convert/StringToBooleanConverterTest.java      |    5 +-
 .../convert/StringToCharArrayConverterTest.java    |    5 +-
 .../convert/StringToCharacterConverterTest.java    |    5 +-
 .../convert/StringToDoubleConverterTest.java       |    5 +-
 .../convert/StringToFloatConverterTest.java        |    5 +-
 .../convert/StringToIntegerConverterTest.java      |    5 +-
 .../convert/StringToLongConverterTest.java         |    5 +-
 .../convert/StringToOptionalConverterTest.java     |    5 +-
 .../convert/StringToShortConverterTest.java        |    5 +-
 .../convert/StringToStringConverterTest.java       |    5 +-
 .../convert/multiple/MultiValueConverterTest.java  |   72 +
 .../multiple/StringToArrayConverterTest.java       |    4 +-
 .../StringToBlockingDequeConverterTest.java        |    4 +-
 .../StringToBlockingQueueConverterTest.java        |    4 +-
 .../multiple/StringToCollectionConverterTest.java  |    5 +-
 .../multiple/StringToDequeConverterTest.java       |    4 +-
 .../multiple/StringToListConverterTest.java        |    4 +-
 .../StringToNavigableSetConverterTest.java         |    6 +-
 .../multiple/StringToQueueConverterTest.java       |    3 +-
 .../convert/multiple/StringToSetConverterTest.java |    3 +-
 .../multiple/StringToSortedSetConverterTest.java   |    6 +-
 .../StringToTransferQueueConverterTest.java        |    6 +-
 .../apache/dubbo/common/utils/PojoUtilsTest.java   |   36 +
 .../StringConstantFieldValuePredicateTest.java}    |   44 +-
 .../apache/dubbo/common/utils/StringUtilsTest.java |   73 +-
 .../dubbo/config/context/ConfigManagerTest.java    |    7 +-
 .../org/apache/dubbo/event/EchoEventListener2.java |    2 +-
 .../dubbo/common/extension/ExtensionFactory.java   |    3 +
 .../java/org/apache/dubbo/config/ConfigTest.java   |    4 +-
 .../apache/dubbo/config/ReferenceConfigTest.java   |    4 +-
 dubbo-config/dubbo-config-api/pom.xml              |   31 +
 .../org/apache/dubbo/config/ReferenceConfig.java   |   83 +-
 .../org/apache/dubbo/config/ServiceConfig.java     |    2 +-
 .../dubbo/config/bootstrap/DubboBootstrap.java     |  224 ++-
 .../bootstrap/builders/ReferenceBuilder.java       |   22 +
 .../config/bootstrap/builders/RegistryBuilder.java |   12 +-
 .../config/bootstrap/builders/ServiceBuilder.java  |   18 +-
 .../metadata/AbstractMetadataServiceExporter.java  |  150 ++
 .../ConfigurableMetadataServiceExporter.java       |   69 +-
 .../metadata/RemoteMetadataServiceExporter.java    |   79 +
 .../dubbo/config/utils/ConfigValidationUtils.java  |   14 +-
 ...g.apache.dubbo.metadata.MetadataServiceExporter |    3 +
 .../apache/dubbo/config/ReferenceConfigTest.java   |    5 +-
 .../org/apache/dubbo/config/ServiceConfigTest.java |   30 +-
 ...va => ConsulDubboServiceConsumerBootstrap.java} |   10 +-
 ...va => ConsulDubboServiceProviderBootstrap.java} |   10 +-
 .../NacosDubboServiceConsumerBootstrap.java        |   21 +-
 .../NacosDubboServiceProviderBootstrap.java        |   18 +-
 .../ZookeeperDubboServiceConsumerBootstrap.java    |   13 +-
 .../ZookeeperDubboServiceProviderBootstrap.java    |    9 +-
 .../bootstrap/builders/ReferenceBuilderTest.java   |   15 +-
 .../bootstrap/builders/RegistryBuilderTest.java    |    2 +-
 .../bootstrap/builders/ServiceBuilderTest.java     |   32 +-
 .../PublishingServiceDefinitionListenerTest.java   |   94 +
 .../RemoteMetadataServiceExporterTest.java         |  106 +
 .../config/url/ExporterSideConfigUrlTest.java      |    5 +-
 .../metadata/MetadataServiceExporterTest.java      |   38 +-
 dubbo-config/dubbo-config-spring/pom.xml           |   21 +
 .../apache/dubbo/config/spring/ServiceBean.java    |    6 +-
 .../ReferenceAnnotationBeanPostProcessor.java      |   92 +-
 .../annotation/ServiceClassPostProcessor.java      |    4 +-
 .../spring/context/annotation/EnableDubbo.java     |    2 +-
 .../context/annotation/EnableDubboConfig.java      |    2 +-
 .../spring/extension/SpringExtensionFactory.java   |    2 +-
 .../schema/AnnotationBeanDefinitionParser.java     |   10 +-
 .../spring/schema/DubboBeanDefinitionParser.java   |   45 +-
 .../spring/schema/DubboNamespaceHandler.java       |   25 +-
 .../src/main/resources/META-INF/dubbo.xsd          |   17 +-
 .../ReferenceAnnotationBeanPostProcessorTest.java  |   13 +
 .../annotation/ReferenceBeanBuilderTest.java       |   29 +-
 .../ServiceAnnotationBeanPostProcessorTest.java    |   13 +
 .../annotation/ServiceClassPostProcessorTest.java  |   13 +
 .../MultipleServicesWithMethodConfigsTest.java}    |   30 +-
 .../DubboComponentScanRegistrarTest.java           |    4 +-
 .../spring/context/annotation/EnableDubboTest.java |    4 +-
 .../consumer/test/TestConsumerConfiguration.java   |    5 +-
 .../properties/DefaultDubboConfigBinderTest.java   |   13 +
 .../dubbo/config/spring/issues/Issue6252Test.java  |   50 +
 .../ZookeeperDubboSpringConsumerBootstrap.java     |   53 +
 .../ZookeeperDubboSpringConsumerXmlBootstrap.java  |   32 +-
 .../ZookeeperDubboSpringProviderBootstrap.java     |   60 +
 .../spring/schema/DubboNamespaceHandlerTest.java   |    4 +-
 .../config/spring/schema/GenericServiceTest.java   |   13 +
 .../src/test/resources/META-INF/config.properties  |    2 +
 .../resources/META-INF/issue-6252-test.properties  |   15 +
 .../zookeeper-dubbb-consumer.properties            |   14 +
 .../zookeeper-dubbb-provider.properties            |   10 +
 .../zookeeper-dubbo-consumer.xml                   |   34 +
 .../spring/multiple-services-with-methods.xml      |   45 +
 .../consul/ConsulDynamicConfiguration.java         |  123 +-
 .../consul/ConsulDynamicConfigurationTest.java     |   20 +-
 .../support/nacos/NacosDynamicConfiguration.java   |   64 +-
 .../zookeeper/ZookeeperDynamicConfiguration.java   |   68 +-
 .../ZookeeperDynamicConfigurationTest.java         |    4 +-
 .../demo/consumer/comp/DemoServiceComponent.java   |    4 +-
 .../dubbo/demo/provider/DemoServiceImpl.java       |    4 +-
 .../validation/support/jvalidation/JValidator.java |    6 +-
 .../metadata/CompositeServiceNameMapping.java      |   96 +
 .../org/apache/dubbo/metadata/MetadataService.java |    7 +-
 .../dubbo/metadata/MetadataServiceExporter.java    |   41 +-
 .../apache/dubbo/metadata/MetadataServiceType.java |   72 +
 .../metadata/ParameterizedServiceNameMapping.java} |   31 +-
 .../metadata/PropertiesFileServiceNameMapping.java |  148 ++
 .../metadata/ReadOnlyServiceNameMapping.java}      |   31 +-
 .../metadata/definition/TypeDefinitionBuilder.java |   10 +-
 .../metadata/definition/builder/TypeBuilder.java   |    3 +-
 .../BaseApplicationMetadataIdentifier.java         |    9 +-
 .../identifier/BaseServiceMetadataIdentifier.java  |    2 +-
 .../metadata/report/identifier/KeyTypeEnum.java    |   40 +-
 .../report/support/AbstractMetadataReport.java     |  133 +-
 .../support/ConfigCenterBasedMetadataReport.java   |  162 ++
 .../ConfigCenterBasedMetadataReportFactory.java    |   90 +
 .../file/FileSystemMetadataReportFactory.java}     |   21 +-
 .../AbstractAbstractWritableMetadataService.java   |  100 +
 ...che.dubbo.metadata.report.MetadataReportFactory |    1 +
 .../metadata/CompositeServiceNameMappingTest.java  |  107 +
 .../dubbo/metadata/MetadataConstantsTest.java}     |   19 +-
 .../dubbo/metadata/MetadataServiceTypeTest.java    |   40 +-
 .../ParameterizedServiceNameMappingTest.java       |   67 +
 .../PropertiesFileServiceNameMappingTest.java      |   60 +
 .../dubbo/metadata/ServiceNameMappingTest.java     |  121 ++
 .../metadata/definition/Test3TypeBuilder.java}     |   30 +-
 .../metadata/definition/TestTypeBuilder.java}      |   30 +-
 .../definition/TypeDefinitionBuilderTest.java      |   21 +-
 .../report/identifier/KeyTypeEnumTest.java}        |   20 +-
 .../support/AbstractMetadataReportFactoryTest.java |    9 +-
 .../report/support/AbstractMetadataReportTest.java |  121 +-
 .../ConfigCenterBasedMetadataReportTest.java       |  155 ++
 ...e.dubbo.metadata.definition.builder.TypeBuilder |    2 +
 .../META-INF/dubbo/service-name-mapping.properties |    3 +
 .../dubbo-metadata-report-consul/pom.xml           |    8 +-
 .../store/consul/ConsulMetadataReport.java         |    4 +
 .../store/consul/ConsulMetadataReportFactory.java  |   13 +-
 dubbo-metadata/dubbo-metadata-report-nacos/pom.xml |    9 +-
 .../metadata/store/nacos/NacosMetadataReport.java  |  131 +-
 .../store/nacos/NacosMetadataReportFactory.java    |   13 +-
 .../store/nacos/NacosMetadataReportTest.java       |  247 ---
 .../dubbo-metadata-report-zookeeper/pom.xml        |    2 +-
 .../store/zookeeper/ZookeeperMetadataReport.java   |   29 +
 .../zookeeper/ZookeeperMetadataReportFactory.java  |   22 +-
 .../zookeeper/ZookeeperMetadataReportTest.java     |  553 +++---
 .../dubbo/qos/legacy/InvokerTelnetHandlerTest.java |   14 +
 .../dubbo/qos/legacy/service/DemoService.java      |    2 +
 .../dubbo/qos/legacy/service/DemoServiceImpl.java  |    5 +
 .../dubbo/registry/client/ServiceInstance.java     |   22 +
 .../metadata/ServiceInstanceMetadataUtils.java     |    4 +-
 .../StandardMetadataServiceURLBuilder.java         |    1 +
 .../CompositeMetadataServiceProxyFactory.java      |  133 ++
 .../registry/integration/RegistryDirectory.java    |    4 +-
 .../integration/RegistryInvokerWrapper.java        |   18 +-
 .../registry/integration/RegistryProtocol.java     |   22 +-
 ...dubbo.registry.client.ServiceInstanceCustomizer |    3 +-
 .../client/DefaultServiceInstanceTest.java         |    9 +
 .../proxy/BaseMetadataServiceProxyFactoryTest.java |   78 +
 .../CompositeMetadataServiceProxyFactoryTest.java  |   96 +
 .../proxy/MetadataServiceProxyFactoryTest.java     |   49 +
 .../proxy/MyMetadataServiceProxyFactory.java       |   18 +-
 ...ient.metadata.proxy.MetadataServiceProxyFactory |    2 +
 .../dubbo/registry/consul/ConsulParameter.java     |   87 +
 .../dubbo/registry/consul/ConsulRegistry.java      |   32 +-
 .../registry/consul/ConsulServiceDiscovery.java    |   89 +-
 .../consul/ConsulServiceDiscoveryTest.java         |   16 +-
 .../registry/dubbo/RegistryDirectoryTest.java      |    2 +-
 .../dubbo/registry/dubbo/RegistryProtocolTest.java |    5 +-
 .../registry/eureka/EurekaServiceDiscovery.java    |    5 +-
 .../nacos/util/NacosNamingServiceUtils.java        |   48 +-
 .../remoting/http/tomcat/TomcatHttpServer.java     |   10 +-
 .../remoting/transport/netty4/NettyServer.java     |    6 +-
 .../org/apache/dubbo/rpc/AttachmentsAdapter.java   |   48 +-
 .../main/java/org/apache/dubbo/rpc/Constants.java  |    1 +
 .../org/apache/dubbo/rpc/filter/ContextFilter.java |    4 +-
 .../apache/dubbo/rpc/filter/GenericImplFilter.java |    3 +-
 .../dubbo/rpc/protocol/ProtocolFilterWrapper.java  |    2 +
 .../rpc/protocol/ProtocolListenerWrapper.java      |    2 +
 .../org/apache/dubbo/rpc/support/MockInvoker.java  |   24 +-
 .../org/apache/dubbo/rpc/support/RpcUtils.java     |   16 +-
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |    3 +-
 .../java/org/apache/dubbo/rpc/RpcContextTest.java  |    3 +-
 .../rpc/protocol/dubbo/CallbackServiceCodec.java   |    3 +
 .../protocol/dubbo/DecodeableRpcInvocation.java    |    2 +-
 .../dubbo/rpc/protocol/dubbo/DubboInvoker.java     |    6 +-
 .../rpc/protocol/dubbo/ArgumentCallbackTest.java   |   22 +
 .../protocol/webservice/WebServiceProtocol.java    |    9 +-
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |    2 +-
 .../webservice/WebserviceProtocolTest.java         |   90 +
 .../serialize/hessian2/Hessian2ObjectInput.java    |    3 +-
 .../serialize/hessian2/Hessian2ObjectOutput.java   |    3 +-
 .../hessian2/Hessian2SerializerFactory.java        |    6 +-
 .../AbstractHessian2FactoryInitializer.java}       |   21 +-
 .../DefaultHessian2FactoryInitializer.java}        |   17 +-
 .../hessian2/dubbo/Hessian2FactoryInitializer.java |   43 +
 .../dubbo/WhitelistHessian2FactoryInitializer.java |   50 +
 ...alize.hessian2.dubbo.Hessian2FactoryInitializer |    2 +
 241 files changed, 7864 insertions(+), 3997 deletions(-)

diff --cc dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
index 211d6f8,6ab3a89..ac56025
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/URL.java
@@@ -602,7 -623,42 +624,43 @@@ class URL implements Serializable 
          return Arrays.asList(strArray);
      }
  
+     /**
+      * Get parameter
+      *
+      * @param key       the key of parameter
+      * @param valueType the type of parameter value
+      * @param <T>       the type of parameter value
+      * @return get the parameter if present, or <code>null</code>
+      * @since 2.7.8
+      */
+     public <T> T getParameter(String key, Class<T> valueType) {
+         return getParameter(key, valueType, null);
+     }
+ 
+     /**
+      * Get parameter
+      *
+      * @param key          the key of parameter
+      * @param valueType    the type of parameter value
+      * @param defaultValue the default value if parameter is absent
+      * @param <T>          the type of parameter value
+      * @return get the parameter if present, or <code>defaultValue</code> will be used.
+      * @since 2.7.8
+      */
+     public <T> T getParameter(String key, Class<T> valueType, T defaultValue) {
+         String value = getParameter(key);
+         T result = null;
+         if (!isBlank(value)) {
+             result = convertIfPossible(value, valueType);
+         }
+         if (result == null) {
+             result = defaultValue;
+         }
+         return result;
+     }
+ 
 -    private Map<String, Number> getNumbers() {
++
 +    protected Map<String, Number> getNumbers() {
          // concurrent initialization is tolerant
          if (numbers == null) {
              numbers = new ConcurrentHashMap<>();
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index df3be4b,da90597..f38b80b
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
@@@ -61,7 -64,9 +64,8 @@@ import java.util.Set
  import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;
  import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;
  import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR;
+ import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SEPARATOR_CHAR;
  import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;
 -import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;
  import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;
  import static org.apache.dubbo.common.constants.CommonConstants.LOCALHOST_VALUE;
  import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY;
@@@ -335,6 -388,24 +387,18 @@@ public class ReferenceConfig<T> extend
              }
          }
  
+         if (logger.isInfoEnabled()) {
+             logger.info("Refer dubbo service " + interfaceClass.getName() + " from url " + invoker.getUrl());
+         }
 -        /**
 -         * @since 2.7.0
 -         * ServiceData Store
 -         */
 -        String metadata = map.get(METADATA_KEY);
 -        WritableMetadataService metadataService = WritableMetadataService.getExtension(metadata == null ? DEFAULT_METADATA_STORAGE_TYPE : metadata);
 -        if (metadataService != null) {
 -            URL consumerURL = new URL(CONSUMER_PROTOCOL, map.remove(REGISTER_IP_KEY), 0, map.get(INTERFACE_KEY), map);
 -            metadataService.publishServiceDefinition(consumerURL);
 -        }
++
++        URL consumerURL = new URL(CONSUMER_PROTOCOL, map.remove(REGISTER_IP_KEY), 0, map.get(INTERFACE_KEY), map);
++        MetadataUtils.publishServiceDefinition(consumerURL);
++
+         // create service proxy
+         return (T) PROXY_FACTORY.getProxy(invoker, ProtocolUtils.isGeneric(generic));
+     }
+ 
+     private void checkInvokerAvailable() throws IllegalStateException {
          if (shouldCheck() && !invoker.isAvailable()) {
              invoker.destroy();
              throw new IllegalStateException("Failed to check the status of the service "
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
index a9f2bcf,1ef096b..3806b73
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
@@@ -17,9 -17,9 +17,10 @@@
  package org.apache.dubbo.config.bootstrap;
  
  import org.apache.dubbo.common.URL;
 +import org.apache.dubbo.common.config.ConfigurationUtils;
  import org.apache.dubbo.common.config.Environment;
  import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;
+ import org.apache.dubbo.common.config.configcenter.DynamicConfigurationFactory;
  import org.apache.dubbo.common.config.configcenter.wrapper.CompositeDynamicConfiguration;
  import org.apache.dubbo.common.extension.ExtensionLoader;
  import org.apache.dubbo.common.lang.ShutdownHookCallback;
@@@ -62,14 -62,13 +63,15 @@@ import org.apache.dubbo.event.GenericEv
  import org.apache.dubbo.metadata.MetadataService;
  import org.apache.dubbo.metadata.MetadataServiceExporter;
  import org.apache.dubbo.metadata.WritableMetadataService;
+ import org.apache.dubbo.metadata.report.MetadataReportFactory;
  import org.apache.dubbo.metadata.report.MetadataReportInstance;
  import org.apache.dubbo.registry.client.DefaultServiceInstance;
 -import org.apache.dubbo.registry.client.ServiceDiscovery;
 -import org.apache.dubbo.registry.client.ServiceDiscoveryRegistry;
  import org.apache.dubbo.registry.client.ServiceInstance;
  import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;
 +import org.apache.dubbo.registry.client.metadata.MetadataUtils;
 +import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;
 +import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;
 +import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;
  import org.apache.dubbo.registry.support.AbstractRegistryFactory;
  import org.apache.dubbo.rpc.model.ApplicationModel;
  
@@@ -95,15 -97,13 +101,18 @@@ import static java.util.concurrent.Exec
  import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties;
  import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration;
  import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;
+ import static org.apache.dubbo.common.constants.CommonConstants.REGISTRY_SPLIT_PATTERN;
  import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;
+ import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;
  import static org.apache.dubbo.common.function.ThrowableAction.execute;
+ import static org.apache.dubbo.common.utils.StringUtils.isEmpty;
  import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty;
 +import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_METADATA_PUBLISH_DELAY;
 +import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PUBLISH_DELAY_KEY;
 +import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension;
 +import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.calInstanceRevision;
  import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setMetadataStorageType;
 +import static org.apache.dubbo.registry.support.AbstractRegistryFactory.getServiceDiscoveries;
  import static org.apache.dubbo.remoting.Constants.CLIENT_KEY;
  
  /**
@@@ -522,8 -524,13 +533,11 @@@ public class DubboBootstrap extends Gen
  
          checkGlobalConfigs();
  
+         // @since 2.7.8
+         startMetadataCenter();
+ 
          initMetadataService();
  
 -        initMetadataServiceExports();
 -
          initEventListener();
  
          if (logger.isInfoEnabled()) {
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceInstance.java
index 7b1890d,896af9c..d019a99
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceInstance.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceInstance.java
@@@ -84,11 -82,29 +84,33 @@@ public interface ServiceInstance extend
       */
      Map<String, String> getMetadata();
  
 +    Map<String, String> getExtendParams();
 +
 +    Map<String, String> getAllParams();
 +
      /**
+      * Get the value of metadata by the specified name
+      *
+      * @param name the specified name
+      * @return the value of metadata if found, or <code>null</code>
+      * @since 2.7.8
+      */
+     default String getMetadata(String name) {
+         return getMetadata(name, null);
+     }
+ 
+     /**
+      * Get the value of metadata by the specified name
+      *
+      * @param name the specified name
+      * @return the value of metadata if found, or <code>defaultValue</code>
+      * @since 2.7.8
+      */
+     default String getMetadata(String name, String defaultValue) {
+         return getMetadata().getOrDefault(name, defaultValue);
+     }
+ 
+     /**
       * @return the hash code of current instance.
       */
      int hashCode();
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryInvokerWrapper.java
index c6ce46f,b7e03c4..9e37c3e
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryInvokerWrapper.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryInvokerWrapper.java
@@@ -22,14 -22,14 +22,14 @@@ import org.apache.dubbo.rpc.Invoker
  import org.apache.dubbo.rpc.Result;
  import org.apache.dubbo.rpc.RpcException;
  import org.apache.dubbo.rpc.cluster.Cluster;
+ import org.apache.dubbo.rpc.cluster.ClusterInvoker;
  
- class RegistryInvokerWrapper<T> implements Invoker<T> {
+ class RegistryInvokerWrapper<T> implements ClusterInvoker<T> {
 -    private RegistryDirectory<T> directory;
 +    private DynamicDirectory<T> directory;
      private Cluster cluster;
      private Invoker<T> invoker;
-     private URL url;
  
-     public RegistryInvokerWrapper(DynamicDirectory<T> directory, Cluster cluster, Invoker<T> invoker, URL url) {
 -    public RegistryInvokerWrapper(RegistryDirectory<T> directory, Cluster cluster, Invoker<T> invoker) {
++    public RegistryInvokerWrapper(DynamicDirectory<T> directory, Cluster cluster, Invoker<T> invoker) {
          this.directory = directory;
          this.cluster = cluster;
          this.invoker = invoker;
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
index 281b0aa,9a4acc8..976d0da
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
@@@ -449,19 -446,16 +446,17 @@@ public class RegistryProtocol implement
          String group = qs.get(GROUP_KEY);
          if (group != null && group.length() > 0) {
              if ((COMMA_SPLIT_PATTERN.split(group)).length > 1 || "*".equals(group)) {
-                 return doRefer(getMergeableCluster(), registry, type, url);
+                 return doRefer(Cluster.getCluster(MergeableCluster.NAME), registry, type, url);
              }
          }
-         return doRefer(cluster, registry, type, url);
-     }
  
-     private Cluster getMergeableCluster() {
-         return ExtensionLoader.getExtensionLoader(Cluster.class).getExtension("mergeable");
+         Cluster cluster = Cluster.getCluster(qs.get(CLUSTER_KEY));
+         return doRefer(cluster, registry, type, url);
      }
  
 -    private <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url) {
 -        RegistryDirectory<T> directory = new RegistryDirectory<T>(type, url);
 +    protected <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url) {
 +        // FIXME, SPI extension, support prototype instance
 +        DynamicDirectory<T> directory = createDirectory(type, url);
          directory.setRegistry(registry);
          directory.setProtocol(protocol);
          // all attributes of REFER_KEY
diff --cc dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscovery.java
index a43edea,b05f1d8..0c330aa
--- 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
@@@ -97,13 -126,41 +126,46 @@@ public class ConsulServiceDiscovery imp
          ttlScheduler = new TtlScheduler(checkPassInterval, client);
          this.tag = registryURL.getParameter(QUERY_TAG);
          this.registeringTags.addAll(getRegisteringTags(url));
+         this.aclToken = ACL_TOKEN.getValue(registryURL);
+         this.tags = getTags(registryURL);
+         this.consistencyMode = getConsistencyMode(registryURL);
+         this.defaultZoneMetadataName = DEFAULT_ZONE_METADATA_NAME.getValue(registryURL);
+         this.instanceZone = INSTANCE_ZONE.getValue(registryURL);
+         this.instanceGroup = INSTANCE_GROUP.getValue(registryURL);
+     }
+ 
+     /**
+      * Get the {@link ConsistencyMode}
+      *
+      * @param registryURL the {@link URL} of registry
+      * @return non-null, {@link ConsistencyMode#DEFAULT} as default
+      * @sine 2.7.8
+      */
+     private ConsistencyMode getConsistencyMode(URL registryURL) {
+         String value = CONSISTENCY_MODE.getValue(registryURL);
+         if (StringUtils.isNotEmpty(value)) {
+             return ConsistencyMode.valueOf(value);
+         }
+         return ConsistencyMode.DEFAULT;
+     }
+ 
+     /**
+      * Get the "tags" from the {@link URL} of registry
+      *
+      * @param registryURL the {@link URL} of registry
+      * @return non-null
+      * @sine 2.7.8
+      */
+     private List<String> getTags(URL registryURL) {
+         String value = TAGS.getValue(registryURL);
+         return StringUtils.splitToList(value, COMMA_SEPARATOR_CHAR);
      }
  
 +    @Override
 +    public URL getUrl() {
 +        return url;
 +    }
 +
      private List<String> getRegisteringTags(URL url) {
          List<String> tags = new ArrayList<>();
          String rawTag = url.getParameter(REGISTER_TAG);