bootstrap PropertySource 排序

bootstrap PropertySource ordering

我们有一个 Spring-Boot application in which we are using Eureka to discover Spring Cloud Config and retrieve configurations. We are integrating Vault to inject secure/sensitive information and are experiencing issues with loading and resolution of parameters. The project which we are using as Vault client is vault-spring-boot-starter,只要我们不通过 eureka 将它与配置服务器一起使用,它就可以很好地工作。

具体来说,Eureka 访问 URL 包含从 Vault 检索的 parameters/credentials。在启用所有组件的情况下,当 DiscoveryClient 尝试访问参数尚未 populated/replaced.

的 URL 时,Eureka 请求失败

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

正在尝试指定@Order 和

@AutoConfigureBefore({EurekaClientAutoConfiguration.class, DiscoveryClientConfigServiceAutoConfiguration.class})

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

更新

我们使用的是spring云版Angel.SR6.

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

我能够解决我的问题。我尝试了几种不同的方法,包括 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 作为在 Eureka beans/configuration 连接发生时用于解析参数的 PropertySource:

  • 传递对 VaultPropertySource 的环境引用,它在环境的 PropertySources 列表中自我注册,当 Eureka bean 实例化并在实例化期间设置 serviceUrl 属性和 unwrapping/resolving EurekaClientConfigBean 属性。