使用保管库和领事时,属性占位符解析优先级

时间:2018-09-07 19:15:06

标签: spring-cloud-consul spring-cloud-vault-config

在使用consul-configvault-config时,我对占位符解析优先级有疑问 我使用this信息创建了简单的应用程序

我的依赖项是:

dependencies {
compile('org.springframework.cloud:spring-cloud-starter-consul-config')
compile('org.springframework.cloud:spring-cloud-starter-vault-config')

compile('org.springframework.boot:spring-boot-starter-webflux')
compile('org.springframework.cloud:spring-cloud-starter')
testCompile('org.springframework.boot:spring-boot-starter-test')
}

请注意,我没有使用服务发现。

下一步,我创建了属性foo.prop = consul(在领事存储中) 和foo.prop = vault

使用时:

@Value("${foo.prop}")
private String prop;

我得到vault作为输出,但是当我从库中删除foo.prop并重新启动应用程序时,我将得到consul

我以不同的组合进行了几次,看来Vault配置的优先级高于领事。

我的问题是我在哪里可以找到有关解决策略的信息。(想象一下,我们作为第三个zookeeper-config添加了)。似乎Spring核心文档对此保持沉默。

1 个答案:

答案 0 :(得分:0)

根据我对调试Spring源代码的了解,... Vault现在具有优先级。

我的调查结果: PropertySourceBootstrapConfiguration.java负责在引导阶段初始化所有属性源。在查找属性之前,它会按顺序对所有propertySourceLocators进行排序:

AnnotationAwareOrderComparator.sort(this.propertySourceLocators);

保险柜总是“赢”,因为LeasingVaultPropertySourceLocator的实例(至少是我在调试期间创建的)实例实现了PriorityOrdered接口。 ConsulPropertySourceLocator的实例具有@Order(0)注释。根据{{​​3}}表示:PriorityOrdered的实例“更重要”。

如果您还有另一个PriorityOrdered属性源(例如自定义属性),则可以通过为保险柜设置spring.cloud.vault.config.order来影响此顺序。

就目前而言,未经自定义,我不知道如何在Vault和Consul之间更改优先级。