引导 PropertySource 排序

Posted

技术标签:

【中文标题】引导 PropertySource 排序【英文标题】:bootstrap PropertySource ordering 【发布时间】:2016-07-21 22:54:01 【问题描述】:

我们有一个Spring-Boot 应用程序,我们在其中使用Eureka 来发现Spring Cloud Config 并检索配置。我们正在集成Vault 以注入安全/敏感信息,并且在加载和解析参数时遇到问题。我们用作 Vault 客户端的项目是 vault-spring-boot-starter,只要我们不通过 eureka 将它与 config-server 一起使用,它就可以很好地工作。

具体来说,Eureka 访问 URL 包含从 Vault 检索的参数/凭据。启用所有组件后,当 DiscoveryClient 尝试访问尚未填充/替换参数的 URL 时,Eureka 请求将失败。

( Example: http://$user:$pass..... )

试图指定@Order 和

@AutoConfigureBefore(EurekaClientAutoConfiguration.class, DiscoveryClientConfigServiceAutoConfiguration.class)

在 Vault-spring-boot-starter 的 VaultBootstrapConfiguration 似乎没有任何影响。我相信这个问题与处理 PropertySource 的顺序有关,但我无法在 Eureka 之前成功地注入 Vault 的 PropertySource。我们如何指示自定义/Vault PropertySourceLocator 逻辑在 DiscoveryClient 和配置服务器访问之前执行?

更新

我们使用的是spring-cloud版本的Angel.SR6。

我已按照建议将 @Order(Ordered.HIGHEST_PRECEDENCE) 注释添加到 VaultPropertySourceLocator,但参数解析仍然不起作用。启用 Spring 调试日志记录后,我相信 Vault PropertySource 确实存在,但由于某种原因没有被使用。我已经修改了代码,以便 VaultConfiguration 实现 SmartLifecycle 和 Ordered(order=0 和 phase=Integer.MIN_VALUE),这可能会影响事情。我将不得不进行更多调试以尝试隔离发生的情况。

【问题讨论】:

你用的是什么版本的spring cloud? 查看代码,您可能需要@Order 上的github.com/markramach/vault-spring-boot-starter/blob/master/src/… 也就是说PropertySourceLocators 支持弹簧排序机制。 啊,订购可能只有 Brixton,不是天使。 是否有针对 Angel.SR6 的订购解决方法? 【参考方案1】:

我能够解决我的问题。我尝试了几种不同的方法,包括 Spring AOP 和 LTW,但由于尝试过早地实例化切面,所以没有奏效 - 为了在 Eureka 的 DiscoveryClient 进行调用之前使 VaultPropertySource 可用。

我的工作解决方案包括:

用于在 Eureka bean 之前实例化 Vault bean 并且配置开始实例化:

@Ordered 或在 VaultPropertySourceLocator 中实现 PriorityOrdered。我的VaultPropertySourceLocator 还包括实现SmartLifecycle,因为我看到部分Eureka bean 实例化有时发生在Vault bean 之前的不确定性输出。我的订单是Ordered.HIGHEST_PRECEDENCE,相位是Integer.MIN_VALUE

用于将VaultPropertySource 注册为 PropertySource,用于在 Eureka beans/配置连接发生时解析参数:

将环境引用传递给VaultPropertySource,它在环境的PropertySources 列表中自行注册,并且在Eureka beans 实例化并在实例化和解包/解析EurekaClientConfigBean 属性期间设置serviceUrl 属性时存在。

【讨论】:

以上是关于引导 PropertySource 排序的主要内容,如果未能解决你的问题,请参考以下文章

Spring配置文件无法解析正确的文件

Spring:使用@Configuration 注释自动装配或“普通”调用?

spring使用@Value标签读取.properties文件的中文乱码问题的解决

Springboot中PropertySource注解的使用

Spring注解PropertySource

使用引导程序 3 重新排序