You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/08/31 17:09:11 UTC
[dubbo] 01/04: Merge remote-tracking branch 'apache/3.0' into
3.0-multi-instances
This is an automated email from the ASF dual-hosted git repository.
albumenj pushed a commit to branch 3.0-multi-instances
in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit 7c059611a41f17f11ff3e0fd853be1a8c3a4735c
Merge: 6c65c31 3f59150
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Tue Aug 31 17:47:12 2021 +0800
Merge remote-tracking branch 'apache/3.0' into 3.0-multi-instances
# Conflicts:
# dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
# dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
# dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
# dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
# dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/integration/multiple/servicediscoveryregistry/MultipleRegistryCenterServiceDiscoveryRegistryRegistryServiceListener.java
# dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
# dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
# dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
# dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
# dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java
# dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
# dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java
# dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
# dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
# dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
# dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/MigrationRuleListenerTest.java
# dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
# dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
# dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
# dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcResult.java
compiler/pom.xml | 2 +-
.../main/resources/Dubbo3InterfaceStub.mustache | 44 +-
compiler/src/main/resources/Dubbo3Stub.mustache | 5 +-
compiler/src/main/resources/DubboGrpcStub.mustache | 3 -
compiler/src/main/resources/DubboStub.mustache | 3 -
.../main/resources/ReactorDubboGrpcStub.mustache | 3 -
.../src/main/resources/RxDubboGrpcStub.mustache | 3 -
.../cluster/router/condition/ConditionRouter.java | 3 -
.../cluster/router/condition/config/AppRouter.java | 3 +-
.../router/condition/config/ListenableRouter.java | 4 +-
.../cluster/router/mesh/route/MeshEnvListener.java | 3 -
.../router/mesh/route/MeshEnvListenerFactory.java | 10 +-
.../cluster/router/mesh/route/MeshRuleManager.java | 5 +-
.../cluster/support/BroadcastClusterInvoker.java | 6 +-
.../absent/AbsentConfiguratorTest.java | 52 ++
.../override/OverrideConfiguratorTest.java | 49 ++
.../filter/DefaultFilterChainBuilderTest.java | 66 +++
.../dubbo/rpc/cluster/filter/DemoServiceImpl.java | 14 +-
.../apache/dubbo/rpc/cluster/filter/LogFilter.java | 36 +-
.../ShortestResponseLoadBalanceTest.java | 7 +-
.../router/mock/MockInvokersSelectorTest.java | 71 +++
.../support/BroadCastClusterInvokerTest.java | 164 +++++++
.../dubbo/internal/org.apache.dubbo.rpc.Filter | 1 +
.../dubbo/common/constants/CommonConstants.java | 29 +-
.../dubbo/common/extension/ExtensionLoader.java | 1 +
.../extension/support/WrapperComparator.java | 31 +-
.../url/component/DubboServiceAddressURL.java | 6 -
.../org/apache/dubbo/common/utils/ConfigUtils.java | 3 +-
.../org/apache/dubbo/common/utils/NetUtils.java | 55 ++-
.../org/apache/dubbo/config/AbstractConfig.java | 2 +-
.../org/apache/dubbo/config/ApplicationConfig.java | 32 +-
.../apache/dubbo/config/ConfigCenterConfig.java | 74 +--
.../apache/dubbo/config/MetadataReportConfig.java | 37 +-
.../java/org/apache/dubbo/config/ModuleConfig.java | 2 +
.../apache/dubbo/rpc/model/MethodDescriptor.java | 41 +-
.../apache/dubbo/common/utils/NetUtilsTest.java | 91 +++-
.../dubbo/config/AbstractInterfaceConfigTest.java | 70 +--
.../java/org/apache/dubbo/config/Greeting.java | 12 +-
.../org/apache/dubbo/config/GreetingLocal1.java | 9 +-
.../org/apache/dubbo/config/GreetingLocal2.java | 14 +-
.../org/apache/dubbo/config/GreetingLocal3.java | 17 +-
.../apache/dubbo/descriptor/DescriptorService.java | 5 +
.../dubbo/descriptor/MethodDescriptorTest.java | 14 +
dubbo-config/dubbo-config-api/pom.xml | 7 +
.../org/apache/dubbo/config/ReferenceConfig.java | 12 +-
.../org/apache/dubbo/config/ServiceConfig.java | 11 +-
.../dubbo/config/bootstrap/DubboBootstrap.java | 116 +++--
.../bootstrap/builders/MetadataReportBuilder.java | 36 +-
.../dubbo/config/utils/ConfigValidationUtils.java | 2 +-
.../apache/dubbo/config/ReferenceConfigTest.java | 531 ++++++++++++++++++++-
.../org/apache/dubbo/config/ServiceConfigTest.java | 6 +-
.../dubbo/config/bootstrap/DubboBootstrapTest.java | 166 ++++++-
.../org/apache/dubbo/config/url/UrlTestBase.java | 61 +--
.../config/utils/ConfigValidationUtilsTest.java | 63 +++
.../org/apache/dubbo/integration/Constants.java | 10 +-
...gistryCenterExportProviderExporterListener.java | 23 +-
...MultipleRegistryCenterExportProviderFilter.java | 86 ++++
...gistryCenterExportProviderIntegrationTest.java} | 113 +++--
...terExportProviderRegistryProtocolListener.java} | 8 +-
...ltipleRegistryCenterExportProviderService.java} | 12 +-
...leRegistryCenterExportProviderServiceImpl.java} | 16 +-
...egistryCenterExportProviderServiceListener.java | 24 +-
...MultipleRegistryCenterInjvmIntegrationTest.java | 15 +-
...terServiceDiscoveryRegistryIntegrationTest.java | 55 ++-
...ceDiscoveryRegistryRegistryServiceListener.java | 28 +-
...RegistryCenterDubboProtocolIntegrationTest.java | 26 +-
...gistryCenterExportMetadataExporterListener.java | 24 +-
...gistryCenterExportMetadataIntegrationTest.java} | 131 ++---
...SingleRegistryCenterExportMetadataService.java} | 12 +-
...leRegistryCenterExportMetadataServiceImpl.java} | 17 +-
...egistryCenterExportMetadataServiceListener.java | 25 +-
...egistryCenterExportProviderIntegrationTest.java | 67 ++-
...nterExportProviderRegistryProtocolListener.java | 4 +-
.../SingleRegistryCenterInjvmIntegrationTest.java | 16 +-
.../registrycenter/AbstractRegistryCenter.java | 107 +++++
.../DefaultMultipleRegistryCenter.java | 121 -----
.../DefaultSingleRegistryCenter.java | 101 ----
.../dubbo/registrycenter/RegistryCenter.java | 33 ++
...r.java => ZookeeperMultipleRegistryCenter.java} | 26 +-
.../registrycenter/ZookeeperRegistryCenter.java | 142 ++++++
...ter.java => ZookeeperSingleRegistryCenter.java} | 27 +-
.../org.apache.dubbo.common.status.StatusChecker | 19 +-
.../org.apache.dubbo.common.threadpool.ThreadPool | 19 +-
.../org.apache.dubbo.config.ServiceListener | 2 +
...g.apache.dubbo.registry.RegistryServiceListener | 17 -
...o.registry.integration.RegistryProtocolListener | 18 +-
.../services/org.apache.dubbo.remoting.Dispatcher | 19 +-
.../services/org.apache.dubbo.remoting.Transporter | 19 +-
.../org.apache.dubbo.remoting.exchange.Exchanger | 19 +-
.../org.apache.dubbo.remoting.telnet.TelnetHandler | 16 -
.../services/org.apache.dubbo.rpc.ExporterListener | 19 +-
.../META-INF/services/org.apache.dubbo.rpc.Filter | 1 +
.../config/spring/util/DubboAnnotationUtils.java | 3 +-
.../src/main/resources/META-INF/dubbo.xsd | 8 +-
.../org/apache/dubbo/config/spring/ConfigTest.java | 9 +-
.../dubbo/config/spring/JavaConfigBeanTest.java | 8 +-
.../annotation/MethodConfigCallbackTest.java | 8 +-
.../factory/annotation/ParameterConvertTest.java | 5 +
.../XmlReferenceBeanConditionalTest.java | 8 +-
...nfigAnnotationReferenceBeanConditionalTest.java | 8 +-
.../JavaConfigRawReferenceBeanConditionalTest.java | 8 +-
.../JavaConfigReferenceBeanConditionalTest4.java | 8 +-
.../configprops/SpringBootConfigPropsTest.java | 13 +-
.../SpringBootMultipleConfigPropsTest.java | 10 +-
.../importxml/SpringBootImportDubboXmlTest.java | 8 +-
.../annotation/DubboConfigConfigurationTest.java | 6 +-
.../context/annotation/EnableDubboConfigTest.java | 11 +-
.../spring/issues/issue6000/Issue6000Test.java | 8 +-
.../spring/issues/issue6252/Issue6252Test.java | 10 +-
.../spring/issues/issue7003/Issue7003Test.java | 8 +-
.../consumer/PropertyConfigurerTest.java | 8 +-
.../consumer2/PropertySourcesConfigurerTest.java | 8 +-
.../consumer3/PropertySourcesInJavaConfigTest.java | 25 +-
.../reference/DubboConfigBeanInitializerTest.java | 8 +-
.../config/spring/reference/ReferenceKeyTest.java | 8 +-
.../javaconfig/JavaConfigReferenceBeanTest.java | 15 +-
.../spring/reference/localcall/LocalCallTest.java | 8 +-
.../spring/reference/localcall/LocalCallTest2.java | 8 +-
.../registrycenter/AbstractRegistryCenter.java | 107 +++++
.../DefaultSingleRegistryCenter.java | 101 ----
.../spring/registrycenter/RegistryCenter.java | 33 ++
...r.java => ZookeeperMultipleRegistryCenter.java} | 42 +-
.../registrycenter/ZookeeperRegistryCenter.java | 142 ++++++
...ter.java => ZookeeperSingleRegistryCenter.java} | 27 +-
.../config/spring/schema/GenericServiceTest.java | 15 +-
dubbo-dependencies-bom/pom.xml | 2 +-
dubbo-distribution/dubbo-all/pom.xml | 12 +
.../org/apache/dubbo/metadata/MetadataInfo.java | 63 ++-
.../apache/dubbo/metadata/ServiceNameMapping.java | 2 +-
.../metadata/report/MetadataReportInstance.java | 7 +-
.../support/AbstractMetadataReportFactory.java | 34 +-
.../apache/dubbo/metadata/MetadataInfoTest.java | 99 +++-
.../CustomizedParamsFilter.java} | 19 +-
.../metadata/filter/ExcludedParamsFilter.java | 26 +-
.../org.apache.dubbo.metadata.MetadataParamsFilter | 3 +-
.../apache/dubbo/auth/AccessKeyAuthenticator.java | 2 +-
.../dubbo/auth/AccessKeyAuthenticatorTest.java | 2 +-
.../dubbo/registry/ListenerRegistryWrapper.java | 8 +-
.../dubbo/registry/ProviderFirstParams.java} | 10 +-
.../registry/client/DefaultServiceInstance.java | 7 +-
.../dubbo/registry/client/InstanceAddressURL.java | 26 +-
.../registry/client/ServiceDiscoveryRegistry.java | 100 +---
.../client/ServiceDiscoveryRegistryDirectory.java | 22 +-
.../dubbo/registry/client/ServiceInstance.java | 11 -
.../listener/ServiceInstancesChangedListener.java | 42 +-
.../metadata/MetadataServiceNameMapping.java | 58 +--
...MetadataServiceURLParamsMetadataCustomizer.java | 3 +
.../registry/client/metadata/MetadataUtils.java | 33 +-
.../ServiceInstanceMetadataCustomizer.java | 42 +-
.../metadata/ServiceInstanceMetadataUtils.java | 42 +-
.../store/InMemoryWritableMetadataService.java | 2 +-
.../metadata/store/RemoteMetadataServiceImpl.java | 2 +-
.../client/migration/MigrationRuleHandler.java | 11 +-
.../client/migration/MigrationRuleListener.java | 33 +-
.../client/migration/model/MigrationRule.java | 3 +
.../registry/integration/RegistryProtocol.java | 31 +-
.../registry/support/AbstractRegistryFactory.java | 53 +-
.../support/CacheableFailbackRegistry.java | 15 +-
.../support/DefaultProviderFirstParams.java | 25 +-
.../org.apache.dubbo.registry.ProviderFirstParams | 1 +
.../java/org/apache/dubbo/registry/MockLogger.java | 135 ++++++
.../client/DefaultServiceInstanceTest.java | 62 ++-
.../registry/client/InstanceAddressURLTest.java | 160 +++++++
.../client/ServiceDiscoveryRegistryTest.java | 248 ++++++++++
.../MockServiceInstancesChangedListener.java | 46 ++
.../ServiceInstancesChangedListenerTest.java | 61 ++-
.../metadata/MetadataServiceNameMappingTest.java | 134 ++++++
.../ProtocolPortsMetadataCustomizerTest.java | 101 ++++
.../ServiceInstanceMetadataCustomizerTest.java | 126 +++++
.../metadata/store/CustomizedParamsFilter.java | 22 +-
.../metadata/store/ExcludedParamsFilter.java | 16 +-
.../store/InMemoryMetadataServiceTest.java | 175 +++++++
.../store/RemoteMetadataServiceImplTest.java} | 7 +-
.../client/migration/MigrationInvokerTest.java | 8 +
.../client/migration/MigrationRuleHandlerTest.java | 26 +
.../migration/MigrationRuleListenerTest.java | 174 ++++++-
.../client/migration/model/MigrationRuleTest.java | 106 ++--
.../DemoService.java} | 9 +-
.../DemoService2.java} | 9 +-
.../support/ServiceOrientedRegistryTest.java | 16 +-
.../org.apache.dubbo.metadata.MetadataParamsFilter | 2 +
.../KubernetesMeshEnvListenerFactory.java | 51 +-
...uster.router.mesh.route.MeshEnvListenerFactory} | 2 +-
.../dubbo/registry/multiple/MultipleRegistry.java | 2 +-
.../multiple/MultipleServiceDiscovery.java | 2 +-
.../registry/nacos/NacosNamingServiceWrapper.java | 4 +
.../apache/dubbo/registry/nacos/NacosRegistry.java | 16 +-
.../registry/nacos/NacosServiceDiscovery.java | 26 +-
.../nacos/util/NacosNamingServiceUtils.java | 15 -
.../zookeeper/ZookeeperServiceDiscovery.java | 9 +-
.../zookeeper/util/CuratorFrameworkUtils.java | 39 +-
.../dubbo/remoting/transport/AbstractClient.java | 13 +-
.../java/org/apache/dubbo/rpc/HeaderFilter.java | 11 +-
.../apache/dubbo/rpc/filter/TokenHeaderFilter.java | 49 ++
.../dubbo/rpc/listener/ListenerInvokerWrapper.java | 7 +
.../dubbo/rpc/protocol/AbstractProtocol.java | 8 +-
.../apache/dubbo/rpc/support/AccessLogData.java | 7 +-
.../org/apache/dubbo/rpc/support/MockInvoker.java | 7 +-
.../internal/org.apache.dubbo.rpc.HeaderFilter | 1 +
.../dubbo/rpc/protocol/CountInvokerListener.java | 28 +-
.../rpc/protocol/ProtocolListenerWrapperTest.java | 81 ++++
.../org/apache/dubbo/rpc/support/DemoServiceA.java | 9 +-
.../apache/dubbo/rpc/support/DemoServiceAMock.java | 12 +-
.../org/apache/dubbo/rpc/support/DemoServiceB.java | 9 +-
.../apache/dubbo/rpc/support/DemoServiceBMock.java | 11 +-
.../apache/dubbo/rpc/support/MockInvokerTest.java | 25 +
.../internal/org.apache.dubbo.rpc.InvokerListener | 1 +
.../rpc/protocol/dubbo/DecodeableRpcResult.java | 13 +-
.../rpc/protocol/dubbo/DubboCodecSupport.java | 18 +-
.../dubbo/rpc/protocol/dubbo/DubboProtocol.java | 6 +-
.../dubbo/rpc/protocol/injvm/InjvmExporter.java | 2 +-
.../dubbo/rpc/protocol/injvm/InjvmInvoker.java | 2 +-
.../rpc/protocol/injvm/InjvmProtocolTest.java | 19 +-
.../rpc/protocol/tri/AbstractClientStream.java | 6 +-
.../rpc/protocol/tri/AbstractServerStream.java | 23 +-
.../dubbo/rpc/protocol/tri/AbstractStream.java | 54 ++-
.../dubbo/rpc/protocol/tri/ClientStream.java | 8 +-
.../rpc/protocol/tri/ClientTransportObserver.java | 6 +-
.../dubbo/rpc/protocol/tri/ServerStream.java | 49 +-
.../rpc/protocol/tri/ServerTransportObserver.java | 8 +-
...Serialization.java => SingleProtobufUtils.java} | 64 ++-
.../org/apache/dubbo/rpc/protocol/tri/Stream.java | 46 +-
.../dubbo/rpc/protocol/tri/TransportObserver.java | 20 +-
.../rpc/protocol/tri/TripleClientHandler.java | 16 +-
.../protocol/tri/TripleClientInboundHandler.java | 2 +-
.../tri/TripleHttp2ClientResponseHandler.java | 6 +-
.../tri/TripleHttp2FrameServerHandler.java | 6 +-
.../protocol/tri/TripleServerInboundHandler.java | 2 +-
.../apache/dubbo/rpc/protocol/tri/TripleUtil.java | 6 +-
.../dubbo/rpc/protocol/tri/UnaryClientStream.java | 11 +-
.../dubbo/rpc/protocol/tri/UnaryServerStream.java | 18 +-
.../rpc/protocol/tri/UnaryClientStreamTest.java | 2 +-
232 files changed, 5513 insertions(+), 2091 deletions(-)
diff --cc dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleManager.java
index 6e988f9,b07fede..c64d780
--- a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleManager.java
+++ b/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/router/mesh/route/MeshRuleManager.java
@@@ -40,10 -42,11 +42,11 @@@ public final class MeshRuleManager
MeshAppRuleListener meshAppRuleListener = new MeshAppRuleListener(app);
String appRuleDataId = app + MESH_RULE_DATA_ID_SUFFIX;
- DynamicConfiguration configuration = ApplicationModel.getEnvironment().getDynamicConfiguration()
+ DynamicConfiguration configuration = ApplicationModel.defaultModel().getApplicationEnvironment().getDynamicConfiguration()
.orElse(null);
- Set<MeshEnvListener> envListeners = ExtensionLoader.getExtensionLoader(MeshEnvListener.class).getSupportedExtensionInstances();
+ Set<MeshEnvListenerFactory> envListenerFactories = ExtensionLoader.getExtensionLoader(MeshEnvListenerFactory.class).getSupportedExtensionInstances();
+ Set<MeshEnvListener> envListeners = envListenerFactories.stream().map(MeshEnvListenerFactory::getListener).filter(Objects::nonNull).collect(Collectors.toSet());
if (configuration == null && envListeners.stream().noneMatch(MeshEnvListener::isEnable)) {
logger.warn("Doesn't support Configuration!");
diff --cc dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
index 67de259,7c59e88..c1019ea
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/CommonConstants.java
@@@ -448,7 -464,12 +464,16 @@@ public interface CommonConstants
String SERVICE_NAME_MAPPING_KEY = "service-name-mapping";
+ String SCOPE_MODEL = "scopeModel";
+
+ String SERVICE_MODEL = "serviceModel";
++
+ /**
+ * The property name for {@link NetworkInterface#getDisplayName() the name of network interface} that
+ * the Dubbo application will be ignored
+ *
+ * @since 2.7.6
+ */
+ String DUBBO_NETWORK_IGNORED_INTERFACE = "dubbo.network.interface.ignored";
+
}
diff --cc dubbo-common/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
index 4133f0e,412122e..59ff045
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
@@@ -131,13 -149,11 +149,13 @@@ public class ConfigCenterConfig extend
if (StringUtils.isEmpty(map.get(PROTOCOL_KEY))) {
map.put(PROTOCOL_KEY, ZOOKEEPER_PROTOCOL);
}
- return UrlUtils.parseURL(address, map);
+ URL url = UrlUtils.parseURL(address, map);
+ url.setScopeModel(getScopeModel());
+ return url;
}
- public boolean checkOrUpdateInited() {
- return inited.compareAndSet(false, true);
+ public boolean checkOrUpdateInitialized(boolean update) {
+ return initialized.compareAndSet(false, update);
}
public Map<String, String> getExternalConfiguration() {
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
index c66202f,04511e2..2f2e4cc
--- 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
@@@ -44,6 -45,6 +44,7 @@@ import org.apache.dubbo.rpc.model.Async
import org.apache.dubbo.rpc.model.ConsumerModel;
import org.apache.dubbo.rpc.model.ServiceDescriptor;
import org.apache.dubbo.rpc.model.ServiceRepository;
++import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;
import org.apache.dubbo.rpc.service.GenericService;
import org.apache.dubbo.rpc.support.ProtocolUtils;
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
index 7ce2e3f,4c07ecc..ec49581
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java
@@@ -208,10 -197,8 +208,8 @@@ public class ServiceConfig<T> extends S
this.bootstrap.service(this);
// load ServiceListeners from extension
- ExtensionLoader<ServiceListener> extensionLoader = ExtensionLoader.getExtensionLoader(ServiceListener.class);
+ ExtensionLoader<ServiceListener> extensionLoader = this.getExtensionLoader(ServiceListener.class);
this.serviceListeners.addAll(extensionLoader.getSupportedExtensionInstances());
-
- this.checkAndUpdateSubConfigs();
}
initServiceMetadata(provider);
diff --cc dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/DubboBootstrap.java
index 584544f,19d924d..ec51a07
--- 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
@@@ -113,7 -111,7 +113,8 @@@ import static org.apache.dubbo.common.u
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.registry.client.metadata.ServiceInstanceMetadataUtils.calInstanceRevision;
+ import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension;
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;
@@@ -160,47 -158,46 +161,50 @@@ public final class DubboBootstrap
private final ExecutorService executorService = newSingleThreadExecutor();
- private final ExecutorRepository executorRepository = getExtensionLoader(ExecutorRepository.class).getDefaultExtension();
+ private ExecutorRepository executorRepository;
+
+ private final ApplicationModel applicationModel;
- private final ConfigManager configManager;
+ protected ScheduledFuture<?> asyncMetadataFuture;
- private final Environment environment;
+ protected final ConfigManager configManager;
- private ReferenceConfigCache cache;
+ protected final Environment environment;
- private AtomicBoolean initialized = new AtomicBoolean(false);
+ protected ReferenceConfigCache cache;
- private AtomicBoolean started = new AtomicBoolean(false);
+ protected AtomicBoolean initialized = new AtomicBoolean(false);
- private AtomicBoolean startup = new AtomicBoolean(true);
+ protected AtomicBoolean started = new AtomicBoolean(false);
- private AtomicBoolean destroyed = new AtomicBoolean(false);
+ protected AtomicBoolean startup = new AtomicBoolean(true);
- private AtomicBoolean shutdown = new AtomicBoolean(false);
+ protected AtomicBoolean destroyed = new AtomicBoolean(false);
- private volatile boolean isCurrentlyInStart = false;
+ protected AtomicBoolean shutdown = new AtomicBoolean(false);
- private volatile ServiceInstance serviceInstance;
+ protected volatile boolean isCurrentlyInStart = false;
- private volatile MetadataService metadataService;
+ protected volatile ServiceInstance serviceInstance;
- private volatile MetadataServiceExporter metadataServiceExporter;
+ protected volatile MetadataService metadataService;
- private List<ServiceConfigBase<?>> exportedServices = new ArrayList<>();
+ protected volatile MetadataServiceExporter metadataServiceExporter;
- private final List<CompletableFuture<?>> asyncExportingFutures = new ArrayList<>();
+ protected List<ServiceConfigBase<?>> exportedServices = new ArrayList<>();
- private final List<CompletableFuture<?>> asyncReferringFutures = new ArrayList<>();
+ protected final List<CompletableFuture<?>> asyncExportingFutures = new ArrayList<>();
- private boolean asyncExportFinish = true;
+ protected final List<CompletableFuture<?>> asyncReferringFutures = new ArrayList<>();
- private boolean asyncReferFinish = true;
- protected volatile boolean asyncExportFinish = true;
++ protected boolean asyncExportFinish = true;
+
+ protected volatile boolean asyncReferFinish = true;
+
+ protected static boolean ignoreConfigState;
- private static boolean ignoreConfigState;
+ private Module currentModule;
+
/**
* See {@link ApplicationModel} and {@link ExtensionLoader} for why DubboBootstrap is designed to be singleton.
*/
@@@ -1495,29 -1451,38 +1512,34 @@@
}
private void referServices() {
- if (cache == null) {
- cache = ReferenceConfigCache.getCache();
- }
-
configManager.getReferences().forEach(rc -> {
- // TODO, compatible with ReferenceConfig.refer()
- ReferenceConfig<?> referenceConfig = (ReferenceConfig<?>) rc;
- referenceConfig.setBootstrap(this);
- if (!referenceConfig.isRefreshed()) {
- referenceConfig.refresh();
- }
-
- if (rc.shouldInit()) {
- if (rc.shouldReferAsync()) {
- ExecutorService executor = executorRepository.getServiceReferExecutor();
- CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
- try {
- cache.get(rc);
- } catch (Throwable t) {
- logger.error("refer async catch error : " + t.getMessage(), t);
- }
- }, executor);
+ try {
+ // TODO, compatible with ReferenceConfig.refer()
+ ReferenceConfig<?> referenceConfig = (ReferenceConfig<?>) rc;
+ referenceConfig.setBootstrap(this);
+ if (!referenceConfig.isRefreshed()) {
+ referenceConfig.refresh();
+ }
- asyncReferringFutures.add(future);
- } else {
- cache.get(rc);
+ if (rc.shouldInit()) {
+ if (rc.shouldReferAsync()) {
+ ExecutorService executor = executorRepository.getServiceReferExecutor();
+ CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+ try {
+ cache.get(rc);
+ } catch (Throwable t) {
+ logger.error("refer async catch error : " + t.getMessage(), t);
+ }
+ }, executor);
+
+ asyncReferringFutures.add(future);
+ } else {
+ cache.get(rc);
+ }
}
+ } catch (Throwable t) {
+ logger.error("refer catch error", t);
+ cache.destroy(rc);
}
});
}
@@@ -1550,10 -1519,10 +1572,10 @@@
registered = false;
logger.error("Register instance error", e);
}
- if(registered){
+ if (registered) {
// scheduled task for updating Metadata and ServiceInstance
- executorRepository.nextScheduledExecutor().scheduleAtFixedRate(() -> {
+ asyncMetadataFuture = executorRepository.nextScheduledExecutor().scheduleAtFixedRate(() -> {
- InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();
+ InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension(applicationModel);
localMetadataService.blockUntilUpdated();
try {
ServiceInstanceMetadataUtils.refreshMetadataAndInstance(serviceInstance);
@@@ -1566,34 -1535,6 +1588,35 @@@
}
}
+ private void doRegisterServiceInstance(ServiceInstance serviceInstance) {
+ // register instance only when at least one service is exported.
+ if (serviceInstance.getPort() > 0) {
+ publishMetadataToRemote(serviceInstance);
+ logger.info("Start registering instance address to registry.");
+ getServiceDiscoveries().forEach(serviceDiscovery ->
+ {
+ ServiceInstance serviceInstanceForRegistry = new DefaultServiceInstance((DefaultServiceInstance) serviceInstance);
+ calInstanceRevision(serviceDiscovery, serviceInstanceForRegistry);
+ if (logger.isDebugEnabled()) {
+ logger.info("Start registering instance address to registry" + serviceDiscovery.getUrl() + ", instance " + serviceInstanceForRegistry);
+ }
+ // register metadata
+ serviceDiscovery.register(serviceInstanceForRegistry);
+ });
+ }
+ }
+
+ private void publishMetadataToRemote(ServiceInstance serviceInstance) {
+// InMemoryWritableMetadataService localMetadataService = (InMemoryWritableMetadataService)WritableMetadataService.getDefaultExtension();
+// localMetadataService.blockUntilUpdated();
+ if (logger.isInfoEnabled()) {
+ logger.info("Start publishing metadata to remote center, this only makes sense for applications enabled remote metadata center.");
+ }
+ RemoteMetadataServiceImpl remoteMetadataService = applicationModel.getBeanFactory().getBean(RemoteMetadataServiceImpl.class);
+ remoteMetadataService.publishMetadata(serviceInstance.getServiceName());
+ }
+
++
private void unregisterServiceInstance() {
if (serviceInstance != null) {
getServiceDiscoveries().forEach(serviceDiscovery -> {
diff --cc dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
index ece4e47,45841ad..84a9807
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
@@@ -22,10 -30,21 +30,22 @@@ import org.apache.dubbo.config.annotati
import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.config.api.DemoService;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+ import org.apache.dubbo.config.context.ConfigManager;
import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
+
+ import org.apache.dubbo.metadata.report.MetadataReport;
+ import org.apache.dubbo.metadata.report.MetadataReportInstance;
+ import org.apache.dubbo.rpc.Exporter;
+ import org.apache.dubbo.rpc.ProxyFactory;
+ import org.apache.dubbo.rpc.listener.ListenerInvokerWrapper;
import org.apache.dubbo.rpc.model.ApplicationModel;
+
import org.apache.curator.test.TestingServer;
+ import org.apache.dubbo.rpc.model.ConsumerModel;
+ import org.apache.dubbo.rpc.model.ServiceMetadata;
+ import org.apache.dubbo.rpc.model.ServiceRepository;
+ import org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker;
+ import org.apache.dubbo.rpc.protocol.injvm.InjvmProtocol;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
diff --cc dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/JavaConfigBeanTest.java
index b3ccfdd,43be931..2f216c0
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/JavaConfigBeanTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/JavaConfigBeanTest.java
@@@ -28,12 -28,10 +28,12 @@@ import org.apache.dubbo.config.context.
import org.apache.dubbo.config.spring.api.DemoService;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.apache.dubbo.config.spring.impl.DemoServiceImpl;
- import org.apache.dubbo.config.spring.registrycenter.DefaultSingleRegistryCenter;
- import org.apache.dubbo.config.spring.registrycenter.SingleRegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
import org.apache.dubbo.rpc.Constants;
import org.apache.dubbo.rpc.model.ApplicationModel;
+
+import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
diff --cc dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigTest.java
index d934565,666e0f1..4c309df
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/context/annotation/EnableDubboConfigTest.java
@@@ -23,11 -23,12 +23,12 @@@ import org.apache.dubbo.config.MonitorC
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.ProviderConfig;
import org.apache.dubbo.config.RegistryConfig;
-
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.config.context.ConfigManager;
- import org.apache.dubbo.config.spring.registrycenter.ZooKeeperServer;
+ import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.ZookeeperMultipleRegistryCenter;
import org.apache.dubbo.rpc.model.ApplicationModel;
+
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
diff --cc dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue7003/Issue7003Test.java
index 72bb370,869770b..e5714d4
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue7003/Issue7003Test.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/issues/issue7003/Issue7003Test.java
@@@ -22,10 -22,9 +22,10 @@@ import org.apache.dubbo.config.bootstra
import org.apache.dubbo.config.spring.ReferenceBean;
import org.apache.dubbo.config.spring.api.HelloService;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
- import org.apache.dubbo.config.spring.registrycenter.DefaultSingleRegistryCenter;
- import org.apache.dubbo.config.spring.registrycenter.SingleRegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.ZookeeperSingleRegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
import org.apache.dubbo.rpc.model.ApplicationModel;
+
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
diff --cc dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
index 7fdb76d,f93bf06..73ca355
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
@@@ -24,19 -24,17 +24,21 @@@ import org.apache.dubbo.config.spring.R
import org.apache.dubbo.config.spring.api.DemoService;
import org.apache.dubbo.config.spring.api.HelloService;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.apache.dubbo.config.spring.extension.SpringExtensionFactory;
+import org.apache.dubbo.config.spring.extension.SpringExtensionInjector;
import org.apache.dubbo.config.spring.impl.HelloServiceImpl;
import org.apache.dubbo.config.spring.reference.ReferenceBeanBuilder;
+import org.apache.dubbo.config.spring.registrycenter.ZooKeeperServer;
+ import org.apache.dubbo.config.spring.registrycenter.RegistryCenter;
+ import org.apache.dubbo.config.spring.registrycenter.ZookeeperMultipleRegistryCenter;
import org.apache.dubbo.rpc.service.GenericException;
import org.apache.dubbo.rpc.service.GenericService;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@@ -62,14 -52,15 +56,17 @@@ public class JavaConfigReferenceBeanTes
@BeforeEach
public void setUp() {
+ multipleRegistryCenter = new ZookeeperMultipleRegistryCenter();
+ multipleRegistryCenter.startup();
DubboBootstrap.reset();
+ SpringExtensionInjector.clearContexts();
}
@AfterEach
public void tearDown() {
DubboBootstrap.reset();
+ multipleRegistryCenter.shutdown();
+ SpringExtensionInjector.clearContexts();
}
@Test
diff --cc dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
index c63b09a1,08040ee..9484ebd
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/MetadataReportInstance.java
@@@ -50,16 -49,18 +50,19 @@@ public class MetadataReportInstance
if (METADATA_REPORT_KEY.equals(url.getProtocol())) {
String protocol = url.getParameter(METADATA_REPORT_KEY, DEFAULT_DIRECTORY);
url = URLBuilder.from(url)
- .setProtocol(protocol)
- .removeParameter(METADATA_REPORT_KEY)
- .build();
+ .setProtocol(protocol)
+ .setScopeModel(config.getScopeModel())
+ .removeParameter(METADATA_REPORT_KEY)
+ .build();
}
- url = url.addParameterIfAbsent(APPLICATION_KEY, ApplicationModel.getApplicationConfig().getName());
+ url = url.addParameterIfAbsent(APPLICATION_KEY, applicationModel.getCurrentConfig().getName());
String relatedRegistryId = config.getRegistry() == null ? DEFAULT_KEY : config.getRegistry();
-// RegistryConfig registryConfig = ApplicationModel.getConfigManager().getRegistry(relatedRegistryId)
+// RegistryConfig registryConfig = applicationModel.getConfigManager().getRegistry(relatedRegistryId)
// .orElseThrow(() -> new IllegalStateException("Registry id " + relatedRegistryId + " does not exist."));
- metadataReports.put(relatedRegistryId, metadataReportFactory.getMetadataReport(url));
+ MetadataReport metadataReport = metadataReportFactory.getMetadataReport(url);
+ if (metadataReport != null) {
+ metadataReports.put(relatedRegistryId, metadataReport);
+ }
init.set(true);
}
@@@ -80,9 -81,9 +83,9 @@@
}
- private static void checkInit() {
+ private void checkInit() {
if (!init.get()) {
- throw new IllegalStateException("the metadata report was not inited.");
+ throw new IllegalStateException("the metadata report was not initialized.");
}
}
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
index e5fa427,e6b5923..bfdc191
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java
@@@ -29,9 -27,8 +29,10 @@@ import java.util.Objects
import java.util.SortedMap;
import java.util.TreeMap;
+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.SCOPE_MODEL;
import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.ENDPOINTS;
+ import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.EXPORTED_SERVICES_REVISION_PROPERTY_NAME;
/**
* The default implementation of {@link ServiceInstance}.
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java
index 44357c7,8aca204..1eaa2dd
--- 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
@@@ -102,9 -87,16 +87,16 @@@ public class ServiceDiscoveryRegistry i
public ServiceDiscoveryRegistry(URL registryURL) {
this.registryURL = registryURL;
this.serviceDiscovery = createServiceDiscovery(registryURL);
- this.writableMetadataService = WritableMetadataService.getDefaultExtension();
+ this.writableMetadataService = WritableMetadataService.getDefaultExtension(registryURL.getScopeModel());
}
+ // Currently for test purpose
+ protected ServiceDiscoveryRegistry(URL registryURL, ServiceDiscovery serviceDiscovery, WritableMetadataService writableMetadataService) {
+ this.registryURL = registryURL;
+ this.serviceDiscovery = serviceDiscovery;
+ this.writableMetadataService = writableMetadataService;
+ }
+
public ServiceDiscovery getServiceDiscovery() {
return serviceDiscovery;
}
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
index ba4f958,bf982dc..108292a
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java
@@@ -60,12 -61,24 +62,29 @@@ public class ServiceDiscoveryRegistryDi
private volatile boolean enableConfigurationListen = true;
private volatile List<URL> originalUrls = null; // initial for null
private volatile Map<String, String> overrideQueryMap;
+ private volatile Map<String, String> consumerFirstQueryMap;
+ private final ApplicationModel applicationModel;
public ServiceDiscoveryRegistryDirectory(Class<T> serviceType, URL url) {
super(serviceType, url);
+ applicationModel = getApplicationModel(url.getScopeModel());
+ consumerConfigurationListener = new ConsumerConfigurationListener(applicationModel);
++
+ Set<ProviderFirstParams> providerFirstParams = ExtensionLoader.getExtensionLoader(ProviderFirstParams.class).getSupportedExtensionInstances();
+ if (CollectionUtils.isEmpty(providerFirstParams)) {
+ consumerFirstQueryMap = queryMap;
+ } else {
+ consumerFirstQueryMap = new HashMap<>(queryMap);
+ for (ProviderFirstParams paramsFilter : providerFirstParams) {
+ if (paramsFilter.params() == null) {
+ break;
+ }
+ for (String keyToRemove : paramsFilter.params()) {
+ consumerFirstQueryMap.remove(keyToRemove);
+ }
+ }
+ }
++
}
@Override
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java
index 4a63368,018d665..c963b72
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java
@@@ -29,10 -29,8 +29,9 @@@ import org.apache.dubbo.metadata.report
import org.apache.dubbo.metadata.report.MetadataReportInstance;
import org.apache.dubbo.registry.client.RegistryClusterIdentifier;
import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.ScopeModelAware;
import java.util.Collections;
- import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@@ -46,77 -45,63 +45,70 @@@ public class MetadataServiceNameMappin
private static final List<String> IGNORED_SERVICE_INTERFACES = Collections.singletonList(MetadataService.class.getName());
private static final int CAS_RETRY_TIMES = 6;
+ private MetadataReportInstance metadataReportInstance;
@Override
- public void map(URL url) {
- execute(() -> {
+ public boolean map(URL url) {
- if (CollectionUtils.isEmpty(ApplicationModel.getConfigManager().getMetadataConfigs())) {
- return false;
- }
- String serviceInterface = url.getServiceInterface();
- if (IGNORED_SERVICE_INTERFACES.contains(serviceInterface)) {
- return false;
- }
- String registryCluster = getRegistryCluster(url);
- MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);
-
- if (metadataReport.registerServiceAppMapping(serviceInterface, getName(), url)) {
- // MetadataReport support directly register service-app mapping
- return true;
- }
+ if (CollectionUtils.isEmpty(applicationModel.getApplicationConfigManager().getMetadataConfigs())) {
- return;
++ return false;
+ }
+ String serviceInterface = url.getServiceInterface();
+ if (IGNORED_SERVICE_INTERFACES.contains(serviceInterface)) {
- return;
++ return false;
+ }
+ String registryCluster = getRegistryCluster(url);
+ MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryCluster);
- int currentRetryTimes = 1;
- boolean succeeded = false;
- String newConfigContent = getName();
- do {
- ConfigItem configItem = metadataReport.getConfigItem(serviceInterface, DEFAULT_MAPPING_GROUP);
- String oldConfigContent = configItem.getContent();
- if (StringUtils.isNotEmpty(oldConfigContent)) {
- boolean contains = StringUtils.isContains(oldConfigContent, getName());
- if (contains) {
- break;
- }
- newConfigContent = oldConfigContent + COMMA_SEPARATOR + getName();
+ String appName = applicationModel.getApplicationName();
+ if (metadataReport.registerServiceAppMapping(serviceInterface, appName, url)) {
+ // MetadataReport support directly register service-app mapping
- return;
++ return true;
}
- succeeded = metadataReport.registerServiceAppMapping(serviceInterface, DEFAULT_MAPPING_GROUP, newConfigContent, configItem.getTicket());
- } while (!succeeded && currentRetryTimes++ <= CAS_RETRY_TIMES);
- if (!succeeded) {
+ int currentRetryTimes = 1;
- boolean success;
++ boolean succeeded = false;
+ String newConfigContent = appName;
+ do {
+ ConfigItem configItem = metadataReport.getConfigItem(serviceInterface, DEFAULT_MAPPING_GROUP);
+ String oldConfigContent = configItem.getContent();
+ if (StringUtils.isNotEmpty(oldConfigContent)) {
+ boolean contains = StringUtils.isContains(oldConfigContent, appName);
+ if (contains) {
+ break;
+ }
+ newConfigContent = oldConfigContent + COMMA_SEPARATOR + appName;
+ }
- success = metadataReport.registerServiceAppMapping(serviceInterface, DEFAULT_MAPPING_GROUP, newConfigContent, configItem.getTicket());
- } while (!success && currentRetryTimes++ <= CAS_RETRY_TIMES);
- });
++ succeeded = metadataReport.registerServiceAppMapping(serviceInterface, DEFAULT_MAPPING_GROUP, newConfigContent, configItem.getTicket());
++ } while (!succeeded && currentRetryTimes++ <= CAS_RETRY_TIMES);
++ if (!succeeded) {
+ throw new RuntimeException();
+ }
+
+ return true;
}
@Override
public Set<String> get(URL url) {
- Set<String> serviceNames = new LinkedHashSet<>();
- execute(() -> {
- String serviceInterface = url.getServiceInterface();
- String registryCluster = getRegistryCluster(url);
- MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryCluster);
- Set<String> apps = metadataReport.getServiceAppMapping(serviceInterface, url);
- serviceNames.addAll(apps);
- });
- return serviceNames;
+ String serviceInterface = url.getServiceInterface();
+ String registryCluster = getRegistryCluster(url);
- MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);
++ MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryCluster);
+ return metadataReport.getServiceAppMapping(serviceInterface, url);
}
@Override
public Set<String> getAndListen(URL url, MappingListener mappingListener) {
- Set<String> serviceNames = new LinkedHashSet<>();
- execute(() -> {
- String serviceInterface = url.getServiceInterface();
- String registryCluster = getRegistryCluster(url);
- MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryCluster);
- Set<String> apps = metadataReport.getServiceAppMapping(serviceInterface, mappingListener, url);
- serviceNames.addAll(apps);
- });
- return serviceNames;
+ String serviceInterface = url.getServiceInterface();
+ String registryCluster = getRegistryCluster(url);
- MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);
++ MetadataReport metadataReport = metadataReportInstance.getMetadataReport(registryCluster);
+ return metadataReport.getServiceAppMapping(serviceInterface, mappingListener, url);
}
+ @Override
+ public void setApplicationModel(ApplicationModel applicationModel) {
+ super.setApplicationModel(applicationModel);
+ metadataReportInstance = applicationModel.getBeanFactory().getBean(MetadataReportInstance.class);
+ }
+
protected String getRegistryCluster(URL url) {
String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);
if (registryCluster == null) {
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
index cc0f612,b3d6efb..ea0723c
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java
@@@ -40,14 -58,12 +58,14 @@@ public class ServiceInstanceMetadataCus
@Override
public void customize(ServiceInstance serviceInstance) {
- ExtensionLoader<MetadataParamsFilter> loader = ExtensionLoader.getExtensionLoader(MetadataParamsFilter.class);
+ ApplicationModel applicationModel = serviceInstance.getApplicationModel();
+ ExtensionLoader<MetadataParamsFilter> loader = applicationModel.getExtensionLoader(MetadataParamsFilter.class);
+ Set<MetadataParamsFilter> paramsFilters = loader.getSupportedExtensionInstances();
InMemoryWritableMetadataService localMetadataService
- = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();
+ = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension(applicationModel);
// pick the first interface metadata available.
- // FIXME, check the same key in different urls has the same value
+ // FIXME, check the same key in different urls have the same value
Map<String, MetadataInfo> metadataInfos = localMetadataService.getMetadataInfos();
if (CollectionUtils.isEmptyMap(metadataInfos)) {
return;
@@@ -57,19 -73,19 +75,19 @@@
return;
}
MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServices().values().iterator().next();
- Map<String, String> allParams = new HashMap<>(serviceInfo.getUrl().getParameters());
+ URL url = serviceInfo.getUrl();
+ List<MetadataParamsFilter> paramsFilters = loader.getActivateExtension(url, "params-filter");
+ Map<String, String> allParams = new HashMap<>(url.getParameters());
// load instance params users want to load.
- // TODO, duplicate logic with that in ApplicationConfig
+ // TODO, duplicate snippet in ApplicationConfig
+ Map<String, String> extraParameters = Collections.emptyMap();
- Set<InfraAdapter> adapters = ExtensionLoader.getExtensionLoader(InfraAdapter.class).getSupportedExtensionInstances();
+ Set<InfraAdapter> adapters = applicationModel.getExtensionLoader(InfraAdapter.class).getSupportedExtensionInstances();
if (CollectionUtils.isNotEmpty(adapters)) {
Map<String, String> inputParameters = new HashMap<>();
- inputParameters.put(APPLICATION_KEY, ApplicationModel.getName());
+ inputParameters.put(APPLICATION_KEY, applicationModel.getApplicationName());
for (InfraAdapter adapter : adapters) {
- Map<String, String> extraParameters = adapter.getExtraAttributes(inputParameters);
- if (CollectionUtils.isNotEmptyMap(extraParameters)) {
- extraParameters.forEach(allParams::putIfAbsent);
- }
+ extraParameters = adapter.getExtraAttributes(inputParameters);
}
}
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java
index 8cafaac,5c0e8ea..ddf4bd2
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java
@@@ -285,6 -292,13 +292,13 @@@ public class ServiceInstanceMetadataUti
});
}
+ private static void reportMetadataToRemote(ServiceInstance serviceInstance) {
+ if (REMOTE_METADATA_STORAGE_TYPE.equalsIgnoreCase(getMetadataStorageType(serviceInstance))) {
- RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();
- remoteMetadataService.publishMetadata(serviceInstance.getServiceName());
++ RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService(serviceInstance.getApplicationModel());
++ remoteMetadataService.publishMetadata(serviceInstance.getApplicationModel().getApplicationName());
+ }
+ }
+
/**
* Set the default parameters via the specified {@link URL providerURL}
*
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java
index 4026103,ddbb163..4cd2618
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java
@@@ -75,9 -74,9 +75,9 @@@ import static org.apache.dubbo.rpc.Cons
* @see WritableMetadataService
* @since 2.7.5
*/
-public class InMemoryWritableMetadataService implements WritableMetadataService {
+public class InMemoryWritableMetadataService implements WritableMetadataService, ScopeModelAware {
- final Logger logger = LoggerFactory.getLogger(getClass());
+ Logger logger = LoggerFactory.getLogger(getClass());
private final Lock lock = new ReentrantLock();
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleListener.java
index 0299761,7c76b38..2a5dbf2
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleListener.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationRuleListener.java
@@@ -47,15 -48,25 +49,25 @@@ import java.util.concurrent.atomic.Atom
import static org.apache.dubbo.common.constants.RegistryConstants.INIT;
+ /**
+ * Listens to {@MigrationRule} from Config Center.
+ *
+ * - Migration rule is of consumer application scope.
+ * - Listener is shared among all invokers (interfaces), it keeps the relation between interface and handler.
+ *
+ * There're two execution points:
+ * - Refer, invoker behaviour is determined with default rule.
+ * - Rule change, invoker behaviour is changed according to the newly received rule.
+ */
@Activate
-public class MigrationRuleListener implements RegistryProtocolListener, ConfigurationListener {
+public class MigrationRuleListener implements RegistryProtocolListener, ConfigurationListener, ScopeModelAware {
private static final Logger logger = LoggerFactory.getLogger(MigrationRuleListener.class);
private static final String DUBBO_SERVICEDISCOVERY_MIGRATION = "DUBBO_SERVICEDISCOVERY_MIGRATION";
private static final String MIGRATION_DELAY_KEY = "dubbo.application.migration.delay";
- private final String RULE_KEY = ApplicationModel.getName() + ".migration";
+ private String ruleKey;
- private final Map<MigrationInvoker, MigrationRuleHandler> handlers = new ConcurrentHashMap<>();
- private final LinkedBlockingQueue<String> ruleQueue = new LinkedBlockingQueue<>();
+ protected final Map<MigrationInvoker, MigrationRuleHandler> handlers = new ConcurrentHashMap<>();
+ protected final LinkedBlockingQueue<String> ruleQueue = new LinkedBlockingQueue<>();
private final AtomicBoolean executorSubmit = new AtomicBoolean(false);
private final ExecutorService ruleManageExecutor = Executors.newFixedThreadPool(1, new NamedThreadFactory("Dubbo-Migration-Listener"));
@@@ -95,9 -98,9 +110,9 @@@
setRawRule(INIT);
}
- String localRawRule = ApplicationModel.getEnvironment().getLocalMigrationRule();
+ String localRawRule = applicationModel.getApplicationEnvironment().getLocalMigrationRule();
if (!StringUtils.isEmpty(localRawRule)) {
- Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("DubboMigrationRuleDelayWorker", true))
+ localRuleMigrationFuture = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("DubboMigrationRuleDelayWorker", true))
.schedule(() -> {
if (this.rawRule.equals(INIT)) {
this.process(new ConfigChangedEvent(null, null, localRawRule));
@@@ -226,8 -229,14 +241,14 @@@
@Override
public void onDestroy() {
if (configuration != null) {
- configuration.removeListener(RULE_KEY, this);
+ configuration.removeListener(ruleKey, this);
}
+ if (ruleMigrationFuture != null) {
+ ruleMigrationFuture.cancel(true);
+ }
+ if (localRuleMigrationFuture != null) {
+ localRuleMigrationFuture.cancel(true);
+ }
}
public Map<MigrationInvoker, MigrationRuleHandler> getHandlers() {
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/RegistryProtocol.java
index 9651696,a6997b0..25543bc
--- 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
@@@ -854,14 -817,14 +867,16 @@@ public class RegistryProtocol implement
logger.warn(t.getMessage(), t);
}
try {
- Map<URL, NotifyListener> overrideListeners = getProviderConfigurationListener(subscribeUrl).getOverrideListeners();
- NotifyListener listener = overrideListeners.remove(registerUrl);
- registry.unsubscribe(subscribeUrl, listener);
- ApplicationModel applicationModel = getApplicationModel(registerUrl.getScopeModel());
- if (applicationModel.getApplicationEnvironment().getConfiguration().convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true)) {
- applicationModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
- .removeListener(subscribeUrl.getServiceKey() + CONFIGURATORS_SUFFIX,
- serviceConfigurationListeners.remove(subscribeUrl.getServiceKey()));
+ if (subscribeUrl != null) {
- NotifyListener listener = RegistryProtocol.this.overrideListeners.remove(subscribeUrl);
++ Map<URL, NotifyListener> overrideListeners = getProviderConfigurationListener(subscribeUrl).getOverrideListeners();
++ NotifyListener listener = overrideListeners.remove(registerUrl);
+ registry.unsubscribe(subscribeUrl, listener);
- if (ApplicationModel.getEnvironment().getConfiguration().convert(Boolean.class, org.apache.dubbo.registry.Constants.ENABLE_CONFIGURATION_LISTEN, true)) {
- ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
++ ApplicationModel applicationModel = getApplicationModel(registerUrl.getScopeModel());
++ if (applicationModel.getApplicationEnvironment().getConfiguration().convert(Boolean.class, ENABLE_CONFIGURATION_LISTEN, true)) {
++ applicationModel.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()
+ .removeListener(subscribeUrl.getServiceKey() + CONFIGURATORS_SUFFIX,
- serviceConfigurationListeners.get(subscribeUrl.getServiceKey()));
++ serviceConfigurationListeners.remove(subscribeUrl.getServiceKey()));
+ }
}
} catch (Throwable t) {
logger.warn(t.getMessage(), t);
diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
index e8ce4f4,bd8c062..e13d29d
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
@@@ -31,8 -32,7 +32,6 @@@ import org.apache.dubbo.common.utils.Co
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.common.utils.UrlUtils;
import org.apache.dubbo.registry.NotifyListener;
- import org.apache.dubbo.rpc.model.ScopeModel;
- import org.apache.dubbo.rpc.model.ScopeModelUtil;
-import org.apache.dubbo.registry.ProviderFirstParams;
import java.util.ArrayList;
import java.util.Collection;
diff --cc dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
index 2b65cb9,7369c27..13fde8e
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/DefaultServiceInstanceTest.java
@@@ -38,9 -40,17 +42,16 @@@ public class DefaultServiceInstanceTes
public DefaultServiceInstance instance;
public static DefaultServiceInstance createInstance() {
- DefaultServiceInstance instance = new DefaultServiceInstance("A", "127.0.0.1", 8080, ApplicationModel.defaultModel());
- instance.getMetadata().put("dubbo.metadata-service.urls", "[ \"dubbo://192.168.0.102:20881/com.alibaba.cloud.dubbo.service.DubboMetadataService?anyhost=true&application=spring-cloud-alibaba-dubbo-provider&bind.ip=192.168.0.102&bind.port=20881&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=spring-cloud-alibaba-dubbo-provider&interface=com.alibaba.cloud.dubbo.service.DubboMetadataService&methods=getAllServiceKeys,getServiceRestMetadata,getExportedURLs,getAllExported [...]
- instance.getMetadata().put("dubbo.metadata-service.url-params", "{\"dubbo\":{\"application\":\"dubbo-provider-demo\",\"deprecated\":\"false\",\"group\":\"dubbo-provider-demo\",\"version\":\"1.0.0\",\"timestamp\":\"1564845042651\",\"dubbo\":\"2.0.2\",\"provider.host\":\"192.168.0.102\",\"provider.port\":\"20880\"}}");
- DefaultServiceInstance instance = new DefaultServiceInstance("A", "127.0.0.1", 20880);
++ DefaultServiceInstance instance = new DefaultServiceInstance("A", "127.0.0.1", 20880, ApplicationModel.defaultModel());
+ Map<String, String> metadata = instance.getMetadata();
+ metadata.put(METADATA_STORAGE_TYPE_PROPERTY_NAME, "remote");
+ metadata.put(EXPORTED_SERVICES_REVISION_PROPERTY_NAME, "111");
+ metadata.put("site", "dubbo");
+
+ Map<String, Integer> protocolPorts = new HashMap<>();
+ protocolPorts.put("rest", 8080);
+ protocolPorts.put("dubbo", 20880);
+ setEndpoints(instance, protocolPorts);
-
return instance;
}
diff --cc dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/MigrationRuleListenerTest.java
index c2bde4b,10e8703..406b85d
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/MigrationRuleListenerTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/MigrationRuleListenerTest.java
@@@ -25,32 -29,60 +29,61 @@@ import org.mockito.ArgumentCaptor
import org.mockito.Mockito;
public class MigrationRuleListenerTest {
+
+ private String localRule = "key: demo-consumer\n" +
+ "step: APPLICATION_FIRST\n" +
+ "threshold: 1.0\n" +
+ "proportion: 60\n" +
+ "delay: 60\n" +
+ "force: false\n" +
+ "interfaces:\n" +
+ " - serviceKey: DemoService:1.0.0\n" +
+ " threshold: 0.5\n" +
+ " proportion: 30\n" +
+ " delay: 30\n" +
+ " force: true\n" +
+ " step: APPLICATION_FIRST\n" +
+ " - serviceKey: GreetingService:1.0.0\n" +
+ " step: FORCE_APPLICATION";
+
+ private String remoteRule = "key: demo-consumer\n" +
+ "step: FORCE_APPLICATION\n" +
+ "threshold: 1.0\n" +
+ "proportion: 60\n" +
+ "delay: 60\n" +
+ "force: false\n" +
+ "interfaces:\n" +
+ " - serviceKey: DemoService:1.0.0\n" +
+ " threshold: 0.5\n" +
+ " proportion: 30\n" +
+ " delay: 30\n" +
+ " force: true\n" +
+ " step: FORCE_APPLICATION\n" +
+ " - serviceKey: GreetingService:1.0.0\n" +
+ " step: FORCE_INTERFACE";
+
+ private String dynamicRemoteRule = "key: demo-consumer\n" +
+ "step: APPLICATION_FIRST\n" +
+ "threshold: 1.0\n" +
+ "proportion: 60\n" +
+ "delay: 60\n" +
+ "force: false\n" +
+ "interfaces:\n";
+
+ /**
+ * Listener started with config center and local rule, no initial remote rule.
+ * Check local rule take effect
+ */
@Test
public void test() throws InterruptedException {
- String rule = "key: demo-consumer\n" +
- "step: APPLICATION_FIRST\n" +
- "threshold: 1.0\n" +
- "proportion: 60\n" +
- "delay: 60\n" +
- "force: false\n" +
- "interfaces:\n" +
- " - serviceKey: DemoService:1.0.0\n" +
- " threshold: 0.5\n" +
- " proportion: 30\n" +
- " delay: 30\n" +
- " force: true\n" +
- " step: APPLICATION_FIRST\n" +
- " - serviceKey: GreetingService:1.0.0\n" +
- " step: FORCE_APPLICATION";
-
DynamicConfiguration dynamicConfiguration = Mockito.mock(DynamicConfiguration.class);
- ApplicationModel.getEnvironment().setDynamicConfiguration(dynamicConfiguration);
- ApplicationModel.getEnvironment().setLocalMigrationRule(localRule);
+ ApplicationModel.reset();
+ ApplicationModel.defaultModel().getApplicationEnvironment().setDynamicConfiguration(dynamicConfiguration);
- ApplicationModel.defaultModel().getApplicationEnvironment().setLocalMigrationRule(rule);
++ ApplicationModel.defaultModel().getApplicationEnvironment().setLocalMigrationRule(localRule);
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("demo-consumer");
- ApplicationModel.getConfigManager().setApplication(applicationConfig);
+ ApplicationModel.defaultModel().getApplicationConfigManager().setApplication(applicationConfig);
URL consumerURL = Mockito.mock(URL.class);
Mockito.when(consumerURL.getServiceKey()).thenReturn("Test");
@@@ -60,11 -92,11 +93,12 @@@
MigrationRuleHandler<?> handler = Mockito.mock(MigrationRuleHandler.class, Mockito.withSettings().verboseLogging());
MigrationRuleListener migrationRuleListener = new MigrationRuleListener();
+
MigrationInvoker<?> migrationInvoker = Mockito.mock(MigrationInvoker.class);
migrationRuleListener.getHandlers().put(migrationInvoker, handler);
+ migrationRuleListener.setApplicationModel(ApplicationModel.defaultModel());
- Thread.sleep(5000);
+ Thread.sleep(2000);
Mockito.verify(handler, Mockito.timeout(5000)).doMigrate(Mockito.any());
migrationRuleListener.onRefer(null, migrationInvoker, consumerURL, null);
diff --cc dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
index 1091eee,31a254a..c89ebee
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/migration/model/MigrationRuleTest.java
@@@ -18,11 -18,10 +18,12 @@@ package org.apache.dubbo.registry.clien
import org.apache.dubbo.common.URL;
import org.apache.dubbo.metadata.ServiceNameMapping;
- import org.apache.dubbo.metadata.WritableMetadataService;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.ModuleModel;
import org.junit.jupiter.api.Test;
+ import org.mockito.ArgumentMatchers;
+ import org.mockito.MockedStatic;
import org.mockito.Mockito;
import java.util.Collections;
@@@ -33,67 -42,71 +44,76 @@@ public class MigrationRuleTest
@Test
public void test_parse() {
- String rule = "key: demo-consumer\n" +
- "step: APPLICATION_FIRST\n" +
- "threshold: 1.0\n" +
- "proportion: 60\n" +
- "delay: 60\n" +
- "force: false\n" +
- "interfaces:\n" +
- " - serviceKey: DemoService:1.0.0\n" +
- " threshold: 0.5\n" +
- " proportion: 30\n" +
- " delay: 30\n" +
- " force: true\n" +
- " step: APPLICATION_FIRST\n" +
- " - serviceKey: GreetingService:1.0.0\n" +
- " step: FORCE_APPLICATION\n" +
- "applications:\n" +
- " - serviceKey: TestApplication\n" +
- " threshold: 0.3\n" +
- " proportion: 20\n" +
- " delay: 10\n" +
- " force: false\n" +
- " step: FORCE_INTERFACE\n";
+ try (MockedStatic<ServiceNameMapping> mockStaticMapping = Mockito.mockStatic(ServiceNameMapping.class, withSettings().defaultAnswer(CALLS_REAL_METHODS))) {
+ mockStaticMapping.when(ServiceNameMapping::getDefaultExtension).thenReturn(mapping);
+ when(mapping.getServices(any())).thenReturn(Collections.emptySet());
- MigrationRule migrationRule = MigrationRule.parse(rule);
- assertEquals("demo-consumer", migrationRule.getKey());
- assertEquals(MigrationStep.APPLICATION_FIRST, migrationRule.getStep());
- assertEquals(1.0f, migrationRule.getThreshold());
- assertEquals(60, migrationRule.getProportion());
- assertEquals(60, migrationRule.getDelay());
- assertEquals(false, migrationRule.getForce());
+ String rule = "key: demo-consumer\n" +
+ "step: APPLICATION_FIRST\n" +
+ "threshold: 1.0\n" +
+ "proportion: 60\n" +
+ "delay: 60\n" +
+ "force: false\n" +
+ "interfaces:\n" +
+ " - serviceKey: DemoService:1.0.0\n" +
+ " threshold: 0.5\n" +
+ " proportion: 30\n" +
+ " delay: 30\n" +
+ " force: true\n" +
+ " step: APPLICATION_FIRST\n" +
+ " - serviceKey: GreetingService:1.0.0\n" +
+ " step: FORCE_APPLICATION\n" +
+ "applications:\n" +
+ " - serviceKey: TestApplication\n" +
+ " threshold: 0.3\n" +
+ " proportion: 20\n" +
+ " delay: 10\n" +
+ " force: false\n" +
+ " step: FORCE_INTERFACE\n";
+
+ MigrationRule migrationRule = MigrationRule.parse(rule);
+ assertEquals("demo-consumer", migrationRule.getKey());
+ assertEquals(MigrationStep.APPLICATION_FIRST, migrationRule.getStep());
+ assertEquals(1.0f, migrationRule.getThreshold());
+ assertEquals(60, migrationRule.getProportion());
+ assertEquals(60, migrationRule.getDelay());
+ assertEquals(false, migrationRule.getForce());
- URL url = Mockito.mock(URL.class);
- Mockito.when(url.getDisplayServiceKey()).thenReturn("DemoService:1.0.0");
- Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
- Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
+ URL url = Mockito.mock(URL.class);
+ ModuleModel defaultModule = ApplicationModel.defaultModel().getDefaultModule();
+ url.setScopeModel(defaultModule);
+ Mockito.when(url.getDisplayServiceKey()).thenReturn("DemoService:1.0.0");
++ Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
++ Mockito.when(url.getParameter(ArgumentMatchers.eq(REGISTRY_CLUSTER_TYPE_KEY), anyString())).thenReturn("default");
- assertEquals(migrationRule.getInterfaces().size(), 2);
+ assertEquals(migrationRule.getInterfaces().size(), 2);
- assertEquals(0.5f, migrationRule.getThreshold(url));
- assertEquals(30, migrationRule.getProportion(url));
- assertEquals(30, migrationRule.getDelay(url));
- assertEquals(true, migrationRule.getForce(url));
- assertEquals(MigrationStep.APPLICATION_FIRST, migrationRule.getStep(url));
+ assertEquals(0.5f, migrationRule.getThreshold(url));
+ assertEquals(30, migrationRule.getProportion(url));
+ assertEquals(30, migrationRule.getDelay(url));
+ assertEquals(true, migrationRule.getForce(url));
+ assertEquals(MigrationStep.APPLICATION_FIRST, migrationRule.getStep(url));
- Mockito.when(url.getDisplayServiceKey()).thenReturn("GreetingService:1.0.0");
- assertEquals(1.0f, migrationRule.getThreshold(url));
- assertEquals(60, migrationRule.getProportion(url));
- assertEquals(60, migrationRule.getDelay(url));
- assertEquals(false, migrationRule.getForce(url));
- assertEquals(MigrationStep.FORCE_APPLICATION, migrationRule.getStep(url));
+ Mockito.when(url.getDisplayServiceKey()).thenReturn("GreetingService:1.0.0");
+ assertEquals(1.0f, migrationRule.getThreshold(url));
+ assertEquals(60, migrationRule.getProportion(url));
+ assertEquals(60, migrationRule.getDelay(url));
+ assertEquals(false, migrationRule.getForce(url));
+ assertEquals(MigrationStep.FORCE_APPLICATION, migrationRule.getStep(url));
- Mockito.when(url.getDisplayServiceKey()).thenReturn("GreetingService:1.0.1");
- Mockito.when(url.getServiceInterface()).thenReturn("GreetingService");
- Set<String> services = new HashSet<>();
- services.add("TestApplication");
- when(mapping.getServices(any())).thenReturn(services);
- assertEquals(0.3f, migrationRule.getThreshold(url));
- assertEquals(20, migrationRule.getProportion(url));
- assertEquals(10, migrationRule.getDelay(url));
- assertEquals(false, migrationRule.getForce(url));
- assertEquals(MigrationStep.FORCE_INTERFACE, migrationRule.getStep(url));
- }
+ Mockito.when(url.getDisplayServiceKey()).thenReturn("GreetingService:1.0.1");
+ Mockito.when(url.getServiceInterface()).thenReturn("GreetingService");
+ WritableMetadataService metadataService = WritableMetadataService.getDefaultExtension(defaultModule);
+ metadataService.putCachedMapping(ServiceNameMapping.buildMappingKey(url), Collections.singleton("TestApplication"));
++
++ Set<String> services = new HashSet<>();
++ services.add("TestApplication");
++ when(mapping.getServices(any())).thenReturn(services);
+ assertEquals(0.3f, migrationRule.getThreshold(url));
+ assertEquals(20, migrationRule.getProportion(url));
+ assertEquals(10, migrationRule.getDelay(url));
+ assertEquals(false, migrationRule.getForce(url));
+ assertEquals(MigrationStep.FORCE_INTERFACE, migrationRule.getStep(url));
-
+ metadataService.removeCachedMapping("GreetingService");
}
}
diff --cc dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java
index 934ed20,e82b2b6..448ab72
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java
@@@ -23,8 -23,8 +23,9 @@@ import org.apache.dubbo.metadata.Writab
import org.apache.dubbo.registry.NotifyListener;
import org.apache.dubbo.registry.client.ServiceDiscoveryRegistry;
import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.ModuleModel;
+ import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@@ -83,15 -83,17 +84,20 @@@ public class ServiceOrientedRegistryTes
@BeforeEach
public void init() {
+ ApplicationModel applicationModel = ApplicationModel.defaultModel();
+ ModuleModel scopeModel = applicationModel.getDefaultModule();
+ registryURL.setScopeModel(scopeModel);
registry = ServiceDiscoveryRegistry.create(registryURL);
- metadataService = WritableMetadataService.getDefaultExtension();
+ metadataService = WritableMetadataService.getDefaultExtension(scopeModel);
notifyListener = new MyNotifyListener();
- ApplicationModel.getConfigManager().setApplication(new ApplicationConfig("Test"));
+ applicationModel.getApplicationConfigManager().setApplication(new ApplicationConfig("Test"));
}
+ @AfterAll
+ public static void clearUp() {
+ ApplicationModel.reset();
+ }
+
@Test
public void testSupports() {
assertTrue(ServiceDiscoveryRegistry.supports(registryURL));
diff --cc dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
index be0c253,67f4c89..0048ca7
--- a/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
+++ b/dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosServiceDiscovery.java
@@@ -104,8 -110,8 +110,8 @@@ public class NacosServiceDiscovery exte
@Override
public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {
return ThrowableFunction.execute(namingService, service ->
- service.selectInstances(serviceName, true)
- .stream().map((i)->NacosNamingServiceUtils.toServiceInstance(registryURL, i))
- service.selectInstances(serviceName, Constants.DEFAULT_GROUP, true)
- .stream().map(NacosNamingServiceUtils::toServiceInstance)
++ service.selectInstances(serviceName, Constants.DEFAULT_GROUP, true)
++ .stream().map((i)->NacosNamingServiceUtils.toServiceInstance(registryURL, i))
.collect(Collectors.toList())
);
}
diff --cc dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
index 993e02a,d9e137c..d7fd458
--- a/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
+++ b/dubbo-registry/dubbo-registry-zookeeper/src/main/java/org/apache/dubbo/registry/zookeeper/util/CuratorFrameworkUtils.java
@@@ -76,12 -84,12 +85,12 @@@ public abstract class CuratorFrameworkU
}
- public static List<ServiceInstance> build(Collection<org.apache.curator.x.discovery.ServiceInstance<ZookeeperInstance>>
- instances) {
- return instances.stream().map(CuratorFrameworkUtils::build).collect(Collectors.toList());
+ public static List<ServiceInstance> build(URL registryUrl, Collection<org.apache.curator.x.discovery.ServiceInstance<ZookeeperInstance>>
- instances) {
++ instances) {
+ return instances.stream().map((i)->build(registryUrl, i)).collect(Collectors.toList());
}
- public static ServiceInstance build(org.apache.curator.x.discovery.ServiceInstance<ZookeeperInstance> instance) {
+ public static ServiceInstance build(URL registryUrl, org.apache.curator.x.discovery.ServiceInstance<ZookeeperInstance> instance) {
String name = instance.getName();
String host = instance.getAddress();
int port = instance.getPort();
diff --cc dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcResult.java
index 1c6a00b,05b84cb..d93d345
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcResult.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DecodeableRpcResult.java
@@@ -118,14 -118,16 +118,17 @@@ public class DecodeableRpcResult extend
public void decode() throws Exception {
if (!hasDecoded && channel != null && inputStream != null) {
try {
- if (ConfigurationUtils.getSystemConfiguration(channel.getUrl().getScopeModel()).getBoolean(SERIALIZATION_SECURITY_CHECK_KEY, true)) {
- Object serializationType_obj = invocation.get(SERIALIZATION_ID_KEY);
- if (serializationType_obj != null) {
- if ((byte) serializationType_obj != serializationType) {
- throw new IOException("Unexpected serialization id:" + serializationType + " received from network, please check if the peer send the right id.");
+ if (invocation != null) {
- if (ConfigurationUtils.getSystemConfiguration().getBoolean(SERIALIZATION_SECURITY_CHECK_KEY, true)) {
++ if (ConfigurationUtils.getSystemConfiguration(channel.getUrl().getScopeModel()).getBoolean(SERIALIZATION_SECURITY_CHECK_KEY, true)) {
+ Object serializationTypeObj = invocation.get(SERIALIZATION_ID_KEY);
+ if (serializationTypeObj != null) {
+ if ((byte) serializationTypeObj != serializationType) {
+ throw new IOException("Unexpected serialization id:" + serializationType + " received from network, please check if the peer send the right id.");
+ }
}
}
}
++
decode(channel, inputStream);
} catch (Throwable e) {
if (log.isWarnEnabled()) {