spring-boot - Spring Cloud Config 双引导文件行为
问题描述
我有一个设置,我正在使用以下内容:
- Spring Boot 1.5.13 与 Spring Cloud 版本 Edgware.S3
- 我有 Spring Cloud Config Server,我的 Spring Boot 应用程序是它的客户端
- 每个应用程序都带有一个带有配置服务器 uri 和其他一些属性的 bootstrap.yml。
- 在 Docker Swarm 上运行容器
我目前通过自定义脚本将 Swarm 机密传递给客户端,该脚本读取放入 /run/secrets/ 的文件并创建 /config/bootstrap.properties 文件。它最终看起来像这样:
spring.cloud.config.username=user
spring.cloud.config.password=password
我的 Docker 映像的默认命令是这样的:
java -Djava.security.egd=file:/dev/./urandom -jar /${appName}.jar --spring.cloud.bootstrap.location=file:/config/bootstrap.properties"
伟大的。这工作没有问题。该应用程序似乎是这样写的:
- 用于读取配置服务器凭据的外部 bootstrap.properties
- 类路径 bootstrap.yml 读取配置客户端道具的其余部分
- 获取并读取配置服务器的 application-appName.yml
- 然后从类路径中读取捆绑的 application.yml
现在。我正在使用 Finchley.RELEASE 将应用程序移至 Spring Boot 2.0.3,这会中断。
现在发生的事情是:
- 读取外部 bootstrap.properties 以获取配置服务器的凭据
- 类路径 bootstrap.yml 完全被跳过(意外!)
- 获取并读取配置服务器的 application-appName.yml
- 然后从类路径中读取捆绑的 application.yml
问题是应用程序现在缺少在内部 bootstrap.yml 中设置的属性,因此它在启动时会爆炸。通过做同样的事情,我已经能够在容器环境之外重现它;将应用程序指向外部 bootstrap.properties。如果我将 bootstrap.yml 属性复制到 bootstrap.properties 中,那么它就可以正常工作。此外,如果我不提供外部属性文件,那么内部 bootstrap.yml 将毫无问题地启动。所以要么是一个,要么是另一个!
我还尝试修改引导位置以包含默认位置,但没有运气:
-- spring.cloud.bootstrap.location=file:/config/bootstrap.properties,classpath:,classpath:/config,file:,file:config/
有什么想法下一步该去哪里看吗?也许我缺少一个新的 spring.cloud.config 属性?或者任何人都可以确认哪种行为是正确的行为?假设他们修复了 Finchley 中的一个潜在漏洞,那么我可以搁置它并寻找另一个解决方案。如果它在 Finchley 中“坏了”,我想问题报告是为了?
解决方案
好吧,更多的挖掘表明它看起来像是新的行为:
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guide
spring.config.location 配置的行为已修复;它以前在默认位置列表中添加了一个位置,现在它替换了默认位置。如果您依赖之前的处理方式,您现在应该改用 spring.config.additional-location 。
它看起来不是 Spring Cloud 特定的,但我没有什么可失去的。更改我的 java 命令以使用这个新属性就可以了:
--spring.config.additional-location=file:/config/bootstrap.properties
谢谢。
推荐阅读
- reactjs - 反应原生无效事件目标
- java - Kafka 消费者在第二次通话时返回空
- javascript - JavaScript getter 的适用用途是什么?
- php - Magento 2中的客户网格为空
- android - 从 HandlerThread 更新回收站视图
- php - 设置 Illuminate 查询生成器 - 未捕获的 RuntimeException:尚未设置外观根
- ios - 旧应用程序的单元测试 - 应首先考虑哪些组件?
- android - 应用返回空 Toast
- python - 在 Python 中处理可选参数
- javascript - 使用 createElement 时 for 循环中“li”的 Onclick 事件