単一ノードRedisから、センチネルベースの複数ノードRedisインスタンスへの切り替えは、新しいインスタンスのVCAP構造が異なり、Springによってデフォルトでは処理されないため、 VCAPを自分で解析し、Redis Beanを設定する必要があります。CloudFoundry上のRedisインスタンス用のSentinelノードの設定
春のドキュメントhereに続いて、これは私が私のRedisの豆を適応している方法です。
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からセンチネルリンパ節のための情報を取得し、私のJedisConnectionFactoryを作成するためにそれを渡します。私はこのようなBeanを設定できましたが、実行時に例外を受け取りました。'org.springframework.data.redis.RedisConnectionFailureException:Jedis接続を取得できません。ネストされた例外はjava.lang.NullPointerExceptionです:ローカル変数 'shardInfo'からロードされたヌルオブジェクトのメソッドredis.clients.jedis.JedisShardInfo.getHost()を呼び出そうとしています。 (JedisConnectionFactory.java:204)... '。私の理解では、JedisConnectionFactoryはJedisShardInfoではなくRedisSentinelConfigurationを使用して構成しましたが、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連れて行ってくれたが、この例外が発生することがなぜ私は表示されません。
誰かが私が間違っている場所を指し示すことができますか、これらのマルチノードRedisのセンチネルがSpring Boot Beanを通じてどのように設定できるかの例を教えてください。
は、このようなケースを処理するために春のクラウドコネクタへのRedis Sentinelのサポートを追加するために未解決の問題があります:https://github.com/spring-cloud/spring-cloud-connectors/issues/185この問題にRedisサービスインスタンスのための 'VCAP_SERVICES'の例を追加することは可能でしょうか?これは、ソリューションができるだけ多くの種類のレディスサービスをカバーするのに役立ちます。 –
ありがとう、@スコット。私はVCAP構造をこの問題に投稿しました。強化のためのETAはありますか?また、私はすでにこのVCAPの解析とセンチネルノードの設定を行っているので、上記のSpring data redisのRedisStandaloneConfigurationクラスで例外が発生するのはなぜですか? –