Spring Reactive Redis健康检查失败:如何禁用非响应式连接检查?
启用actuator/health端点后,服务健康状态一直显示为DOWN。查看完整健康详情发现,Redis健康检查包含两个组件结果:
reactiveRedisConnectionFactory:状态为UP,能正常连接RedisredisConnectionFactory:状态为DOWN,报RedisConnectionFailureException: Unable to connect to Redis
但项目配置类仅显式配置了ReactiveRedisConnectionFactory,未配置非响应式的RedisConnectionFactory,需要解决健康状态异常问题,并明确出现双连接检查的原因。
原因分析
Spring Boot Actuator的Redis健康指示器会自动扫描容器中所有的Redis连接工厂Bean:包括响应式的ReactiveRedisConnectionFactory和非响应式的RedisConnectionFactory。
即使你没有手动配置非响应式连接工厂,如果项目依赖中包含了spring-boot-starter-data-redis这类非响应式Redis模块,Spring Boot会自动尝试创建默认的RedisConnectionFactory实例。但由于你的Redis配置(比如SSL、认证)是针对响应式客户端设置的,这个默认的非响应式连接工厂无法匹配配置,导致连接失败,进而拉低整体健康状态。
解决办法
方案1:排除非响应式Redis自动配置
在Spring Boot启动类上排除Redis自动配置类,阻止Spring创建默认的非响应式RedisConnectionFactory:
@SpringBootApplication(exclude = {RedisAutoConfiguration.class, RedisRepositoriesAutoConfiguration.class}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
方案2:自定义Redis健康指示器(仅检查响应式连接)
创建自定义的响应式健康指示器,覆盖默认的Redis健康检查逻辑,只关注ReactiveRedisConnectionFactory的状态:
import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.ReactiveHealthIndicator; import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; @Component("redis") public class ReactiveOnlyRedisHealthIndicator implements ReactiveHealthIndicator { private final ReactiveRedisConnectionFactory connectionFactory; public ReactiveOnlyRedisHealthIndicator(ReactiveRedisConnectionFactory connectionFactory) { this.connectionFactory = connectionFactory; } @Override public Mono<Health> health() { return connectionFactory.getReactiveConnection() .ping() .map(pong -> Health.up().withDetail("version", connectionFactory.getConnectionFactoryMetadata().getVersion()).build()) .onErrorResume(e -> Mono.just(Health.down().withDetail("error", e.getMessage()).build())); } }
方案3:关闭默认Redis健康检查(需自行实现响应式检查)
通过配置文件关闭默认的Redis健康检查,避免非响应式连接的失败影响整体状态:
management: health: redis: enabled: false
注意:此配置会关闭所有Redis相关的健康检查,若需保留响应式Redis的健康状态监控,需配合方案2的自定义指示器使用。
内容的提问来源于stack exchange,提问作者amasuKAKAROT

