From 04371e8aa0bd9094c58cab7462adda5e4e318d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= Date: Sat, 12 Oct 2019 11:35:53 +0800 Subject: [PATCH] :sparkles: redis-cluster support refreshing this cluster topokogy view --- .../data/cache/RedisTemplateConfig.java | 37 ++++++++++++++++++- .../DynamicRouteAutoConfiguration.java | 34 +++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisTemplateConfig.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisTemplateConfig.java index 0f9e0b780..2c65e715d 100644 --- a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisTemplateConfig.java +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/cache/RedisTemplateConfig.java @@ -17,17 +17,27 @@ package com.pig4cloud.pigx.common.data.cache; +import io.lettuce.core.ReadFrom; +import io.lettuce.core.cluster.ClusterClientOptions; +import io.lettuce.core.cluster.ClusterTopologyRefreshOptions; import lombok.AllArgsConstructor; import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; +import java.time.Duration; + /** * RedisTemplate 配置 * @@ -38,10 +48,9 @@ import org.springframework.data.redis.serializer.StringRedisSerializer; @AllArgsConstructor @AutoConfigureBefore(RedisAutoConfiguration.class) public class RedisTemplateConfig { - private final RedisConnectionFactory redisConnectionFactory; @Bean - public RedisTemplate redisTemplate() { + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate redisTemplate = new RedisTemplate<>(); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); @@ -50,4 +59,28 @@ public class RedisTemplateConfig { redisTemplate.setConnectionFactory(redisConnectionFactory); return redisTemplate; } + + + @Bean + @ConditionalOnProperty(value = "spring.redis.cluster.nodes") + public LettuceConnectionFactory redisConnectionFactory(RedisProperties redisProperties) { + RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(redisProperties.getCluster().getNodes()); + + // https://github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster#user-content-refreshing-the-cluster-topology-view + ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder() + .enablePeriodicRefresh() + .enableAllAdaptiveRefreshTriggers() + .refreshPeriod(Duration.ofSeconds(5)) + .build(); + + ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder() + .topologyRefreshOptions(clusterTopologyRefreshOptions).build(); + + // https://github.com/lettuce-io/lettuce-core/wiki/ReadFrom-Settings + LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder() + .readFrom(ReadFrom.SLAVE_PREFERRED) + .clientOptions(clusterClientOptions).build(); + + return new LettuceConnectionFactory(redisClusterConfiguration, lettuceClientConfiguration); + } } diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java index 5994170f6..eaa1336d9 100644 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java @@ -19,17 +19,27 @@ package com.pig4cloud.pigx.common.gateway.configuration; import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.gateway.support.RouteCacheHolder; +import io.lettuce.core.ReadFrom; +import io.lettuce.core.cluster.ClusterClientOptions; +import io.lettuce.core.cluster.ClusterTopologyRefreshOptions; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; import org.springframework.cloud.gateway.config.GatewayProperties; import org.springframework.cloud.gateway.config.PropertiesRouteDefinitionLocator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisClusterConfiguration; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.listener.ChannelTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import java.time.Duration; + /** * @author lengleng * @date 2018/11/5 @@ -69,4 +79,28 @@ public class DynamicRouteAutoConfiguration { }, new ChannelTopic(CacheConstants.ROUTE_JVM_RELOAD_TOPIC)); return container; } + + + @Bean + @ConditionalOnProperty(value = "spring.redis.cluster.nodes") + public LettuceConnectionFactory redisConnectionFactory(RedisProperties redisProperties) { + RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(redisProperties.getCluster().getNodes()); + + // https://github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster#user-content-refreshing-the-cluster-topology-view + ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder() + .enablePeriodicRefresh() + .enableAllAdaptiveRefreshTriggers() + .refreshPeriod(Duration.ofSeconds(5)) + .build(); + + ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder() + .topologyRefreshOptions(clusterTopologyRefreshOptions).build(); + + // https://github.com/lettuce-io/lettuce-core/wiki/ReadFrom-Settings + LettuceClientConfiguration lettuceClientConfiguration = LettuceClientConfiguration.builder() + .readFrom(ReadFrom.SLAVE_PREFERRED) + .clientOptions(clusterClientOptions).build(); + + return new LettuceConnectionFactory(redisClusterConfiguration, lettuceClientConfiguration); + } }