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); + } }