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 2020/09/08 06:05:00 UTC

[dubbo] branch 3.0 updated: zookeeper metadata impl

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 f6542a2  zookeeper metadata impl
f6542a2 is described below

commit f6542a25d246fe893dc6745d8b45581ab70758dd
Author: ken.lj <ke...@gmail.com>
AuthorDate: Tue Sep 8 14:02:17 2020 +0800

    zookeeper metadata impl
---
 .../src/main/resources/spring/dubbo-consumer.xml   |  4 +-
 .../store/zookeeper/ZookeeperMetadataReport.java   | 61 ++++++++++++++++++++++
 2 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml b/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml
index 9225959..5475752 100644
--- a/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml
+++ b/dubbo-demo/dubbo-demo-xml/dubbo-demo-xml-consumer/src/main/resources/spring/dubbo-consumer.xml
@@ -30,10 +30,10 @@
 
     <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
 
-    <dubbo:reference provided-by="demo-provider" id="demoService" check="false"
+    <dubbo:reference id="demoService" check="false"
                      interface="org.apache.dubbo.demo.DemoService"/>
 
-    <dubbo:reference provided-by="demo-provider" version="1.0.0" group="greeting" id="greetingService" check="false"
+    <dubbo:reference version="1.0.0" group="greeting" id="greetingService" check="false"
                      interface="org.apache.dubbo.demo.GreetingService"/>
 
 </beans>
diff --git a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
index 9ca2e42..d7abde3 100644
--- a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
+++ b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
@@ -20,19 +20,30 @@ 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.StringUtils;
+import org.apache.dubbo.metadata.MappingChangedEvent;
+import org.apache.dubbo.metadata.MappingListener;
+import org.apache.dubbo.metadata.MetadataInfo;
 import org.apache.dubbo.metadata.report.identifier.BaseMetadataIdentifier;
 import org.apache.dubbo.metadata.report.identifier.KeyTypeEnum;
 import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;
 import org.apache.dubbo.metadata.report.identifier.ServiceMetadataIdentifier;
 import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;
 import org.apache.dubbo.metadata.report.support.AbstractMetadataReport;
+import org.apache.dubbo.remoting.zookeeper.ChildListener;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperClient;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter;
 
+import com.google.gson.Gson;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
 import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;
@@ -48,6 +59,10 @@ public class ZookeeperMetadataReport extends AbstractMetadataReport {
 
     final ZookeeperClient zkClient;
 
+    private Gson gson = new Gson();
+
+    private Map<String, ChildListener> listenerMap = new ConcurrentHashMap<>();
+
     public ZookeeperMetadataReport(URL url, ZookeeperTransporter zookeeperTransporter) {
         super(url);
         if (url.isAnyHost()) {
@@ -120,4 +135,50 @@ public class ZookeeperMetadataReport extends AbstractMetadataReport {
         return toRootDir() + metadataIdentifier.getUniqueKey(KeyTypeEnum.PATH);
     }
 
+    @Override
+    public void publishAppMetadata(SubscriberMetadataIdentifier identifier, MetadataInfo metadataInfo) {
+        String path = getNodePath(identifier);
+        if (StringUtils.isBlank(zkClient.getContent(path))) {
+            zkClient.create(path, gson.toJson(metadataInfo), false);
+        }
+    }
+
+    @Override
+    public void registerServiceAppMapping(String serviceKey, String application, URL url) {
+        String path = toRootDir() + serviceKey + PATH_SEPARATOR + application;
+        if (StringUtils.isBlank(zkClient.getContent(path))) {
+            Map<String, String> value = new HashMap<>();
+            value.put("timestamp", String.valueOf(System.currentTimeMillis()));
+            zkClient.create(path, gson.toJson(value), false);
+        }
+    }
+
+    @Override
+    public MetadataInfo getAppMetadata(SubscriberMetadataIdentifier identifier, Map<String, String> instanceMetadata) {
+        String content = zkClient.getContent(getNodePath(identifier));
+        return gson.fromJson(content, MetadataInfo.class);
+    }
+
+    @Override
+    public Set<String> getServiceAppMapping(String serviceKey, MappingListener listener, URL url) {
+        Set<String>  appNameSet = new HashSet<>();
+        String path = toRootDir() + serviceKey;
+        appNameSet.addAll(zkClient.getChildren(path));
+
+        if (null == listenerMap.get(path)) {
+            ChildListener zkListener = new ChildListener() {
+                @Override
+                public void childChanged(String path, List<String> children) {
+                    MappingChangedEvent event = new MappingChangedEvent();
+                    event.setServiceKey(serviceKey);
+                    event.setApps(null != children ? new HashSet<>(children): null);
+                    listener.onEvent(event);
+                }
+            };
+            zkClient.addChildListener(path, zkListener);
+            listenerMap.put(path, zkListener);
+        }
+
+        return appNameSet;
+    }
 }