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 <[email protected]> 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);
