SpringBoot2.x集成Redis Sentinel配置指南
在完成Redis Sentinel集群部署后,如何在Spring Boot项目中正确接入该集群?
依赖配置
在项目的pom.xml文件中引入以下依赖项(以Spring Boot 2.2.5为例),此版本默认采用Lettuce作为Redis客户端实现:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
在application.yml中添加Redis Sentinel及Lettuce相关配置,对应配置类为RedisProperties:
spring:
redis:
password: passwd@190
lettuce:
pool:
max-active: 20
max-wait: -1
max-idle: 10
min-idle: 2
sentinel:
master: master_node
nodes:
- 127.0.0.1:6390
- 127.0.0.1:6391
- 127.0.0.1:6393
集成方式
自动化配置
完成RedisProperties配置后,Spring Boot会自动注入相关组件,流程如下:
- 创建Redis连接工厂(RedisConnectionFactory),负责管理连接池。参考LettuceConnectionConfiguration。
- 利用Redis连接工厂初始化RedisTemplate,用于Redis数据操作。参考RedisAutoConfiguration。
但在使用Sentinel架构时,自动化配置存在局限性:它未考虑Sentinel的认证密码,且默认仅向主节点发起读写请求,无法实现主从节点的负载均衡。具体可参考LettuceConnectionConfiguration.createLettuceConnectionFactory方法。
Redis连接工厂定义
@Bean
@ConditionalOnMissingBean(RedisConnectionFactory.class)
LettuceConnectionFactory redisConnectionFactory(
ObjectProvider<LettuceClientConfigurationBuilderCustomizer> builderCustomizers,
ClientResources clientResources) throws UnknownHostException {
LettuceClientConfiguration clientConfig = getLettuceClientConfiguration(builderCustomizers, clientResources,
getProperties().getLettuce().getPool());
return createLettuceConnectionFactory(clientConfig);
}
Redis模板定义
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
手动配置
因自动装配不满足需求,需手动构建RedisConnectionFactory。
@Bean
public RedisConnectionFactory lettuceConnectionFactory(RedisProperties redisProperties) {
// 获取哨兵配置
String masterName = redisProperties.getSentinel().getMaster();
List<String> sentinelNodes = redisProperties.getSentinel().getNodes();
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration(masterName, new HashSet<>(sentinelNodes));
// 设置密码
sentinelConfig.setPassword(redisProperties.getPassword());
sentinelConfig.setSentinelPassword(redisProperties.getPassword());
// 配置Lettuce客户端,允许从任意节点读取
LettucePoolingClientConfiguration clientConfig = LettucePoolingClientConfiguration
.builder().readFrom(ReadFrom.ANY).build();
LettuceConnectionFactory factory = new LettuceConnectionFactory(sentinelConfig, clientConfig);
factory.setValidateConnection(true); // 连接有效性检查
return factory;
}
功能验证
启动应用后,Lettuce会通过Sentinel获取主从节点并建立连接,依据连接池配置实现负载均衡。
验证内容包括:
- 写入操作是否指向主节点
- 读取操作是否分布至主从节点
- 主节点失效后的故障转移机制是否正常
为查看详细日志,需调整日志级别:
logging:
level:
io.lettuce.core: debug
写入验证
执行多次Set操作,观察日志确认请求均发送至主节点。
读取验证
执行多次Get操作,观察日志确认请求分发至不同节点。
故障切换测试
关闭主节点后,Sentinel自动完成主从切换:
- 即刻写入会报错,符合预期
- 即刻读取可继续响应,符合预期
- 等待片刻后,读写恢复正常,符合预期