在CloudFoundry上为Redis实例配置Sentinel节点

时间:2017-10-31 11:46:15

标签: spring redis cloudfoundry spring-data-redis

我从单个节点Redis切换到基于Sentinel的多节点Redis实例,并且因为新实例的VCAP结构不同而且Spring默认不处理,我知道我们需要自己解析VCAP并配置Redis bean。

遵循Spring文档here,这就是我调整Redis bean的方法:

       public RedisConnectionFactory jedisConnectionFactory(JsonArray sentinelNodes) {
              RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration().master("mymaster");
              String hostname;
              String port;
              for (int i = 0; i < sentinelNodes.size(); i++) {
                     JsonObject sentinelNode = sentinelNodes.getJsonObject(i);
                     hostname = sentinelNode.getString("hostname");
                     port = sentinelNode.getString("port");
                     sentinelConfig.sentinel(hostname, Integer.parseInt(port));
              }
              return new JedisConnectionFactory(sentinelConfig);
       }

       @Bean
       public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
              JsonArray sentinelNodes = environmentHandler.getSentinelNodesForRedis();
              if (sentinelNodes != null) {
                     cf = jedisConnectionFactory(sentinelNodes);
              }
              RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
              redisTemplate.setConnectionFactory(cf);
              redisTemplate.setKeySerializer(new StringRedisSerializer());
              redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
              return redisTemplate;
       }

       @SuppressWarnings("rawtypes")
       @Bean
       public CacheManager cacheManager(RedisTemplate redisTemplate) {
              return new RedisCacheManager(redisTemplate);
       }

我从VCAP获取sentinel节点的信息并传递它以创建我的JedisConnectionFactory。我能够像这样配置bean,但在运行时收到一个异常,说明'org.springframework.data.redis.RedisConnectionFailureException:无法获得Jedis连接;嵌套异常是java.lang.NullPointerException:在尝试调用从本地变量&#39; shardInfo&#39;加载的null对象的方法redis.clients.jedis.JedisShardInfo.getHost()时。 |在org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:204)...'。根据我的理解,我使用RedisSentinelConfiguration而不是JedisShardInfo配置了JedisConnectionFactory,我不应该使用shardInfo。

在检查此库的较新版本时,我注意到此特定代码已修改为this。所以我适应了这个更新的版本,但现在应用程序在启动期间崩溃,但有以下异常。

java.lang.NoSuchMethodError:org.springframework.util.Assert.isTrue(ZLjava / util / function / Supplier;)V |在org.springframework.data.redis.connection.RedisStandaloneConfiguration。(RedisStandaloneConfiguration.java:61)|在org.springframework.data.redis.connection.jedis.JedisConnectionFactory。(JedisConnectionFactory.java:99)|在org.springframework.data.redis.connection.jedis.JedisConnectionFactory。(JedisConnectionFactory.java:111)...

在我遇到异常here之后,我不明白为什么会导致这种异常。

有人能够指出我出错的地方,还是指出了如何通过Spring Boot bean配置这些多节点Redis哨兵的示例?

1 个答案:

答案 0 :(得分:1)

在返回RedisConnectionFactory之前调用afterPropertiesSet()方法似乎已经完成了这个技巧。

(另外,已设置工厂的密码。)