













项目基于 Spring Boot 3.2.4 + Spring Cloud Alibaba + Nacos 配置中心,微服务架构,14 个服务模块。某天开始,所有服务在启动后日志中反复出现:
RedisReactiveHealthIndicator : Redis health check failed
Unable to connect to localhost/<unresolved>:6379
但 Redis 服务本身运行正常,网络可达,配置中也明确写了正确的连接地址。怪异之处在于,无论怎么改配置,Lettuce 都执着地连接 localhost:6379。
最初的分析方向是 Nacos 远程配置覆盖了本地配置。
项目的配置加载分为三层:
application.yml(打包在 jar 内)yuvex-common.yml(公共配置,通过 spring.config.import 引用)yuvex-cloud-bridge-config.yaml)怀疑 RedisProperties 绑定时机早于 Nacos 加载,导致拿到默认值 localhost,后续 Nacos 配置不重新绑定。于是尝试了以下方案:
REDIS_HOST、SPRING_REDIS_HOST,利用环境变量高优先级覆盖${REDIS_HOST:yuvex-redis} 在 yuvex-common.yml 中作为兜底redis-default.yml,通过 spring.config.import 最后加载全部失败。容器里的 jar 明明有正确的配置,actuator /env 也显示 spring.redis.host 为正确值,但 health check 依然报 localhost。
配置层面山穷水尽后,转入代码层排查。检查了所有自定义 Bean、自动配置排除、EnvironmentPostProcessor,甚至写了自定义 RedisConnectionDetails 替代 Spring Boot 默认实现——统统无效。
用 entrypoint 直接塞 -Dspring.redis.host JVM 系统属性,优先级在 Spring Boot 中排第二(仅次于命令行参数),理论上绝对无法被覆盖——仍然 localhost。
这已经完全超出了常规认知。配置是对的,代码是干净的,JVM 参数是最高的,但连接地址就是 localhost。
在一次搜索中偶然看到一句话:
“I moved from
spring.redis.hosttospring.data.redis.host.”
立刻去查 Spring Boot 3.x 文档——Spring Boot 3.x 将 RedisProperties 的 @ConfigurationProperties 前缀从 spring.redis 改成了 spring.data.redis。
我们全程配置的 key 是 spring.redis.host,但 RedisProperties 绑定的是 spring.data.redis.host。因为找不到正确前缀的属性,RedisProperties.host 字段永远是其 Java 默认值——localhost。
这就解释了所有反常现象:
/actuator/env/spring.redis.host 有值 → 那是 Environment 里的原始 key,不代表 RedisProperties 绑定了它-Dspring.redis.host 无效 → 同上SPRING_REDIS_HOST 无效 → Relaxed Binding 映射到的还是错的 key一切只差一个 data.。
将全部配置从 spring.redis.* 改为 spring.data.redis.*:
# 错误(Spring Boot 3.x 不认这个前缀)
spring:
redis:
host: yuvex-redis
# 正确
spring:
data:
redis:
host: yuvex-redis
对应的环境变量从 SPRING_REDIS_HOST 改为 SPRING_DATA_REDIS_HOST。
项目中数据库配置也用 spring.datasource,为什么没问题?因为 DataSourceProperties 的 @ConfigurationProperties 前缀一直是 spring.datasource,Spring Boot 3.x 中没变。只有 Redis 被挪到了 spring.data 命名空间下。
| 维度 | 反思 |
|---|---|
| 根因 | Spring Boot 3.x 属性前缀变更——spring.redis → spring.data.redis |
| 为何排查了 8 次 | 每次都在配置加载机制上打转,忽略了属性的 key 是否被框架识别 |
| 验证盲区 | /actuator/env 展示的是 Environment 原始值,不代表 @ConfigurationProperties 绑定结果 |
| 经验教训 | 升级主版本时,先查属性变更表,尤其是 @ConfigurationProperties 前缀 |
Spring Boot 3.x 属性变更参考:
https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#appendix.application-properties.data
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。