This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/master by this push:
     new df084ad  Support Redis cluster in Metadata Report (#3863)
df084ad is described below

commit df084addc804ef727ae9f1959b10f88ffd5a0ddc
Author: cvictory <[email protected]>
AuthorDate: Wed May 22 15:31:37 2019 +0800

    Support Redis cluster in Metadata Report (#3863)
    
    fixes #3817
---
 .../apache/dubbo/config/MetadataReportConfig.java  | 13 ++++++
 .../src/main/resources/META-INF/compat/dubbo.xsd   |  5 +++
 .../src/main/resources/META-INF/dubbo.xsd          |  5 +++
 .../metadata/identifier/MetadataIdentifier.java    |  4 +-
 .../metadata/store/redis/RedisMetadataReport.java  | 46 ++++++++++++++++++++--
 5 files changed, 67 insertions(+), 6 deletions(-)

diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java
index a7c72f6..5233171 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/MetadataReportConfig.java
@@ -71,6 +71,11 @@ public class MetadataReportConfig extends AbstractConfig {
      */
     private Boolean syncReport;
 
+    /**
+     * cluster
+     */
+    private Boolean cluster;
+
     public MetadataReportConfig() {
     }
 
@@ -174,4 +179,12 @@ public class MetadataReportConfig extends AbstractConfig {
     public void setGroup(String group) {
         this.group = group;
     }
+
+    public Boolean getCluster() {
+        return cluster;
+    }
+
+    public void setCluster(Boolean cluster) {
+        this.cluster = cluster;
+    }
 }
diff --git 
a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd 
b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd
index c12389f..756f6da 100644
--- 
a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd
+++ 
b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/compat/dubbo.xsd
@@ -632,6 +632,11 @@
                 <xsd:documentation><![CDATA[ Sync or Async report. 
]]></xsd:documentation>
             </xsd:annotation>
         </xsd:attribute>
+        <xsd:attribute name="cluster" type="xsd:boolean" use="optional">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Need cluster support, default 
false. ]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
     </xsd:complexType>
 
     <xsd:complexType name="configCenterType">
diff --git 
a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd 
b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd
index 5cc621f..4a8cf56 100644
--- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd
+++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd
@@ -626,6 +626,11 @@
                 <xsd:documentation><![CDATA[ Sync or Async report. 
]]></xsd:documentation>
             </xsd:annotation>
         </xsd:attribute>
+        <xsd:attribute name="cluster" type="xsd:boolean" use="optional">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Need cluster support, default 
false. ]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
     </xsd:complexType>
 
     <xsd:complexType name="configCenterType">
diff --git 
a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/MetadataIdentifier.java
 
b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/MetadataIdentifier.java
index 602e4b2..3b20bc7 100644
--- 
a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/MetadataIdentifier.java
+++ 
b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/MetadataIdentifier.java
@@ -31,8 +31,8 @@ import static 
org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
 public class MetadataIdentifier {
 
     public static final String SEPARATOR = ":";
-    final static String DEFAULT_PATH_TAG = "metadata";
-    final static String META_DATA_STORE_TAG = ".metaData";
+    public final static String DEFAULT_PATH_TAG = "metadata";
+    public final static String META_DATA_STORE_TAG = ".metaData";
 
     private String serviceInterface;
     private String version;
diff --git 
a/dubbo-metadata-report/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
 
b/dubbo-metadata-report/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
index c0b992d..a9245eb 100644
--- 
a/dubbo-metadata-report/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
+++ 
b/dubbo-metadata-report/dubbo-metadata-report-redis/src/main/java/org/apache/dubbo/metadata/store/redis/RedisMetadataReport.java
@@ -22,12 +22,22 @@ import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.metadata.identifier.MetadataIdentifier;
 import org.apache.dubbo.metadata.support.AbstractMetadataReport;
 import org.apache.dubbo.rpc.RpcException;
+
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import redis.clients.jedis.HostAndPort;
 import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisCluster;
 import redis.clients.jedis.JedisPool;
 import redis.clients.jedis.JedisPoolConfig;
 
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 import static 
org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;
 import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
+import static org.apache.dubbo.common.constants.ConfigConstants.CLUSTER_KEY;
+import static 
org.apache.dubbo.metadata.identifier.MetadataIdentifier.META_DATA_STORE_TAG;
 
 /**
  * RedisMetadataReport
@@ -36,12 +46,24 @@ public class RedisMetadataReport extends 
AbstractMetadataReport {
 
     private final static Logger logger = 
LoggerFactory.getLogger(RedisMetadataReport.class);
 
-    final JedisPool pool;
+    JedisPool pool;
+    Set<HostAndPort> jedisClusterNodes;
+    private int timeout;
+    private String password;
+
 
     public RedisMetadataReport(URL url) {
         super(url);
-        int timeout = url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT);
-        pool = new JedisPool(new JedisPoolConfig(), url.getHost(), 
url.getPort(), timeout, url.getPassword());
+        timeout = url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT);
+        if (url.getParameter(CLUSTER_KEY, false)) {
+            jedisClusterNodes = new HashSet<HostAndPort>();
+            List<URL> urls = url.getBackupUrls();
+            for (URL tmpUrl : urls) {
+                jedisClusterNodes.add(new HostAndPort(tmpUrl.getHost(), 
tmpUrl.getPort()));
+            }
+        } else {
+            pool = new JedisPool(new JedisPoolConfig(), url.getHost(), 
url.getPort(), timeout, url.getPassword());
+        }
     }
 
     @Override
@@ -55,6 +77,23 @@ public class RedisMetadataReport extends 
AbstractMetadataReport {
     }
 
     private void storeMetadata(MetadataIdentifier metadataIdentifier, String 
v) {
+        if (pool != null) {
+            storeMetadataStandalone(metadataIdentifier, v);
+        } else {
+            storeMetadataInCluster(metadataIdentifier, v);
+        }
+    }
+
+    private void storeMetadataInCluster(MetadataIdentifier metadataIdentifier, 
String v) {
+        try (JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 
timeout, timeout, 2, password, new GenericObjectPoolConfig())) {
+            jedisCluster.set(metadataIdentifier.getIdentifierKey() + 
META_DATA_STORE_TAG, v);
+        } catch (Throwable e) {
+            logger.error("Failed to put " + metadataIdentifier + " to redis 
cluster " + v + ", cause: " + e.getMessage(), e);
+            throw new RpcException("Failed to put " + metadataIdentifier + " 
to redis cluster " + v + ", cause: " + e.getMessage(), e);
+        }
+    }
+
+    private void storeMetadataStandalone(MetadataIdentifier 
metadataIdentifier, String v) {
         try (Jedis jedis = pool.getResource()) {
             
jedis.set(metadataIdentifier.getUniqueKey(MetadataIdentifier.KeyTypeEnum.UNIQUE_KEY),
 v);
         } catch (Throwable e) {
@@ -63,5 +102,4 @@ public class RedisMetadataReport extends 
AbstractMetadataReport {
         }
     }
 
-
 }

Reply via email to