Spring Boot 3.3.x升级到3.4.x后SecretManager配置导入(sm:///sm@)延迟初始化问题求助
最近我把Spring Boot应用从3.3.x版本升级到了3.4.6,连带底层的Spring Framework也同步升级到了6.2.7。结果刚升级完就碰到了一个致命问题:通过云Secret Manager管理的密钥在应用启动时初始化太晚,直接导致了PropertyNotFoundException错误,应用根本启动不起来。
问题详情
我们的应用通过Spring Cloud的spring.config.import特性集成云Secret Manager(比如GCP Secret Manager,不过这个问题看起来对所有用spring.config.import加载外部密钥的场景都通用),在application.yml里直接用sm://或者sm@前缀引用密钥,配置大概是这样的:
# application.yml spring: config: import: sm:// data: database: uri: ${sm://<PATH_TO_SECRET_FOR_URI>} # 或者 ${sm@<PATH_TO_SECRET_FOR_URI>} username: ${sm://<PATH_TO_SECRET_FOR_USERNAME>} password: ${sm://<PATH_TO_SECRET_FOR_PASSWORD>}
在升级到3.4.x之前(用3.3.x的时候),这套配置完全没问题:Spring Cloud的集成会在所有依赖这些密钥的bean初始化之前,就从Secret Manager拉取所有需要的密钥,把它们映射到Spring的Environment里。
但升级到3.4.6之后,我们每次启动都会碰到PropertyNotFoundException或者类似的启动失败错误。看起来现在有些应用组件或bean,会在sm:///sm@的导入机制还没把密钥完全加载并注册到Spring Environment之前,就去访问这些依赖密钥的属性了。
我的环境配置
- 旧Spring Boot版本:3.3.x
- 新Spring Boot版本:3.4.6
- 底层Spring Framework版本:6.2.7
- 密钥管理器集成:通过
spring.config.import搭配sm://或sm@前缀(依赖Spring Cloud GCP这类starter)
错误现象
应用启动直接失败,错误提示spring.data.database.uri、username这类依赖密钥的属性无法解析,本质就是sm:///sm@的导入机制还没完成密钥的加载和注册,就有bean尝试读取这些属性了。
想请教一下:有没有人在从Spring Boot 3.3.x升级到3.4.x时,碰到过类似的spring.config.import外部密钥初始化延迟的问题?在Spring Boot 3.4.x里,要怎么确保通过这种方式导入的密钥能在应用启动早期就准备好,避免依赖这些属性的bean初始化时出错?
内容来源于stack exchange

