From 52329719844abfd2cc84a8c8b37f78264b7dcfcd Mon Sep 17 00:00:00 2001 From: cvictory Date: Fri, 16 Aug 2019 11:11:34 +0800 Subject: [PATCH 1/9] test --- dubbo-bootstrap/pom.xml | 21 +++- .../EtcdDubboServiceConsumerBootstrap.java | 58 +++++++++++ .../EtcdDubboServiceProviderBootstrap.java | 95 +++++++++++++++++++ .../NacosDubboServiceConsumerBootstrap.java | 58 +++++++++++ ...> NacosDubboServiceProviderBootstrap.java} | 2 +- .../registry/etcd/EtcdServiceDiscovery.java | 26 +++++ 6 files changed, 258 insertions(+), 2 deletions(-) create mode 100644 dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java create mode 100644 dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceProviderBootstrap.java create mode 100644 dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/NacosDubboServiceConsumerBootstrap.java rename dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/{DubboServiceProvider2Bootstrap.java => NacosDubboServiceProviderBootstrap.java} (97%) diff --git a/dubbo-bootstrap/pom.xml b/dubbo-bootstrap/pom.xml index 25662943e2..7cac06182a 100644 --- a/dubbo-bootstrap/pom.xml +++ b/dubbo-bootstrap/pom.xml @@ -33,6 +33,18 @@ ${project.parent.version} test + + org.apache.dubbo + dubbo-registry-etcd3 + ${project.parent.version} + test + + + com.google.guava + guava + 20.0 + test + org.apache.dubbo dubbo-registry-consul @@ -47,6 +59,13 @@ test + + org.apache.dubbo + dubbo-metadata-report-etcd + ${project.parent.version} + test + + org.apache.dubbo dubbo-configcenter-zookeeper @@ -110,4 +129,4 @@ - \ No newline at end of file + diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java new file mode 100644 index 0000000000..db4e1529fa --- /dev/null +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.bootstrap; + +import org.apache.dubbo.bootstrap.rest.UserService; +import org.apache.dubbo.config.MetadataReportConfig; +import org.apache.dubbo.config.ReferenceConfig; +import org.apache.dubbo.config.context.ConfigManager; + +/** + * Dubbo Provider Bootstrap + * + * @since 2.7.4 + */ +public class EtcdDubboServiceConsumerBootstrap { + + public static void main(String[] args) throws Exception { + + new DubboBootstrap() + .application("dubbo-consumer-demo") + // Zookeeper + .registry("zookeeper", builder -> builder.address("etcd3://127.0.0.1:2379?registry.type=service&subscribed.services=dubbo-provider-demo")) + .metadataReport(new MetadataReportConfig("etcd://127.0.0.1:2379")) + // Nacos +// .registry("consul", builder -> builder.address("consul://127.0.0.1:8500?registry.type=service&subscribed.services=dubbo-provider-demo").group("namespace1")) + .reference("echo", builder -> builder.interfaceClass(EchoService.class).protocol("dubbo")) + .reference("user", builder -> builder.interfaceClass(UserService.class).protocol("rest")) + .onlyRegisterProvider(true) + .start() + .await(); + + ConfigManager configManager = ConfigManager.getInstance(); + + ReferenceConfig referenceConfig = configManager.getReference("echo"); + + EchoService echoService = referenceConfig.get(); + + for (int i = 0; i < 500; i++) { + Thread.sleep(2000L); + System.out.println(echoService.echo("Hello,World")); + } + + } +} diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceProviderBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceProviderBootstrap.java new file mode 100644 index 0000000000..d488ec63c7 --- /dev/null +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceProviderBootstrap.java @@ -0,0 +1,95 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.bootstrap; + +import org.apache.dubbo.bootstrap.rest.UserService; +import org.apache.dubbo.bootstrap.rest.UserServiceImpl; +import org.apache.dubbo.config.ApplicationConfig; +import org.apache.dubbo.config.MetadataReportConfig; +import org.apache.dubbo.config.ProtocolConfig; +import org.apache.dubbo.config.RegistryConfig; +import org.apache.dubbo.config.ServiceConfig; + +import java.util.Arrays; + +/** + * Dubbo Provider Bootstrap + * + * @since 2.7.4 + */ +public class EtcdDubboServiceProviderBootstrap { + + public static void main(String[] args) { + multipleRegistries(); + } + + private static void multipleRegistries() { + ProtocolConfig restProtocol = new ProtocolConfig(); + restProtocol.setName("rest"); + restProtocol.setId("rest"); + restProtocol.setPort(-1); + + RegistryConfig interfaceRegistry = new RegistryConfig(); + interfaceRegistry.setId("interfaceRegistry"); + interfaceRegistry.setAddress("etcd3://127.0.0.1:2379"); + + RegistryConfig serviceRegistry = new RegistryConfig(); + serviceRegistry.setId("serviceRegistry"); + serviceRegistry.setAddress("etcd3://127.0.0.1:2379?registry.type=service"); + + ServiceConfig echoService = new ServiceConfig<>(); + echoService.setInterface(EchoService.class.getName()); + echoService.setRef(new EchoServiceImpl()); +// echoService.setRegistries(Arrays.asList(interfaceRegistry, serviceRegistry)); + + ServiceConfig userService = new ServiceConfig<>(); + userService.setInterface(UserService.class.getName()); + userService.setRef(new UserServiceImpl()); + userService.setProtocol(restProtocol); +// userService.setRegistries(Arrays.asList(interfaceRegistry, serviceRegistry)); + + ApplicationConfig applicationConfig = new ApplicationConfig("dubbo-provider-demo"); + applicationConfig.setMetadata("remote"); + new DubboBootstrap() + .application(applicationConfig) + // Zookeeper in service registry type +// .registry("zookeeper", builder -> builder.address("zookeeper://127.0.0.1:2181?registry.type=service")) + // Nacos +// .registry("zookeeper", builder -> builder.address("nacos://127.0.0.1:8848?registry.type=service")) + .registries(Arrays.asList(interfaceRegistry, serviceRegistry)) +// .registry(RegistryBuilder.newBuilder().address("consul://127.0.0.1:8500?registry.type=service").build()) + .protocol(builder -> builder.port(-1).name("dubbo")) + .metadataReport(new MetadataReportConfig("etcd://127.0.0.1:2379")) + .service(echoService) + .service(userService) + .start() + .await(); + } + + private static void testSCCallDubbo() { + + } + + private static void testDubboCallSC() { + + } + + private static void testDubboTansormation() { + + } + +} diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/NacosDubboServiceConsumerBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/NacosDubboServiceConsumerBootstrap.java new file mode 100644 index 0000000000..3f577361f8 --- /dev/null +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/NacosDubboServiceConsumerBootstrap.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.dubbo.bootstrap; + +import org.apache.dubbo.bootstrap.rest.UserService; +import org.apache.dubbo.config.MetadataReportConfig; +import org.apache.dubbo.config.ReferenceConfig; +import org.apache.dubbo.config.context.ConfigManager; + +/** + * Dubbo Provider Bootstrap + * + * @since 2.7.4 + */ +public class NacosDubboServiceConsumerBootstrap { + + public static void main(String[] args) throws Exception { + + new DubboBootstrap() + .application("dubbo-consumer-demo") + // Zookeeper + .registry("zookeeper", builder -> builder.address("zookeeper://127.0.0.1:2181?registry.type=service&subscribed.services=dubbo-provider-demo")) + .metadataReport(new MetadataReportConfig("zookeeper://127.0.0.1:2181")) + // Nacos +// .registry("consul", builder -> builder.address("consul://127.0.0.1:8500?registry.type=service&subscribed.services=dubbo-provider-demo").group("namespace1")) + .reference("echo", builder -> builder.interfaceClass(EchoService.class).protocol("dubbo")) + .reference("user", builder -> builder.interfaceClass(UserService.class).protocol("rest")) + .onlyRegisterProvider(true) + .start() + .await(); + + ConfigManager configManager = ConfigManager.getInstance(); + + ReferenceConfig referenceConfig = configManager.getReference("echo"); + + EchoService echoService = referenceConfig.get(); + + for (int i = 0; i < 500; i++) { + Thread.sleep(2000L); + System.out.println(echoService.echo("Hello,World")); + } + + } +} diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/NacosDubboServiceProviderBootstrap.java similarity index 97% rename from dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java rename to dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/NacosDubboServiceProviderBootstrap.java index ad87adbbce..c631aa19fa 100644 --- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/NacosDubboServiceProviderBootstrap.java @@ -21,7 +21,7 @@ package org.apache.dubbo.bootstrap; * * @since 2.7.4 */ -public class DubboServiceProvider2Bootstrap { +public class NacosDubboServiceProviderBootstrap { public static void main(String[] args) { new DubboBootstrap() diff --git a/dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java b/dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java index a684c2c8c9..612e34c239 100644 --- a/dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java +++ b/dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java @@ -19,10 +19,12 @@ package org.apache.dubbo.registry.etcd; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; +import org.apache.dubbo.common.utils.CollectionUtils; import org.apache.dubbo.common.utils.ConcurrentHashSet; import org.apache.dubbo.event.EventDispatcher; import org.apache.dubbo.event.EventListener; import org.apache.dubbo.registry.NotifyListener; +import org.apache.dubbo.registry.client.DefaultServiceInstance; import org.apache.dubbo.registry.client.ServiceDiscovery; import org.apache.dubbo.registry.client.ServiceInstance; import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent; @@ -37,13 +39,17 @@ import org.apache.dubbo.rpc.RpcException; import com.google.gson.Gson; import java.io.File; +import java.util.ArrayList; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import static org.apache.dubbo.common.constants.RegistryConstants.DYNAMIC_KEY; + /** * 2019-07-08 */ @@ -101,6 +107,7 @@ public class EtcdServiceDiscovery implements ServiceDiscovery, EventListener getInstances(String serviceName) { + List children = etcdClient.getChildren(toParentPath(serviceName)); + if (CollectionUtils.isEmpty(children)) { + return Collections.EMPTY_LIST; + } + List list = new ArrayList<>(children.size()); + for (String child : children) { + ServiceInstance serviceInstance = new Gson().fromJson(etcdClient.getKVValue(child), DefaultServiceInstance.class); + list.add(serviceInstance); + } + return list; + } + + protected void registerServiceWatcher(String serviceName) { String path = root + File.separator + serviceName; /* From d9cc75f65c2b61e66746ce462087c6e8e7692f12 Mon Sep 17 00:00:00 2001 From: Mercy Ma Date: Fri, 16 Aug 2019 11:42:25 +0800 Subject: [PATCH 2/9] [Feature] Enhance the Event-Publishing feature to original ServiceDiscovery (#4846) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Polish apache/dubbo#4542 : [Enhancement] Adapt the Java standard Event/Listener mechanism * Polish apache/dubbo#4541 : [Feature] Add local File System DynamicConfigurationFactory‘s extension * Polish apache#4541 : Bugfix * Polish apache/dubbo#4541 : Optimization * Polish apache/dubbo#4541 : Add the compatibility for PollingWatchService on the some platforms * Polish apache/dubbo#4541 : Add delay publish without ThreadPoolExecutor * Polish apache/dubbo#4541 : Refactor the extension name * Polish apache/dubbo#4541 : Add remove ops * Polish apache/dubbo#4541 : Add testable constructor * Polish apache/dubbo#4541 : Add getConfigGroups method * Polish apache/dubbo#4610 : [Refactor] Refactor the bootstrap module * Polish apache/dubbo#4541 : Fix the nulling URL issue * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager * Polish apache/dubbo#4622 : Support multiple configcenters * Polish apache/dubbo#4671 : ServiceNameMapping will not map the group, version and protocol * update referenceCount log (#4683) Add comments to support multiple shared connections * Polish /apache/dubbo#4687 : Remove the duplicated test code in dubbo-config-spring (#4688) * #4685 修改代码if判断false问题 if (hasException == false)修改成if (!hasException) (#4695) * Fixed Service annotation method parameters are not in effect (#4598) * keep demo simple, and switch to use zookeeper as registry center (#4705) * keep demo simple, and switch to use zookeeper as registry center * remove comment * @Reference auto-wires the instance of generic interface #4594 (#4677) * try to shorten maven output to make travis build pass (#4710) * use CountDownLatch to check zk registry if establish connection (#4589) * Minor change * Rename the extension name of WritableMetadataService * Polish apache/dubbo#4759 : [Refactor] Change the signature of methods of MetadataService #4759 * Merge remote-tracking branch 'upstream/master' into dubbo-cloud-native # Conflicts: # dubbo-all/pom.xml # dubbo-bom/pom.xml # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.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/RegistryConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java # dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java # dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-etcd/src/test/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfigurationTest.java # dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java # dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java # dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java # dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java # dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java # dubbo-metadata/pom.xml # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java # dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java # dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistryFactory.java # dubbo-rpc/dubbo-rpc-xml/src/main/java/org/apache/dubbo/xml/rpc/protocol/xmlrpc/XmlRpcProtocol.java * Polish apache/dubbo#3984 : Add the implementation of Page getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) * Code merge * Fix the cases * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java # dubbo-metadata/dubbo-metadata-definition-protobuf/pom.xml # dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java # dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java * Refactor ConfigManager * Refactor ConfigManager * Resolve the issues on ConfigManager * Refactor and add test-cases for ConfigManager * Polish apache/dubbo#4774 : [Feature] Dubbo Cloud Native - To Support in Spring * Polish apache/dubbo#4808 : [Feature] Add the registered/unregistered event mechanism ShutdownHook * Polish apache/dubbo#4807 : [Feature] Add the callback mechanism ShutdownHook #4807 * Polish apache/dubbo#4813 : [Feature] add Prioritized implementation for ServiceInstanceCustomizer * Polish apache/dubbo#4815 : [Feature] Add the ServiceLoader for Dubbo's services or components * Polish apache/dubbo#4815 : [Feature] Add the ServiceLoader for Dubbo's services or components * Polish apache/dubbo#4813 : [Feature] add Prioritized implementation for ServiceInstanceCustomizer * Polish apache/dubbo#4807 : Add sort implementation * Refactor * Refactor * Polish apache/dubbo#4845 : [Feature] Enhance the Event-Publishing feature to original ServiceDiscovery --- .../DefaultServiceDiscoveryFactory.java | 18 +++----- .../client/ServiceDiscoveryRegistry.java | 41 ++++++++++++------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java index 0d38acec50..c5f5fe4bd4 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java @@ -33,21 +33,15 @@ import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoad * @since 2.7.4 */ public class DefaultServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory { - - @Override - protected ServiceDiscovery createDiscovery(URL connectionURL) { - ServiceDiscovery serviceDiscovery = load(connectionURL); - return new EventPublishingServiceDiscovery(serviceDiscovery); - } - /** - * Load the {@link ServiceDiscovery} by {@link URL#getProtocol() the protocol} from {@link URL connection URL} + * Create the {@link ServiceDiscovery} by {@link URL#getProtocol() the protocol} from {@link URL connection URL} * - * @param connectionURL the {@link URL url} to connect - * @return non-null + * @param registryURL + * @return */ - private ServiceDiscovery load(URL connectionURL) { - String protocol = connectionURL.getProtocol(); + @Override + protected ServiceDiscovery createDiscovery(URL registryURL) { + String protocol = registryURL.getProtocol(); ExtensionLoader loader = getExtensionLoader(ServiceDiscovery.class); return loader.getOrDefaultExtension(protocol); } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java index 40d0a099b8..725963af5d 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java @@ -103,7 +103,7 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { public ServiceDiscoveryRegistry(URL registryURL) { super(registryURL); - this.serviceDiscovery = getServiceDiscovery(registryURL); + this.serviceDiscovery = createServiceDiscovery(registryURL); this.subscribedServices = getSubscribedServices(registryURL); this.serviceNameMapping = ServiceNameMapping.getDefaultExtension(); String metadataStorageType = getMetadataStorageType(registryURL); @@ -120,14 +120,14 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { } /** - * Get the {@link ServiceDiscovery} from the connection {@link URL} + * Create the {@link ServiceDiscovery} from the registry {@link URL} * * @param registryURL the {@link URL} to connect the registry * @return non-null */ - protected ServiceDiscovery getServiceDiscovery(URL registryURL) { - ServiceDiscoveryFactory factory = getExtension(registryURL); - ServiceDiscovery serviceDiscovery = factory.getServiceDiscovery(registryURL); + protected ServiceDiscovery createServiceDiscovery(URL registryURL) { + ServiceDiscovery originalServiceDiscovery = getServiceDiscovery(registryURL); + ServiceDiscovery serviceDiscovery = enhanceEventPublishing(originalServiceDiscovery); execute(() -> { serviceDiscovery.initialize(registryURL.addParameter(INTERFACE_KEY, ServiceDiscovery.class.getName()) .removeParameter(REGISTRY_TYPE_KEY)); @@ -135,6 +135,28 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { return serviceDiscovery; } + /** + * Get the instance {@link ServiceDiscovery} from the registry {@link URL} using + * {@link ServiceDiscoveryFactory} SPI + * + * @param registryURL the {@link URL} to connect the registry + * @return + */ + private ServiceDiscovery getServiceDiscovery(URL registryURL) { + ServiceDiscoveryFactory factory = getExtension(registryURL); + return factory.getServiceDiscovery(registryURL); + } + + /** + * Enhance the original {@link ServiceDiscovery} with event publishing feature + * + * @param original the original {@link ServiceDiscovery} + * @return {@link EventPublishingServiceDiscovery} instance + */ + private ServiceDiscovery enhanceEventPublishing(ServiceDiscovery original) { + return new EventPublishingServiceDiscovery(original); + } + protected boolean shouldRegister(URL providerURL) { String side = providerURL.getParameter(SIDE_KEY); @@ -506,13 +528,4 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { public static boolean supports(URL registryURL) { return SERVICE_REGISTRY_TYPE.equalsIgnoreCase(registryURL.getParameter(REGISTRY_TYPE_KEY)); } - - /** - * Get the instance of {@link ServiceDiscovery} - * - * @return non-null - */ - public ServiceDiscovery getServiceDiscovery() { - return serviceDiscovery; - } } From 2a93324e3b671d4a00f9510ec2c1b83298da96de Mon Sep 17 00:00:00 2001 From: Mercy Ma Date: Fri, 16 Aug 2019 14:31:45 +0800 Subject: [PATCH 3/9] Dubbo cloud native (#4850) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Polish apache/dubbo#4542 : [Enhancement] Adapt the Java standard Event/Listener mechanism * Polish apache/dubbo#4541 : [Feature] Add local File System DynamicConfigurationFactory‘s extension * Polish apache#4541 : Bugfix * Polish apache/dubbo#4541 : Optimization * Polish apache/dubbo#4541 : Add the compatibility for PollingWatchService on the some platforms * Polish apache/dubbo#4541 : Add delay publish without ThreadPoolExecutor * Polish apache/dubbo#4541 : Refactor the extension name * Polish apache/dubbo#4541 : Add remove ops * Polish apache/dubbo#4541 : Add testable constructor * Polish apache/dubbo#4541 : Add getConfigGroups method * Polish apache/dubbo#4610 : [Refactor] Refactor the bootstrap module * Polish apache/dubbo#4541 : Fix the nulling URL issue * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager * Polish apache/dubbo#4622 : Support multiple configcenters * Polish apache/dubbo#4671 : ServiceNameMapping will not map the group, version and protocol * update referenceCount log (#4683) Add comments to support multiple shared connections * Polish /apache/dubbo#4687 : Remove the duplicated test code in dubbo-config-spring (#4688) * #4685 修改代码if判断false问题 if (hasException == false)修改成if (!hasException) (#4695) * Fixed Service annotation method parameters are not in effect (#4598) * keep demo simple, and switch to use zookeeper as registry center (#4705) * keep demo simple, and switch to use zookeeper as registry center * remove comment * @Reference auto-wires the instance of generic interface #4594 (#4677) * try to shorten maven output to make travis build pass (#4710) * use CountDownLatch to check zk registry if establish connection (#4589) * Minor change * Rename the extension name of WritableMetadataService * Polish apache/dubbo#4759 : [Refactor] Change the signature of methods of MetadataService #4759 * Merge remote-tracking branch 'upstream/master' into dubbo-cloud-native # Conflicts: # dubbo-all/pom.xml # dubbo-bom/pom.xml # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.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/RegistryConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java # dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java # dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-etcd/src/test/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfigurationTest.java # dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java # dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java # dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java # dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java # dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java # dubbo-metadata/pom.xml # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java # dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java # dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistryFactory.java # dubbo-rpc/dubbo-rpc-xml/src/main/java/org/apache/dubbo/xml/rpc/protocol/xmlrpc/XmlRpcProtocol.java * Polish apache/dubbo#3984 : Add the implementation of Page getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) * Code merge * Fix the cases * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java # dubbo-metadata/dubbo-metadata-definition-protobuf/pom.xml # dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java # dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java * Refactor ConfigManager * Refactor ConfigManager * Resolve the issues on ConfigManager * Refactor and add test-cases for ConfigManager * Polish apache/dubbo#4774 : [Feature] Dubbo Cloud Native - To Support in Spring * Polish apache/dubbo#4808 : [Feature] Add the registered/unregistered event mechanism ShutdownHook * Polish apache/dubbo#4807 : [Feature] Add the callback mechanism ShutdownHook #4807 * Polish apache/dubbo#4813 : [Feature] add Prioritized implementation for ServiceInstanceCustomizer * Polish apache/dubbo#4815 : [Feature] Add the ServiceLoader for Dubbo's services or components * Polish apache/dubbo#4815 : [Feature] Add the ServiceLoader for Dubbo's services or components * Polish apache/dubbo#4813 : [Feature] add Prioritized implementation for ServiceInstanceCustomizer * Polish apache/dubbo#4807 : Add sort implementation * Refactor * Refactor * Polish apache/dubbo#4845 : [Feature] Enhance the Event-Publishing feature to original ServiceDiscovery * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java --- .../dubbo/bootstrap/DubboBootstrap.java | 248 ++++++++++-------- .../AbstractServiceDiscoveryFactory.java | 43 +-- .../DefaultServiceDiscoveryFactory.java | 1 + .../EventPublishingServiceDiscovery.java | 10 +- .../event/ServiceDiscoveryDestroyedEvent.java | 10 +- .../ServiceDiscoveryDestroyingEvent.java | 10 +- .../client/event/ServiceDiscoveryEvent.java | 26 +- .../event/ServiceDiscoveryExceptionEvent.java | 10 +- .../ServiceDiscoveryInitializedEvent.java | 11 +- .../ServiceDiscoveryInitializingEvent.java | 10 +- .../listener/LoggingEventListenerTest.java | 8 +- 11 files changed, 185 insertions(+), 202 deletions(-) diff --git a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java index 4ad5512663..b7df466335 100644 --- a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java +++ b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java @@ -49,14 +49,15 @@ import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter; import org.apache.dubbo.config.utils.ReferenceConfigCache; import org.apache.dubbo.event.EventDispatcher; import org.apache.dubbo.event.EventListener; +import org.apache.dubbo.event.GenericEventListener; import org.apache.dubbo.metadata.MetadataService; import org.apache.dubbo.metadata.MetadataServiceExporter; import org.apache.dubbo.metadata.WritableMetadataService; import org.apache.dubbo.metadata.report.MetadataReportInstance; -import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory; import org.apache.dubbo.registry.client.DefaultServiceInstance; import org.apache.dubbo.registry.client.ServiceDiscovery; import org.apache.dubbo.registry.client.ServiceInstance; +import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializingEvent; import java.io.IOException; import java.util.ArrayList; @@ -65,6 +66,7 @@ import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.SortedSet; +import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Condition; @@ -77,6 +79,7 @@ import static java.util.concurrent.Executors.newSingleThreadExecutor; 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.METADATA_REMOTE; +import static org.apache.dubbo.common.function.ThrowableAction.execute; import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty; import static org.apache.dubbo.config.context.ConfigManager.getInstance; import static org.apache.dubbo.metadata.WritableMetadataService.getExtension; @@ -88,7 +91,7 @@ import static org.apache.dubbo.remoting.Constants.CLIENT_KEY; * * @since 2.7.4 */ -public class DubboBootstrap implements Lifecycle { +public class DubboBootstrap extends GenericEventListener implements Lifecycle { public static final String DEFAULT_REGISTRY_ID = "REGISTRY#DEFAULT"; @@ -137,10 +140,22 @@ public class DubboBootstrap implements Lifecycle { private volatile MetadataServiceExporter metadataServiceExporter; + private SortedSet serviceDiscoveries = new ConcurrentSkipListSet<>(); + public DubboBootstrap() { DubboShutdownHook.getDubboShutdownHook().register(); } + /** + * Store the {@link ServiceDiscovery} instances into {@link ServiceDiscoveryInitializingEvent} + * + * @param event {@link ServiceDiscoveryInitializingEvent} + * @see {@linkplan org.apache.dubbo.registry.client.EventPublishingServiceDiscovery} + */ + public void onServiceDiscoveryInitializing(ServiceDiscoveryInitializingEvent event) { + serviceDiscoveries.add(event.getSource()); + } + /** * Set only register provider or not * @@ -440,6 +455,8 @@ public class DubboBootstrap implements Lifecycle { initMetadataServiceExporter(); + initEventListener(); + initialized = true; if (logger.isInfoEnabled()) { @@ -451,56 +468,40 @@ public class DubboBootstrap implements Lifecycle { return this; } - /** - * Initialize {@link MetadataService} from {@link WritableMetadataService}'s extension - */ - private void initMetadataService() { - this.metadataService = getExtension(isDefaultMetadataStorageType()); + private void startConfigCenter() { + Collection configCenters = configManager.getConfigCenters(); + + if (CollectionUtils.isNotEmpty(configCenters)) { + CompositeDynamicConfiguration compositeDynamicConfiguration = new CompositeDynamicConfiguration(); + for (ConfigCenterConfig configCenter : configCenters) { + configCenter.refresh(); + compositeDynamicConfiguration.addConfiguration(prepareEnvironment(configCenter)); + } + Environment.getInstance().setDynamicConfiguration(compositeDynamicConfiguration); + } + configManager.refreshAll(); } - /** - * Initialize {@link MetadataServiceExporter} - */ - private void initMetadataServiceExporter() { - this.metadataServiceExporter = new ConfigurableMetadataServiceExporter() - .setApplicationConfig(getApplication()) - .setRegistries(configManager.getRegistries()) - .setProtocols(configManager.getProtocols()) - .metadataService(metadataService); - } + private void startMetadataReport() { + ApplicationConfig applicationConfig = configManager.getApplication().orElseThrow( + () -> new IllegalStateException("There's no ApplicationConfig specified.") + ); - private void loadRemoteConfigs() { - // registry ids to registry configs - List tmpRegistries = new ArrayList<>(); - Set registryIds = configManager.getRegistryIds(); - registryIds.forEach(id -> { - if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) { - tmpRegistries.add(configManager.getRegistry(id).orElseGet(() -> { - RegistryConfig registryConfig = new RegistryConfig(); - registryConfig.setId(id); - registryConfig.refresh(); - return registryConfig; - })); + String metadataType = applicationConfig.getMetadata(); + // FIXME, multiple metadata config support. + Collection metadataReportConfigs = configManager.getMetadataConfigs(); + if (CollectionUtils.isEmpty(metadataReportConfigs)) { + if (METADATA_REMOTE.equals(metadataType)) { + throw new IllegalStateException("No MetadataConfig found, you must specify the remote Metadata Center address when set 'metadata=remote'."); } - }); + return; + } + MetadataReportConfig metadataReportConfig = metadataReportConfigs.iterator().next(); + if (!metadataReportConfig.isValid()) { + return; + } - configManager.addRegistries(tmpRegistries); - - // protocol ids to protocol configs - List tmpProtocols = new ArrayList<>(); - Set protocolIds = configManager.getProtocolIds(); - protocolIds.forEach(id -> { - if (tmpProtocols.stream().noneMatch(prot -> prot.getId().equals(id))) { - tmpProtocols.add(configManager.getProtocol(id).orElseGet(() -> { - ProtocolConfig protocolConfig = new ProtocolConfig(); - protocolConfig.setId(id); - protocolConfig.refresh(); - return protocolConfig; - })); - } - }); - - configManager.addProtocols(tmpProtocols); + MetadataReportInstance.init(metadataReportConfig.toUrl()); } /** @@ -537,8 +538,69 @@ public class DubboBootstrap implements Lifecycle { startConfigCenter(); } + private void loadRemoteConfigs() { + // registry ids to registry configs + List tmpRegistries = new ArrayList<>(); + Set registryIds = configManager.getRegistryIds(); + registryIds.forEach(id -> { + if (tmpRegistries.stream().noneMatch(reg -> reg.getId().equals(id))) { + tmpRegistries.add(configManager.getRegistry(id).orElseGet(() -> { + RegistryConfig registryConfig = new RegistryConfig(); + registryConfig.setId(id); + registryConfig.refresh(); + return registryConfig; + })); + } + }); + + configManager.addRegistries(tmpRegistries); + + // protocol ids to protocol configs + List tmpProtocols = new ArrayList<>(); + Set protocolIds = configManager.getProtocolIds(); + protocolIds.forEach(id -> { + if (tmpProtocols.stream().noneMatch(prot -> prot.getId().equals(id))) { + tmpProtocols.add(configManager.getProtocol(id).orElseGet(() -> { + ProtocolConfig protocolConfig = new ProtocolConfig(); + protocolConfig.setId(id); + protocolConfig.refresh(); + return protocolConfig; + })); + } + }); + + configManager.addProtocols(tmpProtocols); + } + + + /** + * Initialize {@link MetadataService} from {@link WritableMetadataService}'s extension + */ + private void initMetadataService() { + this.metadataService = getExtension(isDefaultMetadataStorageType()); + } + + /** + * Initialize {@link MetadataServiceExporter} + */ + private void initMetadataServiceExporter() { + this.metadataServiceExporter = new ConfigurableMetadataServiceExporter() + .setApplicationConfig(getApplication()) + .setRegistries(configManager.getRegistries()) + .setProtocols(configManager.getProtocols()) + .metadataService(metadataService); + } + + /** + * Initialize {@link EventListener} + */ + private void initEventListener() { + // Add current instance into listeners + addEventListener(this); + } + private Collection getServiceDiscoveries() { - return AbstractServiceDiscoveryFactory.getDiscoveries(); + return serviceDiscoveries; } /** @@ -631,8 +693,8 @@ public class DubboBootstrap implements Lifecycle { public boolean isStarted() { return started; } - /* serve for builder apis, begin */ + private ApplicationBuilder createApplicationBuilder(String name) { return new ApplicationBuilder().name(name); } @@ -660,43 +722,7 @@ public class DubboBootstrap implements Lifecycle { private ConsumerBuilder createConsumerBuilder(String id) { return new ConsumerBuilder().id(id); } - /* serve for builder apis, end */ - private void startMetadataReport() { - ApplicationConfig applicationConfig = configManager.getApplication().orElseThrow( - () -> new IllegalStateException("There's no ApplicationConfig specified.") - ); - - String metadataType = applicationConfig.getMetadata(); - // FIXME, multiple metadata config support. - Collection metadataReportConfigs = configManager.getMetadataConfigs(); - if (CollectionUtils.isEmpty(metadataReportConfigs)) { - if (METADATA_REMOTE.equals(metadataType)) { - throw new IllegalStateException("No MetadataConfig found, you must specify the remote Metadata Center address when set 'metadata=remote'."); - } - return; - } - MetadataReportConfig metadataReportConfig = metadataReportConfigs.iterator().next(); - if (!metadataReportConfig.isValid()) { - return; - } - - MetadataReportInstance.init(metadataReportConfig.toUrl()); - } - - private void startConfigCenter() { - Collection configCenters = configManager.getConfigCenters(); - - if (CollectionUtils.isNotEmpty(configCenters)) { - CompositeDynamicConfiguration compositeDynamicConfiguration = new CompositeDynamicConfiguration(); - for (ConfigCenterConfig configCenter : configCenters) { - configCenter.refresh(); - compositeDynamicConfiguration.addConfiguration(prepareEnvironment(configCenter)); - } - Environment.getInstance().setDynamicConfiguration(compositeDynamicConfiguration); - } - configManager.refreshAll(); - } private DynamicConfiguration prepareEnvironment(ConfigCenterConfig configCenter) { if (configCenter.isValid()) { @@ -777,7 +803,7 @@ public class DubboBootstrap implements Lifecycle { int port = exportedURL.getPort(); - ServiceInstance serviceInstance = initServiceInstance(serviceName, host, port); + ServiceInstance serviceInstance = createServiceInstance(serviceName, host, port); getServiceDiscoveries().forEach(serviceDiscovery -> serviceDiscovery.register(serviceInstance)); } @@ -801,42 +827,15 @@ public class DubboBootstrap implements Lifecycle { return selectedURL; } - /** - * Use rest protocol if there's one, otherwise, choose the first one available. - * - * @return - */ - private String findOneProtocolForServiceInstance(Set protocols) { - String result = null; - for (String protocol : protocols) { - if ("rest".equalsIgnoreCase(protocol)) { - result = protocol; - break; - } - } - - if (result == null) { - for (String protocol : protocols) { - if (!"injvm".equalsIgnoreCase(protocol) && "registry".equalsIgnoreCase(protocol)) { - result = protocol; - break; - } - } - } - return result; - } - private void unregisterServiceInstance() { - if (serviceInstance != null) { getServiceDiscoveries().forEach(serviceDiscovery -> { serviceDiscovery.unregister(serviceInstance); }); } - } - private ServiceInstance initServiceInstance(String serviceName, String host, int port) { + private ServiceInstance createServiceInstance(String serviceName, String host, int port) { this.serviceInstance = new DefaultServiceInstance(serviceName, host, port); setMetadataStorageType(serviceInstance, isDefaultMetadataStorageType()); return this.serviceInstance; @@ -850,6 +849,8 @@ public class DubboBootstrap implements Lifecycle { destroyReferences(); + destroyServiceDiscoveries(); + clear(); release(); @@ -871,8 +872,20 @@ public class DubboBootstrap implements Lifecycle { } } + private void destroyServiceDiscoveries() { + getServiceDiscoveries().forEach(serviceDiscovery -> { + execute(() -> { + serviceDiscovery.destroy(); + }); + }); + if (logger.isDebugEnabled()) { + logger.debug(NAME + "'s all ServiceDiscoveries have been destroyed."); + } + } + private void clear() { clearConfigs(); + clearServiceDiscoveries(); } private void clearConfigs() { @@ -882,6 +895,13 @@ public class DubboBootstrap implements Lifecycle { } } + private void clearServiceDiscoveries() { + serviceDiscoveries.clear(); + if (logger.isDebugEnabled()) { + logger.debug(NAME + "'s serviceDiscoveries have been clear."); + } + } + private void release() { executeMutually(() -> { while (awaited.compareAndSet(false, true)) { diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java index b8d941b648..f5fc29161c 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java @@ -17,51 +17,26 @@ package org.apache.dubbo.registry.client; import org.apache.dubbo.common.URL; -import org.apache.dubbo.common.logger.Logger; -import org.apache.dubbo.common.logger.LoggerFactory; -import java.util.Collection; -import java.util.Collections; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +/** + * Abstract {@link ServiceDiscoveryFactory} implementation with cache, the subclass + * should implement {@link #createDiscovery(URL)} method to create an instance of {@link ServiceDiscovery} + * + * @see ServiceDiscoveryFactory + * @since 2.7.4 + */ public abstract class AbstractServiceDiscoveryFactory implements ServiceDiscoveryFactory { - private static final Logger logger = LoggerFactory.getLogger(AbstractServiceDiscoveryFactory.class); + private final ConcurrentMap discoveries = new ConcurrentHashMap<>(); - private static ConcurrentMap discoveries = new ConcurrentHashMap<>(); - - public static Collection getDiscoveries() { - return Collections.unmodifiableCollection(discoveries.values()); - } - - /** - * Close all created registries - */ - public static void destroyAll() { - if (logger.isInfoEnabled()) { - logger.info("Closing all ServiceDiscovery instances: " + getDiscoveries()); - } - - for (ServiceDiscovery discovery : getDiscoveries()) { - try { - discovery.destroy(); - } catch (Throwable e) { - logger.error("Error trying to close ServiceDiscovery instance.", e); - } - } - discoveries.clear(); - } - - /** - * @param registryURL "zookeeper://ip:port/RegistryService?xxx" - * @return - */ @Override public ServiceDiscovery getServiceDiscovery(URL registryURL) { String key = registryURL.toServiceStringWithoutResolving(); return discoveries.computeIfAbsent(key, k -> createDiscovery(registryURL)); } - protected abstract ServiceDiscovery createDiscovery(URL url); + protected abstract ServiceDiscovery createDiscovery(URL registryURL); } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java index c5f5fe4bd4..68e9d86f59 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java @@ -33,6 +33,7 @@ import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoad * @since 2.7.4 */ public class DefaultServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory { + /** * Create the {@link ServiceDiscovery} by {@link URL#getProtocol() the protocol} from {@link URL connection URL} * diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java index f85138f228..dc20a0ffa3 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java @@ -235,9 +235,9 @@ final class EventPublishingServiceDiscovery implements ServiceDiscovery { } executeWithEvents( - of(new ServiceDiscoveryInitializingEvent(serviceDiscovery)), + of(new ServiceDiscoveryInitializingEvent(this, serviceDiscovery)), () -> serviceDiscovery.initialize(registryURL), - of(new ServiceDiscoveryInitializedEvent(serviceDiscovery)) + of(new ServiceDiscoveryInitializedEvent(this, serviceDiscovery)) ); // doesn't start -> started @@ -257,9 +257,9 @@ final class EventPublishingServiceDiscovery implements ServiceDiscovery { } executeWithEvents( - of(new ServiceDiscoveryDestroyingEvent(serviceDiscovery)), + of(new ServiceDiscoveryDestroyingEvent(this, serviceDiscovery)), serviceDiscovery::destroy, - of(new ServiceDiscoveryDestroyedEvent(serviceDiscovery)) + of(new ServiceDiscoveryDestroyedEvent(this, serviceDiscovery)) ); // doesn't stop -> stopped @@ -273,7 +273,7 @@ final class EventPublishingServiceDiscovery implements ServiceDiscovery { try { action.execute(); } catch (Exception e) { - dispatchEvent(new ServiceDiscoveryExceptionEvent(serviceDiscovery, e)); + dispatchEvent(new ServiceDiscoveryExceptionEvent(this, serviceDiscovery, e)); } afterEvent.ifPresent(this::dispatchEvent); } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java index 2303335708..7a99fdcdfe 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java @@ -26,14 +26,8 @@ import org.apache.dubbo.registry.client.ServiceDiscovery; */ public class ServiceDiscoveryDestroyedEvent extends ServiceDiscoveryEvent { - /** - * Constructs a prototypical Event. - * - * @param serviceDiscovery The instance of {@link ServiceDiscovery} as source - * @throws IllegalArgumentException if source is null. - */ - public ServiceDiscoveryDestroyedEvent(ServiceDiscovery serviceDiscovery) { - super(serviceDiscovery); + public ServiceDiscoveryDestroyedEvent(ServiceDiscovery source, ServiceDiscovery original) { + super(source, original); } } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java index 60500eefdd..d6ebfd61e6 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java @@ -26,14 +26,8 @@ import org.apache.dubbo.registry.client.ServiceDiscovery; */ public class ServiceDiscoveryDestroyingEvent extends ServiceDiscoveryEvent { - /** - * Constructs a prototypical Event. - * - * @param serviceDiscovery The instance of {@link ServiceDiscovery} as source - * @throws IllegalArgumentException if source is null. - */ - public ServiceDiscoveryDestroyingEvent(ServiceDiscovery serviceDiscovery) { - super(serviceDiscovery); + public ServiceDiscoveryDestroyingEvent(ServiceDiscovery source, ServiceDiscovery original) { + super(source, original); } } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java index a319fd51fd..afe613da47 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java @@ -28,14 +28,23 @@ import org.apache.dubbo.registry.client.ServiceDiscovery; */ public abstract class ServiceDiscoveryEvent extends Event { + private final ServiceDiscovery original; + /** * Constructs a prototypical Event. * - * @param serviceDiscovery The {@link ServiceDiscovery} on which the Event initially occurred. + * @param source The object on which the Event initially occurred. + * @param original The original {@link ServiceDiscovery} * @throws IllegalArgumentException if source is null. */ - public ServiceDiscoveryEvent(ServiceDiscovery serviceDiscovery) { - super(serviceDiscovery); + public ServiceDiscoveryEvent(ServiceDiscovery source, ServiceDiscovery original) { + super(source); + this.original = original; + } + + @Override + public ServiceDiscovery getSource() { + return (ServiceDiscovery) super.getSource(); } /** @@ -44,6 +53,15 @@ public abstract class ServiceDiscoveryEvent extends Event { * @return {@link ServiceDiscovery} instance */ public final ServiceDiscovery getServiceDiscovery() { - return (ServiceDiscovery) getSource(); + return getSource(); + } + + /** + * Get the original {@link ServiceDiscovery} + * + * @return the original {@link ServiceDiscovery} + */ + public final ServiceDiscovery getOriginal() { + return original; } } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java index 49582aba47..328be1e13f 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java @@ -29,14 +29,8 @@ public class ServiceDiscoveryExceptionEvent extends ServiceDiscoveryEvent { private final Exception cause; - /** - * Constructs a prototypical Event. - * - * @param serviceDiscovery The {@link ServiceDiscovery} on which the Event initially occurred. - * @throws IllegalArgumentException if any argument is null. - */ - public ServiceDiscoveryExceptionEvent(ServiceDiscovery serviceDiscovery, Exception cause) { - super(serviceDiscovery); + public ServiceDiscoveryExceptionEvent(ServiceDiscovery source, ServiceDiscovery original, Exception cause) { + super(source, original); if (cause == null) { throw new NullPointerException("The cause of Exception must not null"); } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java index 31bcc79d8e..a688847a93 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java @@ -27,14 +27,7 @@ import org.apache.dubbo.registry.client.ServiceDiscovery; */ public class ServiceDiscoveryInitializedEvent extends ServiceDiscoveryEvent { - /** - * Constructs a prototypical Event. - * - * @param serviceDiscovery The instance of {@link ServiceDiscovery} as source - * @throws IllegalArgumentException if source is null. - */ - public ServiceDiscoveryInitializedEvent(ServiceDiscovery serviceDiscovery) { - super(serviceDiscovery); + public ServiceDiscoveryInitializedEvent(ServiceDiscovery source, ServiceDiscovery original) { + super(source, original); } - } diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java index 92ef4d1e90..da92466d51 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java @@ -27,13 +27,7 @@ import org.apache.dubbo.registry.client.ServiceDiscovery; */ public class ServiceDiscoveryInitializingEvent extends ServiceDiscoveryEvent { - /** - * Constructs a prototypical Event. - * - * @param serviceDiscovery The instance of {@link ServiceDiscovery} as source - * @throws IllegalArgumentException if source is null. - */ - public ServiceDiscoveryInitializingEvent(ServiceDiscovery serviceDiscovery) { - super(serviceDiscovery); + public ServiceDiscoveryInitializingEvent(ServiceDiscovery source, ServiceDiscovery original) { + super(source, original); } } diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/LoggingEventListenerTest.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/LoggingEventListenerTest.java index f594a43c3f..e1eeecf7c6 100644 --- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/LoggingEventListenerTest.java +++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/client/event/listener/LoggingEventListenerTest.java @@ -59,10 +59,10 @@ public class LoggingEventListenerTest { serviceDiscovery.initialize(connectionURL); // ServiceDiscoveryStartingEvent - listener.onEvent(new ServiceDiscoveryInitializingEvent(serviceDiscovery)); + listener.onEvent(new ServiceDiscoveryInitializingEvent(serviceDiscovery, serviceDiscovery)); // ServiceDiscoveryStartedEvent - listener.onEvent(new ServiceDiscoveryInitializedEvent(serviceDiscovery)); + listener.onEvent(new ServiceDiscoveryInitializedEvent(serviceDiscovery, serviceDiscovery)); // ServiceInstancePreRegisteredEvent listener.onEvent(new ServiceInstancePreRegisteredEvent(serviceDiscovery, createInstance())); @@ -80,9 +80,9 @@ public class LoggingEventListenerTest { listener.onEvent(new ServiceInstanceUnregisteredEvent(serviceDiscovery, createInstance())); // ServiceDiscoveryStoppingEvent - listener.onEvent(new ServiceDiscoveryDestroyingEvent(serviceDiscovery)); + listener.onEvent(new ServiceDiscoveryDestroyingEvent(serviceDiscovery, serviceDiscovery)); // ServiceDiscoveryStoppedEvent - listener.onEvent(new ServiceDiscoveryDestroyedEvent(serviceDiscovery)); + listener.onEvent(new ServiceDiscoveryDestroyedEvent(serviceDiscovery, serviceDiscovery)); } } From dea95071c1a2dfde3318ea66c9844c416d8610e3 Mon Sep 17 00:00:00 2001 From: Mercy Ma Date: Fri, 16 Aug 2019 15:19:09 +0800 Subject: [PATCH 5/9] Dubbo cloud native (#4853) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Polish apache/dubbo#4542 : [Enhancement] Adapt the Java standard Event/Listener mechanism * Polish apache/dubbo#4541 : [Feature] Add local File System DynamicConfigurationFactory‘s extension * Polish apache#4541 : Bugfix * Polish apache/dubbo#4541 : Optimization * Polish apache/dubbo#4541 : Add the compatibility for PollingWatchService on the some platforms * Polish apache/dubbo#4541 : Add delay publish without ThreadPoolExecutor * Polish apache/dubbo#4541 : Refactor the extension name * Polish apache/dubbo#4541 : Add remove ops * Polish apache/dubbo#4541 : Add testable constructor * Polish apache/dubbo#4541 : Add getConfigGroups method * Polish apache/dubbo#4610 : [Refactor] Refactor the bootstrap module * Polish apache/dubbo#4541 : Fix the nulling URL issue * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager * Polish apache/dubbo#4622 : Support multiple configcenters * Polish apache/dubbo#4671 : ServiceNameMapping will not map the group, version and protocol * update referenceCount log (#4683) Add comments to support multiple shared connections * Polish /apache/dubbo#4687 : Remove the duplicated test code in dubbo-config-spring (#4688) * #4685 修改代码if判断false问题 if (hasException == false)修改成if (!hasException) (#4695) * Fixed Service annotation method parameters are not in effect (#4598) * keep demo simple, and switch to use zookeeper as registry center (#4705) * keep demo simple, and switch to use zookeeper as registry center * remove comment * @Reference auto-wires the instance of generic interface #4594 (#4677) * try to shorten maven output to make travis build pass (#4710) * use CountDownLatch to check zk registry if establish connection (#4589) * Minor change * Rename the extension name of WritableMetadataService * Polish apache/dubbo#4759 : [Refactor] Change the signature of methods of MetadataService #4759 * Merge remote-tracking branch 'upstream/master' into dubbo-cloud-native # Conflicts: # dubbo-all/pom.xml # dubbo-bom/pom.xml # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.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/RegistryConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java # dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java # dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-etcd/src/test/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfigurationTest.java # dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java # dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java # dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java # dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java # dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java # dubbo-metadata/pom.xml # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java # dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java # dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistryFactory.java # dubbo-rpc/dubbo-rpc-xml/src/main/java/org/apache/dubbo/xml/rpc/protocol/xmlrpc/XmlRpcProtocol.java * Polish apache/dubbo#3984 : Add the implementation of Page getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) * Code merge * Fix the cases * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java # dubbo-metadata/dubbo-metadata-definition-protobuf/pom.xml # dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java # dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java * Refactor ConfigManager * Refactor ConfigManager * Resolve the issues on ConfigManager * Refactor and add test-cases for ConfigManager * Polish apache/dubbo#4774 : [Feature] Dubbo Cloud Native - To Support in Spring * Polish apache/dubbo#4808 : [Feature] Add the registered/unregistered event mechanism ShutdownHook * Polish apache/dubbo#4807 : [Feature] Add the callback mechanism ShutdownHook #4807 * Polish apache/dubbo#4813 : [Feature] add Prioritized implementation for ServiceInstanceCustomizer * Polish apache/dubbo#4815 : [Feature] Add the ServiceLoader for Dubbo's services or components * Polish apache/dubbo#4815 : [Feature] Add the ServiceLoader for Dubbo's services or components * Polish apache/dubbo#4813 : [Feature] add Prioritized implementation for ServiceInstanceCustomizer * Polish apache/dubbo#4807 : Add sort implementation * Refactor * Refactor * Polish apache/dubbo#4845 : [Feature] Enhance the Event-Publishing feature to original ServiceDiscovery * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java --- .../org/apache/dubbo/bootstrap/DubboBootstrap.java | 10 +++++++--- .../dubbo/bootstrap/DubboServiceConsumerBootstrap.java | 1 + .../bootstrap/DubboServiceProvider2Bootstrap.java | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java index b7df466335..437024d999 100644 --- a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java +++ b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java @@ -63,10 +63,10 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.SortedSet; -import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.ExecutorService; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Condition; @@ -75,6 +75,7 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; import static java.util.Arrays.asList; +import static java.util.Collections.sort; import static java.util.concurrent.Executors.newSingleThreadExecutor; import static org.apache.dubbo.common.config.ConfigurationUtils.parseProperties; import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration; @@ -140,7 +141,7 @@ public class DubboBootstrap extends GenericEventListener implements Lifecycle { private volatile MetadataServiceExporter metadataServiceExporter; - private SortedSet serviceDiscoveries = new ConcurrentSkipListSet<>(); + private volatile List serviceDiscoveries = new LinkedList<>(); public DubboBootstrap() { DubboShutdownHook.getDubboShutdownHook().register(); @@ -153,7 +154,10 @@ public class DubboBootstrap extends GenericEventListener implements Lifecycle { * @see {@linkplan org.apache.dubbo.registry.client.EventPublishingServiceDiscovery} */ public void onServiceDiscoveryInitializing(ServiceDiscoveryInitializingEvent event) { - serviceDiscoveries.add(event.getSource()); + executeMutually(() -> { + serviceDiscoveries.add(event.getSource()); + sort(serviceDiscoveries); + }); } /** diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java index bf1fe0ae5f..96a865f3f6 100644 --- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java @@ -35,6 +35,7 @@ public class DubboServiceConsumerBootstrap { .registry("zookeeper", builder -> builder.address("zookeeper://127.0.0.1:2181?registry.type=service&subscribed.services=dubbo-provider-demo")) // .metadataReport(new MetadataReportConfig("zookeeper://127.0.0.1:2181")) // Nacos + .registry("nacos", builder -> builder.address("nacos://127.0.0.1:8848?registry.type=service&subscribed.services=dubbo-provider-demo")) // .registry("consul", builder -> builder.address("consul://127.0.0.1:8500?registry.type=service&subscribed.services=dubbo-provider-demo").group("namespace1")) .reference("echo", builder -> builder.interfaceClass(EchoService.class).protocol("dubbo")) .reference("user", builder -> builder.interfaceClass(UserService.class).protocol("rest")) diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java index 83ea7a12ff..15bb814c2b 100644 --- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java @@ -32,7 +32,7 @@ public class DubboServiceProvider2Bootstrap { // Zookeeper in service registry type .registry("zookeeper", builder -> builder.address("zookeeper://127.0.0.1:2181?registry.type=service")) // Nacos -// .registry("nacos", builder -> builder.address("nacos://127.0.0.1:8848?registry.type=service")) + .registry("nacos", builder -> builder.address("nacos://127.0.0.1:8848?registry.type=service")) // .registry(RegistryBuilder.newBuilder().address("etcd3://127.0.0.1:2379?registry.type=service").build()) .protocol("dubbo", builder -> builder.port(20885).name("dubbo")) .protocol("rest", builder -> builder.port(9090).name("rest")) From 790de7467e40c12cf4bff209a2218e16841fbc34 Mon Sep 17 00:00:00 2001 From: cvictory Date: Fri, 16 Aug 2019 15:19:52 +0800 Subject: [PATCH 6/9] etcd test --- .../EtcdDubboServiceConsumerBootstrap.java | 1 + dubbo-dependencies-bom/pom.xml | 5 + ...che.dubbo.registry.client.ServiceDiscovery | 2 +- dubbo-remoting/dubbo-remoting-etcd3/pom.xml | 15 +++ .../remoting/etcd/jetcd/JEtcdClient.java | 2 +- .../dubbo/remoting/etcd/jetcd/LeaseTest.java | 122 ++++++++++++++++++ 6 files changed, 145 insertions(+), 2 deletions(-) create mode 100644 dubbo-remoting/dubbo-remoting-etcd3/src/test/java/org/apache/dubbo/remoting/etcd/jetcd/LeaseTest.java diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java index db4e1529fa..7b0fc47e72 100644 --- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java @@ -33,6 +33,7 @@ public class EtcdDubboServiceConsumerBootstrap { new DubboBootstrap() .application("dubbo-consumer-demo") // Zookeeper + .protocol(builder -> builder.port(20887).name("dubbo")) .registry("zookeeper", builder -> builder.address("etcd3://127.0.0.1:2379?registry.type=service&subscribed.services=dubbo-provider-demo")) .metadataReport(new MetadataReportConfig("etcd://127.0.0.1:2379")) // Nacos diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml index 35c808fc74..ea55a6507d 100644 --- a/dubbo-dependencies-bom/pom.xml +++ b/dubbo-dependencies-bom/pom.xml @@ -428,6 +428,11 @@ + + io.etcd + jetcd-launcher + ${jetcd_version} + org.slf4j diff --git a/dubbo-registry/dubbo-registry-etcd3/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery b/dubbo-registry/dubbo-registry-etcd3/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery index 60f47ac9e4..804f787815 100644 --- a/dubbo-registry/dubbo-registry-etcd3/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery +++ b/dubbo-registry/dubbo-registry-etcd3/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery @@ -1 +1 @@ -etcd=org.apache.dubbo.registry.etcd.EtcdServiceDiscovery \ No newline at end of file +etcd3=org.apache.dubbo.registry.etcd.EtcdServiceDiscovery diff --git a/dubbo-remoting/dubbo-remoting-etcd3/pom.xml b/dubbo-remoting/dubbo-remoting-etcd3/pom.xml index 285854bda8..266e3f67be 100644 --- a/dubbo-remoting/dubbo-remoting-etcd3/pom.xml +++ b/dubbo-remoting/dubbo-remoting-etcd3/pom.xml @@ -32,6 +32,7 @@ The etcd3 remoting module of Dubbo project false + 3.13.2 @@ -48,10 +49,24 @@ io.etcd jetcd-core + + + io.etcd + jetcd-launcher + test + + io.netty netty-all + + org.assertj + assertj-core + ${assertj.version} + test + + diff --git a/dubbo-remoting/dubbo-remoting-etcd3/src/main/java/org/apache/dubbo/remoting/etcd/jetcd/JEtcdClient.java b/dubbo-remoting/dubbo-remoting-etcd3/src/main/java/org/apache/dubbo/remoting/etcd/jetcd/JEtcdClient.java index d4512d4d46..784b5a0cea 100644 --- a/dubbo-remoting/dubbo-remoting-etcd3/src/main/java/org/apache/dubbo/remoting/etcd/jetcd/JEtcdClient.java +++ b/dubbo-remoting/dubbo-remoting-etcd3/src/main/java/org/apache/dubbo/remoting/etcd/jetcd/JEtcdClient.java @@ -205,7 +205,7 @@ public class JEtcdClient extends AbstractEtcdClient { @Override public boolean putEphemeral(String key, String value) { - return clientWrapper.put(key, value); + return clientWrapper.putEphemeral(key, value); } public ManagedChannel getChannel() { diff --git a/dubbo-remoting/dubbo-remoting-etcd3/src/test/java/org/apache/dubbo/remoting/etcd/jetcd/LeaseTest.java b/dubbo-remoting/dubbo-remoting-etcd3/src/test/java/org/apache/dubbo/remoting/etcd/jetcd/LeaseTest.java new file mode 100644 index 0000000000..2e0d5afbff --- /dev/null +++ b/dubbo-remoting/dubbo-remoting-etcd3/src/test/java/org/apache/dubbo/remoting/etcd/jetcd/LeaseTest.java @@ -0,0 +1,122 @@ +package org.apache.dubbo.remoting.etcd.jetcd; + +import com.google.common.base.Charsets; +import io.etcd.jetcd.ByteSequence; +import io.etcd.jetcd.Client; +import io.etcd.jetcd.CloseableClient; +import io.etcd.jetcd.KV; +import io.etcd.jetcd.Lease; +import io.etcd.jetcd.Observers; +import io.etcd.jetcd.launcher.EtcdCluster; +import io.etcd.jetcd.launcher.EtcdClusterFactory; +import io.etcd.jetcd.lease.LeaseKeepAliveResponse; +import io.etcd.jetcd.options.PutOption; +import io.grpc.stub.StreamObserver; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author cvictory ON 2019-08-16 + */ +public class LeaseTest { + + private static EtcdCluster cluster; + + private KV kvClient; + private Client client; + private Lease leaseClient; + + private static final ByteSequence KEY = ByteSequence.from("foo", Charsets.UTF_8); + private static final ByteSequence KEY_2 = ByteSequence.from("foo2", Charsets.UTF_8); + private static final ByteSequence VALUE = ByteSequence.from("bar", Charsets.UTF_8); + + @BeforeAll + public static void beforeClass() { + cluster = EtcdClusterFactory.buildCluster("etcd-lease", 3, false); + cluster.start(); + } + + @AfterAll + public static void afterClass() { + cluster.close(); + } + + @BeforeEach + public void setUp() { + client = Client.builder().endpoints(cluster.getClientEndpoints()).build(); + kvClient = client.getKVClient(); + leaseClient = client.getLeaseClient(); + } + + @AfterEach + public void tearDown() { + if (client != null) { + client.close(); + } + + } + + @Test + public void testGrant() throws Exception { + long leaseID = leaseClient.grant(5).get().getID(); + + kvClient.put(KEY, VALUE, PutOption.newBuilder().withLeaseId(leaseID).build()).get(); + assertThat(kvClient.get(KEY).get().getCount()).isEqualTo(1); + + Thread.sleep(6000); + assertThat(kvClient.get(KEY).get().getCount()).isEqualTo(0); + } + + @Test + public void testRevoke() throws Exception { + long leaseID = leaseClient.grant(5).get().getID(); + kvClient.put(KEY, VALUE, PutOption.newBuilder().withLeaseId(leaseID).build()).get(); + assertThat(kvClient.get(KEY).get().getCount()).isEqualTo(1); + leaseClient.revoke(leaseID).get(); + assertThat(kvClient.get(KEY).get().getCount()).isEqualTo(0); + } + + @Test + public void testKeepAliveOnce() throws ExecutionException, InterruptedException { + long leaseID = leaseClient.grant(2).get().getID(); + kvClient.put(KEY, VALUE, PutOption.newBuilder().withLeaseId(leaseID).build()).get(); + assertThat(kvClient.get(KEY).get().getCount()).isEqualTo(1); + LeaseKeepAliveResponse rp = leaseClient.keepAliveOnce(leaseID).get(); + assertThat(rp.getTTL()).isGreaterThan(0); + } + + @Test + public void testKeepAlive() throws ExecutionException, InterruptedException { + long leaseID = leaseClient.grant(2).get().getID(); + kvClient.put(KEY, VALUE, PutOption.newBuilder().withLeaseId(leaseID).build()).get(); + assertThat(kvClient.get(KEY).get().getCount()).isEqualTo(1); + + CountDownLatch latch = new CountDownLatch(1); + AtomicReference responseRef = new AtomicReference<>(); + StreamObserver observer = Observers.observer(response -> { + responseRef.set(response); + latch.countDown(); + }); + + try (CloseableClient c = leaseClient.keepAlive(leaseID, observer)) { + latch.await(5, TimeUnit.SECONDS); + LeaseKeepAliveResponse response = responseRef.get(); + assertThat(response.getTTL()).isGreaterThan(0); + } + + Thread.sleep(3000); + assertThat(kvClient.get(KEY).get().getCount()).isEqualTo(0); + } + +} From 9a20383885fad3f4a39ab23d37d20c55f533532d Mon Sep 17 00:00:00 2001 From: Mercy Ma Date: Fri, 16 Aug 2019 15:50:29 +0800 Subject: [PATCH 7/9] Dubbo cloud native (#4855) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Polish apache/dubbo#4542 : [Enhancement] Adapt the Java standard Event/Listener mechanism * Polish apache/dubbo#4541 : [Feature] Add local File System DynamicConfigurationFactory‘s extension * Polish apache#4541 : Bugfix * Polish apache/dubbo#4541 : Optimization * Polish apache/dubbo#4541 : Add the compatibility for PollingWatchService on the some platforms * Polish apache/dubbo#4541 : Add delay publish without ThreadPoolExecutor * Polish apache/dubbo#4541 : Refactor the extension name * Polish apache/dubbo#4541 : Add remove ops * Polish apache/dubbo#4541 : Add testable constructor * Polish apache/dubbo#4541 : Add getConfigGroups method * Polish apache/dubbo#4610 : [Refactor] Refactor the bootstrap module * Polish apache/dubbo#4541 : Fix the nulling URL issue * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager * Polish apache/dubbo#4622 : Support multiple configcenters * Polish apache/dubbo#4671 : ServiceNameMapping will not map the group, version and protocol * update referenceCount log (#4683) Add comments to support multiple shared connections * Polish /apache/dubbo#4687 : Remove the duplicated test code in dubbo-config-spring (#4688) * #4685 修改代码if判断false问题 if (hasException == false)修改成if (!hasException) (#4695) * Fixed Service annotation method parameters are not in effect (#4598) * keep demo simple, and switch to use zookeeper as registry center (#4705) * keep demo simple, and switch to use zookeeper as registry center * remove comment * @Reference auto-wires the instance of generic interface #4594 (#4677) * try to shorten maven output to make travis build pass (#4710) * use CountDownLatch to check zk registry if establish connection (#4589) * Minor change * Rename the extension name of WritableMetadataService * Polish apache/dubbo#4759 : [Refactor] Change the signature of methods of MetadataService #4759 * Merge remote-tracking branch 'upstream/master' into dubbo-cloud-native # Conflicts: # dubbo-all/pom.xml # dubbo-bom/pom.xml # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.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/RegistryConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java # dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java # dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-etcd/src/test/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfigurationTest.java # dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java # dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java # dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java # dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java # dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java # dubbo-metadata/pom.xml # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java # dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java # dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistryFactory.java # dubbo-rpc/dubbo-rpc-xml/src/main/java/org/apache/dubbo/xml/rpc/protocol/xmlrpc/XmlRpcProtocol.java * Polish apache/dubbo#3984 : Add the implementation of Page getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) * Code merge * Fix the cases * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java # dubbo-metadata/dubbo-metadata-definition-protobuf/pom.xml # dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java # dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java * Refactor ConfigManager * Refactor ConfigManager * Resolve the issues on ConfigManager * Refactor and add test-cases for ConfigManager * Polish apache/dubbo#4774 : [Feature] Dubbo Cloud Native - To Support in Spring * Polish apache/dubbo#4808 : [Feature] Add the registered/unregistered event mechanism ShutdownHook * Polish apache/dubbo#4807 : [Feature] Add the callback mechanism ShutdownHook #4807 * Polish apache/dubbo#4813 : [Feature] add Prioritized implementation for ServiceInstanceCustomizer * Polish apache/dubbo#4815 : [Feature] Add the ServiceLoader for Dubbo's services or components * Polish apache/dubbo#4815 : [Feature] Add the ServiceLoader for Dubbo's services or components * Polish apache/dubbo#4813 : [Feature] add Prioritized implementation for ServiceInstanceCustomizer * Polish apache/dubbo#4807 : Add sort implementation * Refactor * Refactor * Polish apache/dubbo#4845 : [Feature] Enhance the Event-Publishing feature to original ServiceDiscovery * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java * Polish apache/dubbo#4854 : [Feature] MetadataService supports the Dubbo protocol under auto-increased port --- .../dubbo/bootstrap/DubboBootstrap.java | 14 ++-- .../ConfigurableMetadataServiceExporter.java | 67 +++++++++---------- .../dubbo/config/DubboProviderBootstrap.java | 4 +- ...nfigurableMetadataServiceExporterTest.java | 4 +- 4 files changed, 41 insertions(+), 48 deletions(-) diff --git a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java index 437024d999..7ab996875d 100644 --- a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java +++ b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java @@ -588,11 +588,7 @@ public class DubboBootstrap extends GenericEventListener implements Lifecycle { * Initialize {@link MetadataServiceExporter} */ private void initMetadataServiceExporter() { - this.metadataServiceExporter = new ConfigurableMetadataServiceExporter() - .setApplicationConfig(getApplication()) - .setRegistries(configManager.getRegistries()) - .setProtocols(configManager.getProtocols()) - .metadataService(metadataService); + this.metadataServiceExporter = new ConfigurableMetadataServiceExporter(metadataService); } /** @@ -768,12 +764,10 @@ public class DubboBootstrap extends GenericEventListener implements Lifecycle { } /** - * export {@link MetadataService} and get the exported {@link URL URLs} - * - * @return {@link MetadataServiceExporter#getExportedURLs()} + * export {@link MetadataService} */ - private List exportMetadataService() { - return metadataServiceExporter.export().getExportedURLs(); + private void exportMetadataService() { + metadataServiceExporter.export(); } private void unexportMetadataService() { diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java index b5ca2183c1..c59726a51a 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporter.java @@ -19,7 +19,6 @@ package org.apache.dubbo.config.metadata; import org.apache.dubbo.common.URL; import org.apache.dubbo.common.logger.Logger; import org.apache.dubbo.common.logger.LoggerFactory; -import org.apache.dubbo.config.AbstractConfig; import org.apache.dubbo.config.ApplicationConfig; import org.apache.dubbo.config.ProtocolConfig; import org.apache.dubbo.config.RegistryConfig; @@ -28,14 +27,15 @@ import org.apache.dubbo.config.context.ConfigManager; import org.apache.dubbo.metadata.MetadataService; import org.apache.dubbo.metadata.MetadataServiceExporter; -import java.util.Collection; -import java.util.LinkedList; +import java.util.ArrayList; import java.util.List; +import static java.util.Arrays.asList; import static java.util.Collections.emptyList; +import static org.apache.dubbo.common.constants.CommonConstants.DUBBO; /** - * {@link MetadataServiceExporter} implementation based on {@link AbstractConfig Dubbo configurations}, the clients + * {@link MetadataServiceExporter} implementation based on {@link ConfigManager Dubbo configurations}, the clients * should make sure the {@link ApplicationConfig}, {@link RegistryConfig} and {@link ProtocolConfig} are ready before * {@link #export()}. *

@@ -53,38 +53,15 @@ public class ConfigurableMetadataServiceExporter implements MetadataServiceExpor private final Logger logger = LoggerFactory.getLogger(getClass()); - private ApplicationConfig applicationConfig; + private final ConfigManager configManager; - private List registries = new LinkedList<>(); - - private List protocols = new LinkedList<>(); - - private MetadataService metadataService; + private final MetadataService metadataService; private ServiceConfig serviceConfig; - public ConfigurableMetadataServiceExporter setApplicationConfig(ApplicationConfig applicationConfig) { - this.applicationConfig = applicationConfig; - return this; - } - - public ConfigurableMetadataServiceExporter setRegistries(Collection registries) { - this.registries.clear(); - this.registries.addAll(registries); - return this; - } - - public ConfigurableMetadataServiceExporter setProtocols(Collection protocols) { - this.protocols.clear(); - // TODO only support "dubbo" protocol, add more in the future - protocols.stream().filter(protocolConfig -> "dubbo".equals(protocolConfig.getName())) - .forEach(this.protocols::add); - return this; - } - - public ConfigurableMetadataServiceExporter metadataService(MetadataService metadataService) { + public ConfigurableMetadataServiceExporter(MetadataService metadataService) { + this.configManager = ConfigManager.getInstance(); this.metadataService = metadataService; - return this; } @Override @@ -93,12 +70,12 @@ public class ConfigurableMetadataServiceExporter implements MetadataServiceExpor if (!isExported()) { ServiceConfig serviceConfig = new ServiceConfig<>(); - serviceConfig.setApplication(applicationConfig); - serviceConfig.setRegistries(registries); - serviceConfig.setProtocols(protocols); + serviceConfig.setApplication(getApplicationConfig()); + serviceConfig.setRegistries(getRegistries()); + serviceConfig.setProtocols(getProtocols()); serviceConfig.setInterface(MetadataService.class); serviceConfig.setRef(metadataService); - serviceConfig.setGroup(applicationConfig.getName()); + serviceConfig.setGroup(getApplicationConfig().getName()); serviceConfig.setVersion(metadataService.version()); // export @@ -135,4 +112,24 @@ public class ConfigurableMetadataServiceExporter implements MetadataServiceExpor public boolean isExported() { return serviceConfig != null && serviceConfig.isExported(); } + + private ApplicationConfig getApplicationConfig() { + return configManager.getApplication().get(); + } + + private List getRegistries() { + return new ArrayList<>(configManager.getRegistries()); + } + + private List getProtocols() { + return asList(getDefaultProtocol()); + } + + private ProtocolConfig getDefaultProtocol() { + ProtocolConfig defaultProtocol = new ProtocolConfig(); + defaultProtocol.setName(DUBBO); + // auto-increment port + defaultProtocol.setPort(-1); + return defaultProtocol; + } } diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/DubboProviderBootstrap.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/DubboProviderBootstrap.java index 22530f8509..468bc977bd 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/DubboProviderBootstrap.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/DubboProviderBootstrap.java @@ -26,6 +26,8 @@ import org.apache.dubbo.registry.client.DefaultServiceInstance; import org.apache.dubbo.registry.client.ServiceDiscovery; import org.apache.dubbo.registry.client.ServiceDiscoveryFactory; +import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension; + /** * Dubbo Provider Bootstrap */ @@ -60,7 +62,7 @@ public class DubboProviderBootstrap { // 暴露及注册服务 service.export(); - MetadataServiceExporter exporter = new ConfigurableMetadataServiceExporter(); + MetadataServiceExporter exporter = new ConfigurableMetadataServiceExporter(getDefaultExtension()); // 暴露 MetadataService 服务 exporter.export(); diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporterTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporterTest.java index 1528b74cc0..6cf5aba277 100644 --- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporterTest.java +++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/metadata/ConfigurableMetadataServiceExporterTest.java @@ -22,6 +22,7 @@ import org.apache.dubbo.config.ProtocolConfig; import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.context.ConfigManager; import org.apache.dubbo.metadata.MetadataService; +import org.apache.dubbo.metadata.store.InMemoryWritableMetadataService; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -69,8 +70,7 @@ public class ConfigurableMetadataServiceExporterTest { @Test public void testExportAndUnexport() { - ConfigurableMetadataServiceExporter exporter = new ConfigurableMetadataServiceExporter(); - exporter.setApplicationConfig(ConfigManager.getInstance().getApplication().get()); + ConfigurableMetadataServiceExporter exporter = new ConfigurableMetadataServiceExporter(new InMemoryWritableMetadataService()); List urls = exporter.export().getExportedURLs(); assertEquals(1, urls.size()); From 870782e9d3ce6dac9fda6af366a21cfb0c52e824 Mon Sep 17 00:00:00 2001 From: Mercy Ma Date: Fri, 16 Aug 2019 17:22:09 +0800 Subject: [PATCH 8/9] [Enhancement] Sync the Metadata storage type into ApplicationConfig (#4858) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Polish apache/dubbo#4542 : [Enhancement] Adapt the Java standard Event/Listener mechanism * Polish apache/dubbo#4541 : [Feature] Add local File System DynamicConfigurationFactory‘s extension * Polish apache#4541 : Bugfix * Polish apache/dubbo#4541 : Optimization * Polish apache/dubbo#4541 : Add the compatibility for PollingWatchService on the some platforms * Polish apache/dubbo#4541 : Add delay publish without ThreadPoolExecutor * Polish apache/dubbo#4541 : Refactor the extension name * Polish apache/dubbo#4541 : Add remove ops * Polish apache/dubbo#4541 : Add testable constructor * Polish apache/dubbo#4541 : Add getConfigGroups method * Polish apache/dubbo#4610 : [Refactor] Refactor the bootstrap module * Polish apache/dubbo#4541 : Fix the nulling URL issue * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager * Polish apache/dubbo#4622 : [Refactor] Refactor ConfigManager * Polish apache/dubbo#4622 : Support multiple configcenters * Polish apache/dubbo#4671 : ServiceNameMapping will not map the group, version and protocol * update referenceCount log (#4683) Add comments to support multiple shared connections * Polish /apache/dubbo#4687 : Remove the duplicated test code in dubbo-config-spring (#4688) * #4685 修改代码if判断false问题 if (hasException == false)修改成if (!hasException) (#4695) * Fixed Service annotation method parameters are not in effect (#4598) * keep demo simple, and switch to use zookeeper as registry center (#4705) * keep demo simple, and switch to use zookeeper as registry center * remove comment * @Reference auto-wires the instance of generic interface #4594 (#4677) * try to shorten maven output to make travis build pass (#4710) * use CountDownLatch to check zk registry if establish connection (#4589) * Minor change * Rename the extension name of WritableMetadataService * Polish apache/dubbo#4759 : [Refactor] Change the signature of methods of MetadataService #4759 * Merge remote-tracking branch 'upstream/master' into dubbo-cloud-native # Conflicts: # dubbo-all/pom.xml # dubbo-bom/pom.xml # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.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/RegistryConfig.java # dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ServiceConfig.java # dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java # dubbo-configcenter/dubbo-configcenter-api/src/main/java/org/apache/dubbo/configcenter/DynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-api/src/test/java/org/apache/dubbo/configcenter/mock/MockDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-consul/src/main/java/org/apache/dubbo/configcenter/consul/ConsulDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-etcd/src/test/java/org/apache/dubbo/configcenter/support/etcd/EtcdDynamicConfigurationTest.java # dubbo-configcenter/dubbo-configcenter-nacos/src/main/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfiguration.java # dubbo-configcenter/dubbo-configcenter-nacos/src/test/java/org/apache/dubbo/configcenter/support/nacos/NacosDynamicConfigurationTest.java # dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifier.java # dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/report/support/AbstractMetadataReport.java # dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/report/identifier/MetadataIdentifierTest.java # dubbo-metadata/dubbo-metadata-definition-protobuf/src/main/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilder.java # dubbo-metadata/dubbo-metadata-definition-protobuf/src/test/java/org/apache/dubbo/metadata/definition/protobuf/ProtobufTypeBuilderTest.java # dubbo-metadata/pom.xml # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java # dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistry.java # dubbo-registry/dubbo-registry-nacos/src/main/java/org/apache/dubbo/registry/nacos/NacosRegistryFactory.java # dubbo-rpc/dubbo-rpc-xml/src/main/java/org/apache/dubbo/xml/rpc/protocol/xmlrpc/XmlRpcProtocol.java * Polish apache/dubbo#3984 : Add the implementation of Page getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) * Code merge * Fix the cases * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java # dubbo-metadata/dubbo-metadata-definition-protobuf/pom.xml # dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/support/ServiceOrientedRegistryTest.java # dubbo-registry/dubbo-registry-consul/src/main/java/org/apache/dubbo/registry/consul/ConsulServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-etcd3/src/main/java/org/apache/dubbo/registry/etcd/EtcdServiceDiscovery.java * Refactor ConfigManager * Refactor ConfigManager * Resolve the issues on ConfigManager * Refactor and add test-cases for ConfigManager * Polish apache/dubbo#4774 : [Feature] Dubbo Cloud Native - To Support in Spring * Polish apache/dubbo#4808 : [Feature] Add the registered/unregistered event mechanism ShutdownHook * Polish apache/dubbo#4807 : [Feature] Add the callback mechanism ShutdownHook #4807 * Polish apache/dubbo#4813 : [Feature] add Prioritized implementation for ServiceInstanceCustomizer * Polish apache/dubbo#4815 : [Feature] Add the ServiceLoader for Dubbo's services or components * Polish apache/dubbo#4815 : [Feature] Add the ServiceLoader for Dubbo's services or components * Polish apache/dubbo#4813 : [Feature] add Prioritized implementation for ServiceInstanceCustomizer * Polish apache/dubbo#4807 : Add sort implementation * Refactor * Refactor * Polish apache/dubbo#4845 : [Feature] Enhance the Event-Publishing feature to original ServiceDiscovery * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java * Merge remote-tracking branch 'upstream/cloud-native' into dubbo-cloud-native # Conflicts: # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java # dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java * Polish apache/dubbo#4854 : [Feature] MetadataService supports the Dubbo protocol under auto-increased port * Polish apache/dubbo#4857 : [Enhancement] Sync the Metadata storage type into ApplicationConfig --- dubbo-all/pom.xml | 4 ++++ .../dubbo/bootstrap/DubboBootstrap.java | 10 ++++++++- .../DubboServiceProvider2Bootstrap.java | 5 ++++- .../DubboServiceProviderBootstrap.java | 6 +---- .../dubbo/config/ApplicationConfig.java | 11 +++++----- .../config/builders/ApplicationBuilder.java | 2 +- dubbo-registry/dubbo-registry-api/pom.xml | 8 +++++++ .../client/ServiceDiscoveryRegistry.java | 2 +- .../RefreshServiceMetadataCustomizer.java | 12 +++++----- .../ServiceInstanceMetadataUtils.java | 22 +++++++++++++++---- 10 files changed, 58 insertions(+), 24 deletions(-) diff --git a/dubbo-all/pom.xml b/dubbo-all/pom.xml index dd68787550..35790a47d1 100644 --- a/dubbo-all/pom.xml +++ b/dubbo-all/pom.xml @@ -791,6 +791,10 @@ META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory + + META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery + + META-INF/dubbo/internal/org.apache.dubbo.metadata.definition.builder.TypeBuilder diff --git a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java index 7ab996875d..0c864c4188 100644 --- a/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java +++ b/dubbo-bootstrap/src/main/java/org/apache/dubbo/bootstrap/DubboBootstrap.java @@ -84,6 +84,7 @@ import static org.apache.dubbo.common.function.ThrowableAction.execute; import static org.apache.dubbo.common.utils.StringUtils.isNotEmpty; import static org.apache.dubbo.config.context.ConfigManager.getInstance; import static org.apache.dubbo.metadata.WritableMetadataService.getExtension; +import static org.apache.dubbo.metadata.WritableMetadataService.getMetadataStorageType; import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setMetadataStorageType; import static org.apache.dubbo.remoting.Constants.CLIENT_KEY; @@ -455,6 +456,8 @@ public class DubboBootstrap extends GenericEventListener implements Lifecycle { useRegistryAsConfigCenterIfNecessary(); + initApplicationMetadata(); + initMetadataService(); initMetadataServiceExporter(); @@ -472,6 +475,11 @@ public class DubboBootstrap extends GenericEventListener implements Lifecycle { return this; } + private void initApplicationMetadata() { + String metadataStorageType = getMetadataStorageType(isDefaultMetadataStorageType()); + getApplication().setMetadataStorageType(metadataStorageType); + } + private void startConfigCenter() { Collection configCenters = configManager.getConfigCenters(); @@ -491,7 +499,7 @@ public class DubboBootstrap extends GenericEventListener implements Lifecycle { () -> new IllegalStateException("There's no ApplicationConfig specified.") ); - String metadataType = applicationConfig.getMetadata(); + String metadataType = applicationConfig.getMetadataStorageType(); // FIXME, multiple metadata config support. Collection metadataReportConfigs = configManager.getMetadataConfigs(); if (CollectionUtils.isEmpty(metadataReportConfigs)) { diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java index 15bb814c2b..03b9e1d825 100644 --- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProvider2Bootstrap.java @@ -18,6 +18,7 @@ package org.apache.dubbo.bootstrap; import org.apache.dubbo.bootstrap.rest.UserService; import org.apache.dubbo.bootstrap.rest.UserServiceImpl; +import org.apache.dubbo.config.MetadataReportConfig; /** * Dubbo Provider Bootstrap @@ -28,12 +29,14 @@ public class DubboServiceProvider2Bootstrap { public static void main(String[] args) { new DubboBootstrap() + .defaultMetadataStorageType(false) .application("dubbo-provider-demo") // Zookeeper in service registry type .registry("zookeeper", builder -> builder.address("zookeeper://127.0.0.1:2181?registry.type=service")) // Nacos - .registry("nacos", builder -> builder.address("nacos://127.0.0.1:8848?registry.type=service")) +// .registry("nacos", builder -> builder.address("nacos://127.0.0.1:8848?registry.type=service")) // .registry(RegistryBuilder.newBuilder().address("etcd3://127.0.0.1:2379?registry.type=service").build()) + .metadataReport(new MetadataReportConfig("zookeeper://127.0.0.1:2181")) .protocol("dubbo", builder -> builder.port(20885).name("dubbo")) .protocol("rest", builder -> builder.port(9090).name("rest")) .service(builder -> builder.id("echo").interfaceClass(EchoService.class).ref(new EchoServiceImpl()).protocolIds("dubbo")) diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java index d0b7e4a246..8dabb16f26 100644 --- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java @@ -25,10 +25,6 @@ import org.apache.dubbo.config.RegistryConfig; import org.apache.dubbo.config.ServiceConfig; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import static org.apache.dubbo.common.constants.CommonConstants.METADATA_KEY; /** * Dubbo Provider Bootstrap @@ -67,7 +63,7 @@ public class DubboServiceProviderBootstrap { // userService.setRegistries(Arrays.asList(interfaceRegistry, serviceRegistry)); ApplicationConfig applicationConfig = new ApplicationConfig("dubbo-provider-demo"); - applicationConfig.setMetadata("remote"); + applicationConfig.setMetadataStorageType("remote"); new DubboBootstrap() .application(applicationConfig) // Zookeeper in service registry type diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java index 535a182910..9880c23b40 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ApplicationConfig.java @@ -150,7 +150,7 @@ public class ApplicationConfig extends AbstractConfig { /** * Metadata type, local or remote, if choose remote, you need to further specify metadata center. */ - private String metadata; + private String metadataStorageType; public ApplicationConfig() { } @@ -334,6 +334,7 @@ public class ApplicationConfig extends AbstractConfig { /** * The format is the same as the springboot, including: getQosEnableCompatible(), getQosPortCompatible(), getQosAcceptForeignIpCompatible(). + * * @return */ @Parameter(key = QOS_ENABLE_COMPATIBLE, excluded = true) @@ -387,12 +388,12 @@ public class ApplicationConfig extends AbstractConfig { return !StringUtils.isEmpty(name); } - public String getMetadata() { - return metadata; + public String getMetadataStorageType() { + return metadataStorageType; } - public void setMetadata(String metadata) { - this.metadata = metadata; + public void setMetadataStorageType(String metadataStorageType) { + this.metadataStorageType = metadataStorageType; } @Override diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/builders/ApplicationBuilder.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/builders/ApplicationBuilder.java index f4a804745c..5f6f99992d 100644 --- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/builders/ApplicationBuilder.java +++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/builders/ApplicationBuilder.java @@ -177,7 +177,7 @@ public class ApplicationBuilder extends AbstractBuilderfalse + org.apache.dubbo dubbo-common ${project.parent.version} + + + org.apache.dubbo + dubbo-config-api + ${project.parent.version} + + org.apache.dubbo dubbo-cluster diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java index 725963af5d..fd86ab6237 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java @@ -156,7 +156,7 @@ public class ServiceDiscoveryRegistry extends FailbackRegistry { private ServiceDiscovery enhanceEventPublishing(ServiceDiscovery original) { return new EventPublishingServiceDiscovery(original); } - + protected boolean shouldRegister(URL providerURL) { String side = providerURL.getParameter(SIDE_KEY); diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RefreshServiceMetadataCustomizer.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RefreshServiceMetadataCustomizer.java index 3265709731..62b5a99f39 100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RefreshServiceMetadataCustomizer.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/RefreshServiceMetadataCustomizer.java @@ -4,7 +4,7 @@ import org.apache.dubbo.metadata.WritableMetadataService; import org.apache.dubbo.registry.client.ServiceInstance; import org.apache.dubbo.registry.client.ServiceInstanceCustomizer; -import static org.apache.dubbo.metadata.WritableMetadataService.DEFAULT_EXTENSION; +import static org.apache.dubbo.metadata.WritableMetadataService.getExtension; import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getExportedServicesRevision; import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getMetadataStorageType; import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getSubscribedServicesRevision; @@ -22,12 +22,12 @@ public class RefreshServiceMetadataCustomizer implements ServiceInstanceCustomiz @Override public void customize(ServiceInstance serviceInstance) { - // FIXME to define the constant - String metadataStoredType = getMetadataStorageType(serviceInstance); - WritableMetadataService remoteWritableMetadataService = - WritableMetadataService.getExtension(metadataStoredType == null ? DEFAULT_EXTENSION : metadataStoredType); - remoteWritableMetadataService.refreshMetadata(getExportedServicesRevision(serviceInstance), + String metadataStoredType = getMetadataStorageType(serviceInstance); + + WritableMetadataService writableMetadataService = getExtension(metadataStoredType); + + writableMetadataService.refreshMetadata(getExportedServicesRevision(serviceInstance), getSubscribedServicesRevision(serviceInstance)); } } diff --git 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 index 78402633e5..9367861897 100644 --- 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 @@ -17,6 +17,8 @@ package org.apache.dubbo.registry.client.metadata; import org.apache.dubbo.common.URL; +import org.apache.dubbo.config.ApplicationConfig; +import org.apache.dubbo.config.context.ConfigManager; import org.apache.dubbo.metadata.MetadataService; import org.apache.dubbo.metadata.WritableMetadataService; import org.apache.dubbo.registry.client.ServiceInstance; @@ -187,10 +189,10 @@ public class ServiceInstanceMetadataUtils { * * @param registryURL the {@link URL} to connect the registry * @return if not found in {@link URL#getParameters() parameters} of {@link URL registry URL}, return - * {@link WritableMetadataService#DEFAULT_METADATA_STORAGE_TYPE "default"} + * {@link #getDefaultMetadataStorageType()} */ public static String getMetadataStorageType(URL registryURL) { - return registryURL.getParameter(METADATA_STORAGE_TYPE_KEY, DEFAULT_METADATA_STORAGE_TYPE); + return registryURL.getParameter(METADATA_STORAGE_TYPE_KEY, getDefaultMetadataStorageType()); } /** @@ -198,11 +200,23 @@ public class ServiceInstanceMetadataUtils { * * @param serviceInstance the specified {@link ServiceInstance} * @return if not found in {@link ServiceInstance#getMetadata() metadata} of {@link ServiceInstance}, return - * {@link WritableMetadataService#DEFAULT_METADATA_STORAGE_TYPE "default"} + * {@link #getDefaultMetadataStorageType()} */ public static String getMetadataStorageType(ServiceInstance serviceInstance) { Map metadata = serviceInstance.getMetadata(); - return metadata.getOrDefault(METADATA_STORAGE_TYPE_KEY, DEFAULT_METADATA_STORAGE_TYPE); + return metadata.getOrDefault(METADATA_STORAGE_TYPE_KEY, getDefaultMetadataStorageType()); + } + + /** + * Get the default Metadata storage type from {@link ApplicationConfig} if present, or + * {@link WritableMetadataService#DEFAULT_METADATA_STORAGE_TYPE "default"} + * + * @return non-null + */ + public static String getDefaultMetadataStorageType() { + return ConfigManager.getInstance().getApplication() + .map(ApplicationConfig::getMetadataStorageType) + .orElse(DEFAULT_METADATA_STORAGE_TYPE); } /** From 572ee931016244fd1643b37005c9a7af85bc35a6 Mon Sep 17 00:00:00 2001 From: cvictory Date: Fri, 16 Aug 2019 17:37:41 +0800 Subject: [PATCH 9/9] etcd test --- .../apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java | 3 ++- .../apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java | 2 +- .../dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java | 1 + .../dubbo/bootstrap/EtcdDubboServiceProviderBootstrap.java | 1 + 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java index 96a865f3f6..e765643f11 100644 --- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceConsumerBootstrap.java @@ -31,11 +31,12 @@ public class DubboServiceConsumerBootstrap { new DubboBootstrap() .application("dubbo-consumer-demo") + .protocol(builder -> builder.port(20887).name("dubbo")) // Zookeeper .registry("zookeeper", builder -> builder.address("zookeeper://127.0.0.1:2181?registry.type=service&subscribed.services=dubbo-provider-demo")) // .metadataReport(new MetadataReportConfig("zookeeper://127.0.0.1:2181")) // Nacos - .registry("nacos", builder -> builder.address("nacos://127.0.0.1:8848?registry.type=service&subscribed.services=dubbo-provider-demo")) +// .registry("nacos", builder -> builder.address("nacos://127.0.0.1:8848?registry.type=service&subscribed.services=dubbo-provider-demo")) // .registry("consul", builder -> builder.address("consul://127.0.0.1:8500?registry.type=service&subscribed.services=dubbo-provider-demo").group("namespace1")) .reference("echo", builder -> builder.interfaceClass(EchoService.class).protocol("dubbo")) .reference("user", builder -> builder.interfaceClass(UserService.class).protocol("rest")) diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java index d0b7e4a246..c964abfc93 100644 --- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/DubboServiceProviderBootstrap.java @@ -67,7 +67,7 @@ public class DubboServiceProviderBootstrap { // userService.setRegistries(Arrays.asList(interfaceRegistry, serviceRegistry)); ApplicationConfig applicationConfig = new ApplicationConfig("dubbo-provider-demo"); - applicationConfig.setMetadata("remote"); +// applicationConfig.setMetadata("remote"); new DubboBootstrap() .application(applicationConfig) // Zookeeper in service registry type diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java index 7b0fc47e72..01302f3977 100644 --- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceConsumerBootstrap.java @@ -32,6 +32,7 @@ public class EtcdDubboServiceConsumerBootstrap { new DubboBootstrap() .application("dubbo-consumer-demo") + .defaultMetadataStorageType(true) // Zookeeper .protocol(builder -> builder.port(20887).name("dubbo")) .registry("zookeeper", builder -> builder.address("etcd3://127.0.0.1:2379?registry.type=service&subscribed.services=dubbo-provider-demo")) diff --git a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceProviderBootstrap.java b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceProviderBootstrap.java index d488ec63c7..07f349a007 100644 --- a/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceProviderBootstrap.java +++ b/dubbo-bootstrap/src/test/java/org/apache/dubbo/bootstrap/EtcdDubboServiceProviderBootstrap.java @@ -66,6 +66,7 @@ public class EtcdDubboServiceProviderBootstrap { applicationConfig.setMetadata("remote"); new DubboBootstrap() .application(applicationConfig) + .defaultMetadataStorageType(true) // Zookeeper in service registry type // .registry("zookeeper", builder -> builder.address("zookeeper://127.0.0.1:2181?registry.type=service")) // Nacos