Browse Source

修正 redis 集群 mode NOAUTH 问题 ===============

linjinyu 5 years ago
parent
commit
85c456efe2

+ 27 - 8
superdesk-libs-cache/src/main/java/cn/superdesk/libs/cache/redis/JedisProviderFactoryBean.java

@@ -42,7 +42,15 @@ public class JedisProviderFactoryBean implements ApplicationContextAware, Initia
 
     private Pattern pattern = Pattern.compile("^.+[:]\\d{1,5}\\s*$");
 
-    private String mode = JedisStandaloneProvider.MODE;//
+    /**
+     * mode(
+     *  standalone:单机模式,
+     *  sentinel:哨兵模式(主从),
+     *  cluster:集群模式,
+     *  shard:分片模式
+     *  )
+     */
+    private String mode = JedisStandaloneProvider.MODE;
 
     private JedisPoolConfig jedisPoolConfig;
 
@@ -120,11 +128,15 @@ public class JedisProviderFactoryBean implements ApplicationContextAware, Initia
      *
      */
     private void registerRedisProvier() {
+
+
         String beanName = getGroup() + REDIS_PROVIDER_SUFFIX;
         if (context.containsBean(beanName)) {
             throw new RuntimeException("已包含group为[" + this.group + "]的缓存实例");
         }
 
+        logger.info("注册 RedisProvier, group为[" + this.group + "]的缓存实例");
+
         String[] servers = StringUtils.tokenizeToStringArray(this.servers, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
 
         //检查ip和port格式
@@ -150,16 +162,23 @@ public class JedisProviderFactoryBean implements ApplicationContextAware, Initia
 
         DefaultListableBeanFactory acf                   = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory();
         BeanDefinitionBuilder      beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(beanClass);
-        beanDefinitionBuilder.addConstructorArgValue(getGroup())//
-                .addConstructorArgValue(jedisPoolConfig)//
-                .addConstructorArgValue(servers)//
-                .addConstructorArgValue(timeout);//
+        beanDefinitionBuilder.addConstructorArgValue(getGroup())
+                             .addConstructorArgValue(jedisPoolConfig)
+                             .addConstructorArgValue(servers)
+                             .addConstructorArgValue(timeout);
+
+        if (JedisStandaloneProvider.MODE.equalsIgnoreCase(mode)
+                || JedisSentinelProvider.MODE.equalsIgnoreCase(mode)
+                || JedisClusterProvider.MODE.equalsIgnoreCase(mode)) {
+
+            beanDefinitionBuilder.addConstructorArgValue(org.apache.commons.lang3.StringUtils.trimToNull(password));
+        }
 
         if (JedisStandaloneProvider.MODE.equalsIgnoreCase(mode)
                 || JedisSentinelProvider.MODE.equalsIgnoreCase(mode)) {
-            beanDefinitionBuilder.addConstructorArgValue(org.apache.commons.lang3.StringUtils.trimToNull(password))//
-                    .addConstructorArgValue(database)//
-                    .addConstructorArgValue(clientName);
+
+            beanDefinitionBuilder.addConstructorArgValue(database)
+                                 .addConstructorArgValue(clientName);
         }
 
         if (JedisSentinelProvider.MODE.equalsIgnoreCase(mode)) {

+ 51 - 5
superdesk-libs-cache/src/main/java/cn/superdesk/libs/cache/redis/cluster/JedisClusterProvider.java

@@ -5,6 +5,7 @@ import java.util.Set;
 
 import cn.superdesk.libs.cache.redis.JedisProvider;
 
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import redis.clients.jedis.BinaryJedisCluster;
 import redis.clients.jedis.HostAndPort;
 import redis.clients.jedis.JedisCluster;
@@ -22,7 +23,17 @@ public class JedisClusterProvider implements JedisProvider<JedisCluster, BinaryJ
 
     public static final String MODE = "cluster";
 
-    private Integer maxRedirections = 3; //重试3次
+    /**
+     * 出现异常最大重试次数
+     * maxAttempts
+     * 3
+     */
+    private Integer maxRedirections = 3;
+    /**
+     * 获取数据超时时间
+     * 3
+     */
+    private Integer soTimeout       = 3000;
 
     private JedisCluster       jedisCluster;
     private BinaryJedisCluster binaryJedisCluster;
@@ -32,11 +43,46 @@ public class JedisClusterProvider implements JedisProvider<JedisCluster, BinaryJ
     /**
      *
      */
-    public JedisClusterProvider(String groupName, JedisPoolConfig jedisPoolConfig, String[] servers, int timeout) {
+    public JedisClusterProvider(
+            String groupName,
+            JedisPoolConfig jedisPoolConfig,
+            String[] servers,
+            int timeout,
+            String password) {
+
         this.groupName = groupName;
-        Set<HostAndPort> nodes = this.parseHostAndPort(servers);
-        jedisCluster = new JedisCluster(nodes, timeout, maxRedirections, jedisPoolConfig);
-        binaryJedisCluster = new BinaryJedisCluster(nodes, timeout, maxRedirections, jedisPoolConfig);
+
+        /**
+         * 配置为 servers xxx.xxx.xxx.xxx:xxx,xxx.xxx.xxx.xxx:xxx
+         * 传入为 xxx.xxx.xxx.xxx:xxx
+         *       xxx.xxx.xxx.xxx:xxx
+         */
+        Set<HostAndPort> jedisClusterNodes = this.parseHostAndPort(servers);
+
+        /* 没有填充密码版本 */
+//        jedisCluster = new JedisCluster(jedisClusterNodes, timeout, maxRedirections,jedisPoolConfig);
+//        binaryJedisCluster = new BinaryJedisCluster(jedisClusterNodes, timeout, maxRedirections,jedisPoolConfig);
+
+        /**
+         *  修正 redis moode cluster 密码问题 NOAUTH
+         *  linjinyu
+         *  20190725
+         **/
+        jedisCluster = new JedisCluster(
+                /*Set<HostAndPort> jedisClusterNode*/jedisClusterNodes,
+                /*int connectionTimeout,*/timeout,
+                /*int soTimeout,*/soTimeout,
+                /*int maxAttempts,*/maxRedirections,
+                /*String password,*/password,
+                /*final GenericObjectPoolConfig poolConfig*/jedisPoolConfig);
+
+        binaryJedisCluster = new BinaryJedisCluster(
+                /*Set<HostAndPort> jedisClusterNode,*/jedisClusterNodes,
+                /*int connectionTimeout,*/timeout,
+                /*int soTimeout,*/soTimeout,
+                /*int maxAttempts,*/maxRedirections,
+                /*String password,*/password,
+                /*GenericObjectPoolConfig poolConfig*/jedisPoolConfig);
     }
 
     private Set<HostAndPort> parseHostAndPort(String[] servers) {

+ 11 - 0
superdesk-libs-cache/src/main/java/cn/superdesk/libs/cache/redis/package-info.java

@@ -0,0 +1,11 @@
+package cn.superdesk.libs.cache.redis;
+
+
+/**
+ * mode(
+ *  standalone:单机模式,
+ *  sentinel:哨兵模式(主从),
+ *  cluster:集群模式,
+ *  shard:分片模式
+ *  )
+ */

+ 6 - 1
superdesk-libs-cache/src/main/java/cn/superdesk/libs/cache/redis/sentinel/JedisSentinelProvider.java

@@ -46,7 +46,12 @@ public class JedisSentinelProvider implements JedisProvider<Jedis, BinaryJedis>
     private ScheduledExecutorService failoverCheker;
 
 
-    public JedisSentinelProvider(final String groupName, final JedisPoolConfig jedisPoolConfig, String[] servers, final int timeout, final String password, final int database, final String clientName, final String masterName) {
+    public JedisSentinelProvider(
+            final String groupName,
+            final JedisPoolConfig jedisPoolConfig,
+            String[] servers,
+            final int timeout,
+            final String password, final int database, final String clientName, final String masterName) {
         super();
         this.groupName = groupName;
         final Set<String> sentinels = new HashSet<String>(Arrays.asList(servers));

+ 5 - 1
superdesk-libs-cache/src/main/java/cn/superdesk/libs/cache/redis/shard/JedisShardProvider.java

@@ -36,7 +36,11 @@ public class JedisShardProvider implements JedisProvider<ShardedJedis, BinarySha
     private String groupName;
 
 
-    public JedisShardProvider(String groupName, JedisPoolConfig jedisPoolConfig, String[] servers, int timeout) {
+    public JedisShardProvider(
+            String groupName,
+            JedisPoolConfig jedisPoolConfig,
+            String[] servers,
+            int timeout) {
         super();
         this.groupName = groupName;
         List<JedisShardInfo> shards = buildShardInfos(servers, timeout);

+ 11 - 3
superdesk-libs-cache/src/main/java/cn/superdesk/libs/cache/redis/standalone/JedisStandaloneProvider.java

@@ -22,7 +22,6 @@ public class JedisStandaloneProvider implements JedisProvider<Jedis, BinaryJedis
 
     protected static final Logger logger = LoggerFactory.getLogger(JedisStandaloneProvider.class);
 
-
     public static final String MODE = "standalone";
 
     private ThreadLocal<Jedis> context = new ThreadLocal<>();
@@ -32,11 +31,20 @@ public class JedisStandaloneProvider implements JedisProvider<Jedis, BinaryJedis
     private String groupName;
 
 
-    public JedisStandaloneProvider(String groupName, JedisPoolConfig jedisPoolConfig, String[] servers, int timeout, String password, int database, String clientName) {
+    public JedisStandaloneProvider(
+            String groupName,
+            JedisPoolConfig jedisPoolConfig,
+            String[] servers,
+            int timeout,
+            String password, int database, String clientName) {
         super();
         this.groupName = groupName;
         String[] addrs = servers[0].split(":");
-        jedisPool = new JedisPool(jedisPoolConfig, addrs[0], Integer.parseInt(addrs[1].trim()), timeout, password, database, clientName);
+        jedisPool = new JedisPool(
+                jedisPoolConfig,
+                /* IP */ addrs[0],
+                /* 端口*/ Integer.parseInt(addrs[1].trim()),
+                timeout, password, database, clientName);
     }
 
     public Jedis get() throws JedisException {