You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2022/04/08 07:13:42 UTC
[dubbo] branch 3.0 updated: [3.0] Service discovery model enhancement for supporting of dns registry (#9904)
This is an automated email from the ASF dual-hosted git repository.
liujun pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.0 by this push:
new c2dfbc9e38 [3.0] Service discovery model enhancement for supporting of dns registry (#9904)
c2dfbc9e38 is described below
commit c2dfbc9e38a591388cff960aef5c6bb97a2d0eac
Author: ken.lj <ke...@gmail.com>
AuthorDate: Fri Apr 8 15:13:02 2022 +0800
[3.0] Service discovery model enhancement for supporting of dns registry (#9904)
---
.../ConfigurableMetadataServiceExporter.java | 27 +++++++++++++++-
.../config/metadata/MetadataServiceDelegation.java | 29 ++++++++++++++---
.../org/apache/dubbo/metadata/MetadataService.java | 36 ++++++++++++++++++++++
.../StandardMetadataServiceURLBuilder.java | 4 +--
4 files changed, 88 insertions(+), 8 deletions(-)
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 944b2a8dcc..68117d18b0 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
@@ -22,6 +22,8 @@ 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.config.ApplicationConfig;
+import org.apache.dubbo.config.ArgumentConfig;
+import org.apache.dubbo.config.MethodConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
@@ -30,6 +32,7 @@ import org.apache.dubbo.rpc.Protocol;
import org.apache.dubbo.rpc.ProtocolServer;
import org.apache.dubbo.rpc.model.ApplicationModel;
+import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -172,13 +175,35 @@ public class ConfigurableMetadataServiceExporter {
serviceConfig.setRef(metadataService);
serviceConfig.setGroup(applicationConfig.getName());
serviceConfig.setVersion(MetadataService.VERSION);
-// serviceConfig.setMethods(generateMethodConfig());
+ serviceConfig.setMethods(generateMethodConfig());
serviceConfig.setConnections(1); // separate connection
serviceConfig.setExecutes(100); // max tasks running at the same time
return serviceConfig;
}
+ /**
+ * Generate Method Config for Service Discovery Metadata <p/>
+ * <p>
+ * Make {@link MetadataService} support argument callback,
+ * used to notify {@link org.apache.dubbo.registry.client.ServiceInstance}'s
+ * metadata change event
+ *
+ * @since 3.0
+ */
+ private List<MethodConfig> generateMethodConfig() {
+ MethodConfig methodConfig = new MethodConfig();
+ methodConfig.setName("getAndListenInstanceMetadata");
+
+ ArgumentConfig argumentConfig = new ArgumentConfig();
+ argumentConfig.setIndex(1);
+ argumentConfig.setCallback(true);
+
+ methodConfig.setArguments(Collections.singletonList(argumentConfig));
+
+ return Collections.singletonList(methodConfig);
+ }
+
// for unit test
public void setMetadataService(MetadataServiceDelegation metadataService) {
this.metadataService = metadataService;
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceDelegation.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceDelegation.java
index b33d5608b2..451bf75d01 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceDelegation.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/metadata/MetadataServiceDelegation.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.logger.Logger;
import org.apache.dubbo.common.logger.LoggerFactory;
import org.apache.dubbo.common.resource.Disposable;
import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.metadata.InstanceMetadataChangedListener;
import org.apache.dubbo.metadata.MetadataInfo;
import org.apache.dubbo.metadata.MetadataService;
import org.apache.dubbo.registry.client.ServiceDiscovery;
@@ -36,8 +37,8 @@ import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
-import java.util.concurrent.ConcurrentNavigableMap;
-import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import static java.util.Collections.emptySortedSet;
import static java.util.Collections.unmodifiableSortedSet;
@@ -52,8 +53,10 @@ public class MetadataServiceDelegation implements MetadataService, Disposable {
Logger logger = LoggerFactory.getLogger(getClass());
private final ApplicationModel applicationModel;
private final RegistryManager registryManager;
- private final ConcurrentNavigableMap<String, String> serviceDefinitions = new ConcurrentSkipListMap<>();
+ private ConcurrentMap<String, InstanceMetadataChangedListener> instanceMetadataChangedListenerMap = new ConcurrentHashMap<>();
private URL url;
+ // works only for DNS service discovery
+ private String instanceMetadata;
public MetadataServiceDelegation(ApplicationModel applicationModel) {
this.applicationModel = applicationModel;
@@ -156,12 +159,12 @@ public class MetadataServiceDelegation implements MetadataService, Disposable {
@Override
public String getServiceDefinition(String interfaceName, String version, String group) {
- return serviceDefinitions.get(URL.buildKey(interfaceName, group, version));
+ return "";
}
@Override
public String getServiceDefinition(String serviceKey) {
- return serviceDefinitions.get(serviceKey);
+ return "";
}
@Override
@@ -192,6 +195,22 @@ public class MetadataServiceDelegation implements MetadataService, Disposable {
return metadataInfos;
}
+ @Override
+ public void exportInstanceMetadata(String instanceMetadata) {
+ this.instanceMetadata = instanceMetadata;
+ }
+
+ @Override
+ public Map<String, InstanceMetadataChangedListener> getInstanceMetadataChangedListenerMap() {
+ return instanceMetadataChangedListenerMap;
+ }
+
+ @Override
+ public String getAndListenInstanceMetadata(String consumerId, InstanceMetadataChangedListener listener) {
+ instanceMetadataChangedListenerMap.put(consumerId, listener);
+ return instanceMetadata;
+ }
+
private SortedSet<String> getServiceURLs(Map<String, SortedSet<URL>> exportedServiceURLs, String serviceKey,
String protocol) {
diff --git a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java
index 6e48658f91..cd767adcad 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/MetadataService.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.common.URL;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
@@ -190,4 +191,39 @@ public interface MetadataService {
return interfaceName != null && interfaceName.equals(MetadataService.class.getName());
}
+ /**
+ * Export Metadata in Service Instance of Service Discovery
+ * <p>
+ * Used for consumer to get Service Instance Metadata
+ * if Registry is unsupported with publishing metadata
+ *
+ * @param instanceMetadata {@link Map} of provider Service Instance Metadata
+ * @since 3.0
+ */
+ void exportInstanceMetadata(String instanceMetadata);
+
+ /**
+ * Get all Metadata listener from local
+ * <p>
+ * Used for consumer to get Service Instance Metadata
+ * if Registry is unsupported with publishing metadata
+ *
+ * @return {@link Map} of {@link InstanceMetadataChangedListener}
+ * @since 3.0
+ */
+ Map<String, InstanceMetadataChangedListener> getInstanceMetadataChangedListenerMap();
+
+ /**
+ * 1. Fetch Metadata in Service Instance of Service Discovery
+ * 2. Add a metadata change listener
+ * <p>
+ * Used for consumer to get Service Instance Metadata
+ * if Registry is unsupported with publishing metadata
+ *
+ * @param consumerId consumerId
+ * @param listener {@link InstanceMetadataChangedListener} used to notify event
+ * @return {@link Map} of provider Service Instance Metadata
+ * @since 3.0
+ */
+ String getAndListenInstanceMetadata(String consumerId, InstanceMetadataChangedListener listener);
}
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java
index 9167c93708..988e5dd23c 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java
@@ -143,8 +143,8 @@ public class StandardMetadataServiceURLBuilder implements MetadataServiceURLBuil
.addParameter(VERSION_KEY, MetadataService.VERSION)
.addParameter(RETRIES_KEY, 0);
-// // add ServiceInstance Metadata notify support
-// urlBuilder.addParameter("getAndListenInstanceMetadata.1.callback", true);
+ // add ServiceInstance Metadata notify support
+ urlBuilder.addParameter("getAndListenInstanceMetadata.1.callback", true);
return urlBuilder.build();
}