bootstrap PropertySource排序

时间:2016-04-02 01:06:34

标签: java spring-boot spring-cloud netflix-eureka

我们有一个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中的

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

更新

我们正在使用spring-cloud版本Angel.SR6。

我已按照建议将 @Order(Ordered.HIGHEST_PRECEDENCE)注释添加到VaultPropertySourceLocator,但参数解析仍然无法正常工作。启用S​​pring调试日志记录后,我认为Vault PropertySource实际上存在,但由于某些原因未被使用。我修改了代码,以便VaultConfiguration实现可能影响事物的SmartLifecycle和Ordered(order = 0和phase = Integer.MIN_VALUE)。我将不得不做更多的调试,试图找出正在发生的事情。

1 个答案:

答案 0 :(得分:1)

我能够解决我的问题。我尝试了几种不同的方法,包括Spring AOP和LTW,它们并没有像过早尝试实例化这些方面那样工作 - 为了让VaultPropertySource在Eureka的DiscoveryClient之前可以拨打电话。

我的工作解决方案包括:

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

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

VaultPropertySource注册为PropertySource,用于在Eureka bean /配置布线时解析参数:

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