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
属性。
我们有一个 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/resolvingEurekaClientConfigBean
属性。