This is an automated email from the ASF dual-hosted git repository. liujun pushed a commit to branch 3.0-k8s in repository https://gitbox.apache.org/repos/asf/dubbo.git
commit 2bf901b5f0d6d697a52495707612260df6bbc254 Merge: 79bb595 829c0df Author: ken.lj <[email protected]> AuthorDate: Fri Jan 15 17:12:16 2021 +0800 Merge branch '3.0' into 3.0-k8s .../dubbo/config/AbstractInterfaceConfig.java | 7 +- .../org/apache/dubbo/config/RegistryConfig.java | 2 + .../java/org/apache/dubbo/event/EventListener.java | 1 + .../apache/dubbo/common/lang/PrioritizedTest.java | 1 + .../dubbo/common/utils/DefaultCharSequence.java | 1 + .../apache/dubbo/generic/GenericServiceTest.java | 42 ++++++------ .../apache/dubbo/demo/consumer/Application.java | 25 +++++++- .../src/main/resources/spring/dubbo-consumer.xml | 5 +- .../metadata/InstanceMetadataChangedListener.java | 35 ---------- .../apache/dubbo/metadata/MappingChangedEvent.java | 7 ++ .../dubbo/metadata/WritableMetadataService.java | 7 ++ .../metadata/definition/TypeDefinitionBuilder.java | 17 +++-- .../definition/builder/ArrayTypeBuilder.java | 18 ++++-- .../definition/builder/CollectionTypeBuilder.java | 23 +++++-- .../definition/builder/DefaultTypeBuilder.java | 21 +++--- .../definition/builder/EnumTypeBuilder.java | 22 +++++-- .../definition/builder/MapTypeBuilder.java | 22 +++++-- .../metadata/definition/builder/TypeBuilder.java | 2 +- .../definition/model/MethodDefinition.java | 13 ++-- .../definition/model/ServiceDefinition.java | 18 ++++++ .../metadata/definition/model/TypeDefinition.java | 74 ++++++++++------------ .../dubbo/metadata/definition/util/ClassUtils.java | 55 ++++++++++++++++ .../rest/jaxrs/DefaultValueParameterProcessor.java | 1 + .../dubbo/metadata/definition/MetadataTest.java | 18 ++---- .../definition/ServiceDefinitionBuilderTest.java | 40 ++++++------ .../metadata/definition/Test3TypeBuilder.java | 3 +- .../dubbo/metadata/definition/TestTypeBuilder.java | 3 +- .../definition/protobuf/ProtobufTypeBuilder.java | 56 +++++++++------- .../protobuf/ProtobufTypeBuilderTest.java | 41 ++++++++---- .../builder/ArrayTypeDefinitionBuilder.java | 13 ++-- .../builder/CollectionTypeDefinitionBuilder.java | 11 +++- .../builder/DeclaredTypeDefinitionBuilder.java | 4 +- .../builder/EnumTypeDefinitionBuilder.java | 8 ++- .../builder/GeneralTypeDefinitionBuilder.java | 17 +++-- .../builder/MapTypeDefinitionBuilder.java | 10 +-- .../builder/MethodDefinitionBuilder.java | 9 +-- .../builder/PrimitiveTypeDefinitionBuilder.java | 11 ++-- .../builder/ServiceDefinitionBuilder.java | 15 +++-- .../builder/SimpleTypeDefinitionBuilder.java | 9 ++- .../annotation/processing/builder/TypeBuilder.java | 31 +++++++++ .../processing/builder/TypeDefinitionBuilder.java | 43 ++++--------- .../rest/AbstractServiceRestMetadataResolver.java | 2 +- .../rest/jaxrs/DefaultValueParameterProcessor.java | 1 + ...data.annotation.processing.builder.TypeBuilder} | 0 .../builder/ArrayTypeDefinitionBuilderTest.java | 10 ++- .../builder/EnumTypeDefinitionBuilderTest.java | 6 +- .../builder/MapTypeDefinitionBuilderTest.java | 23 ++++--- .../PrimitiveTypeDefinitionBuilderTest.java | 10 +-- .../builder/ServiceDefinitionBuilderTest.java | 35 +++++++--- .../registry/client/AbstractServiceDiscovery.java | 6 ++ .../registry/client/DefaultServiceInstance.java | 5 +- .../registry/client/ServiceDiscoveryRegistry.java | 13 ++-- .../listener/ServiceInstancesChangedListener.java | 25 +++++++- .../registry/client/metadata/MetadataUtils.java | 5 ++ .../metadata/ServiceInstanceMetadataUtils.java | 14 ++-- .../store/InMemoryWritableMetadataService.java | 41 ++++++++++-- .../client/migration/MigrationClusterInvoker.java | 50 --------------- .../registry/nacos/NacosServiceDiscovery.java | 2 +- .../zookeeper/ZookeeperServiceDiscovery.java | 12 +--- dubbo-registry/pom.xml | 4 +- 60 files changed, 630 insertions(+), 395 deletions(-) diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java index 27f66f5,0321a16..dff55f3 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/MetadataUtils.java @@@ -91,62 -78,37 +91,67 @@@ public class MetadataUtils } public static MetadataService getMetadataServiceProxy(ServiceInstance instance, ServiceDiscovery serviceDiscovery) { - String key = instance.getServiceName() + "##" + - ServiceInstanceMetadataUtils.getExportedServicesRevision(instance); - return metadataServiceProxies.computeIfAbsent(key, k -> { - MetadataServiceURLBuilder builder = null; - ExtensionLoader<MetadataServiceURLBuilder> loader - = ExtensionLoader.getExtensionLoader(MetadataServiceURLBuilder.class); - - Map<String, String> metadata = instance.getMetadata(); - // METADATA_SERVICE_URLS_PROPERTY_NAME is a unique key exists only on instances of spring-cloud-alibaba. - String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME); - if (StringUtils.isNotEmpty(dubboURLsJSON)) { - builder = loader.getExtension(SpringCloudMetadataServiceURLBuilder.NAME); - } else { - builder = loader.getExtension(StandardMetadataServiceURLBuilder.NAME); - } + String key = computeKey(instance); + Lock lock = metadataServiceLocks.computeIfAbsent(key, k -> new ReentrantLock()); + + lock.lock(); + try { + return metadataServiceProxies.computeIfAbsent(key, k -> referProxy(k, instance)); + } finally { + lock.unlock(); + } + } - List<URL> urls = builder.build(instance); - if (CollectionUtils.isEmpty(urls)) { - throw new IllegalStateException("You have enabled introspection service discovery mode for instance " - + instance + ", but no metadata service can build from it."); + public static void destroyMetadataServiceProxy(ServiceInstance instance, ServiceDiscovery serviceDiscovery) { + String key = computeKey(instance); + Lock lock = metadataServiceLocks.computeIfAbsent(key, k -> new ReentrantLock()); + + lock.lock(); + try { + if (metadataServiceProxies.containsKey(key)) { + metadataServiceProxies.remove(key); + Invoker<?> invoker = metadataServiceInvokers.remove(key); + invoker.destroy(); } + } finally { + lock.unlock(); + } + } + + private static MetadataService referProxy(String key, ServiceInstance instance) { + MetadataServiceURLBuilder builder = null; + ExtensionLoader<MetadataServiceURLBuilder> loader + = ExtensionLoader.getExtensionLoader(MetadataServiceURLBuilder.class); + + Map<String, String> metadata = instance.getMetadata(); + // METADATA_SERVICE_URLS_PROPERTY_NAME is a unique key exists only on instances of spring-cloud-alibaba. + String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME); + if (metadata.isEmpty() || StringUtils.isEmpty(dubboURLsJSON)) { + builder = loader.getExtension(StandardMetadataServiceURLBuilder.NAME); + } else { + builder = loader.getExtension(SpringCloudMetadataServiceURLBuilder.NAME); + } + + List<URL> urls = builder.build(instance); + if (CollectionUtils.isEmpty(urls)) { + throw new IllegalStateException("You have enabled introspection service discovery mode for instance " + + instance + ", but no metadata service can build from it."); + } - // Simply rely on the first metadata url, as stated in MetadataServiceURLBuilder. - Invoker<MetadataService> invoker = protocol.refer(MetadataService.class, urls.get(0)); + // Simply rely on the first metadata url, as stated in MetadataServiceURLBuilder. + Invoker<MetadataService> invoker = protocol.refer(MetadataService.class, urls.get(0)); + metadataServiceInvokers.put(key, invoker); - return proxyFactory.getProxy(invoker); - }); + return proxyFactory.getProxy(invoker); + } + + public static void saveMetadataURL(URL url) { + // store in local + getLocalMetadataService().setMetadataServiceURL(url); } + + public static void saveMetadataURL(URL url) { + // store in local + getLocalMetadataService().setMetadataServiceURL(url); + } } diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java index df397cc,e31745a..fdecb76 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java +++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java @@@ -19,8 -19,8 +19,9 @@@ package org.apache.dubbo.registry.clien 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.StringUtils; +import org.apache.dubbo.metadata.InstanceMetadataChangedListener; import org.apache.dubbo.metadata.MetadataInfo; import org.apache.dubbo.metadata.MetadataInfo.ServiceInfo; import org.apache.dubbo.metadata.MetadataService; @@@ -235,21 -241,18 +245,34 @@@ public class InMemoryWritableMetadataSe } @Override + public void exportInstanceMetadata(String metadata) { + this.instanceMetadata = metadata; + } + + @Override + public Map<String, InstanceMetadataChangedListener> getInstanceMetadataChangedListenerMap() { + return instanceMetadataChangedListenerMap; + } + + @Override + public String getAndListenInstanceMetadata(String consumerId, InstanceMetadataChangedListener listener) { + instanceMetadataChangedListenerMap.put(consumerId, listener); + return instanceMetadata; + } + ++ @Override + public MetadataInfo getDefaultMetadataInfo() { + if (CollectionUtils.isEmptyMap(metadataInfos)) { + return null; + } + for (Map.Entry<String, MetadataInfo> entry : metadataInfos.entrySet()) { + if (entry.getKey().equalsIgnoreCase(DEFAULT_KEY)) { + return entry.getValue(); + } + } + return metadataInfos.entrySet().iterator().next().getValue(); + } + public void blockUntilUpdated() { try { metadataSemaphore.acquire(); diff --cc dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationClusterInvoker.java index 91fa942,91fa942..0000000 deleted file mode 100644,100644 --- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/migration/MigrationClusterInvoker.java +++ /dev/null @@@ -1,50 -1,50 +1,0 @@@ --/* -- * Licensed to the Apache Software Foundation (ASF) under one or more -- * contributor license agreements. See the NOTICE file distributed with -- * this work for additional information regarding copyright ownership. -- * The ASF licenses this file to You under the Apache License, Version 2.0 -- * (the "License"); you may not use this file except in compliance with -- * the License. You may obtain a copy of the License at -- * -- * http://www.apache.org/licenses/LICENSE-2.0 -- * -- * Unless required by applicable law or agreed to in writing, software -- * distributed under the License is distributed on an "AS IS" BASIS, -- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -- * See the License for the specific language governing permissions and -- * limitations under the License. -- */ --package org.apache.dubbo.registry.client.migration; -- --import org.apache.dubbo.common.URL; --import org.apache.dubbo.registry.client.migration.model.MigrationRule; --import org.apache.dubbo.registry.client.migration.model.MigrationStep; --import org.apache.dubbo.rpc.cluster.ClusterInvoker; -- --/** -- * FIXME, some methods need to be further optimized. -- * -- * @param <T> -- */ --public interface MigrationClusterInvoker<T> extends ClusterInvoker<T> { -- -- boolean isServiceDiscovery(); -- -- MigrationStep getMigrationStep(); -- -- void setMigrationStep(MigrationStep step); -- -- MigrationRule getMigrationRule(); -- -- void setMigrationRule(MigrationRule rule); -- -- boolean invokersChanged(); -- -- void fallbackToInterfaceInvoker(); -- -- void migrateToServiceDiscoveryInvoker(boolean forceMigrate); -- -- void refreshServiceDiscoveryInvokerOnMappingCallback(boolean forceMigrate); -- -- void reRefer(URL newSubscribeUrl); --} diff --cc dubbo-registry/pom.xml index 2fa73ed,3f9b247..db3ee35 --- a/dubbo-registry/pom.xml +++ b/dubbo-registry/pom.xml @@@ -33,9 -33,7 +33,9 @@@ <module>dubbo-registry-api</module> <module>dubbo-registry-multicast</module> <module>dubbo-registry-zookeeper</module> - <module>dubbo-registry-kubernetes</module> - <module>dubbo-registry-dns</module> <module>dubbo-registry-nacos</module> <module>dubbo-registry-multiple</module> ++ <module>dubbo-registry-kubernetes</module> ++ <module>dubbo-registry-dns</module> </modules> </project>
