Spring Boot&Vault:不完整的上下文初始化问题

问题描述 投票:0回答:1

我遇到了一个问题,在极少数情况下(可能需要重启数十次),Spring无法正确初始化所有属性。

我定义CbKafkaConsumerConfig类型的bean(我的自定义bean),并在由标记为@EventListener(ApplicationReadyEvent.class)的方法创建的线程中检查其状态,因此我希望到此为止它已完全初始化。但是,这是我看到的:

Bean state in debug

我希望填充的值保留有占位符。这是在application.properties文件中定义它们的方式。 (而且我已经检查过拼写-是正确的,否则每次都会失败,并非偶然)

config-bean-prefix.msg-topics=${cb.kafka.tc-topic}
config-bean-prefix.unexpected-error-topic=${cb.kafka.unexpected-errors-topic}

这些属性是在保险柜中定义的,我希望可以使用Spring Cloud Vault的功能来获取和设置这些属性。在这里您可以看到Vault作为属性源存在,并且这些属性已在其中填充。

Vault properties are in the contextMissing properties are present in the Vault

同时,在上下文中,还有其他相同类型CbKafkaConsumerConfig的bean引用了这些属性,但是对于它们来说,解析起来很好。

这里是bean的定义方式

@Bean({"myBean"})
@ConfigurationProperties(
    prefix = "config-bean-prefix"
)
public CbKafkaConsumerConfig myBeanConsumer() {
    return new CbKafkaConsumerConfig();
}

还有bean本身:

@Data
public class CbKafkaConsumerConfig extends CbKafkaBaseConfig {

  @NotNull
  @Size(
      min = 1
  )
  private Collection<String> msgTopics;
  @NotNull
  private String unExpectedErrorTopic;
}

我们正在使用Spring Boot 2.2.x,但是Spring Boot 2.1.x也存在此问题。它不适用于这种类型的bean,在Vault中正确设置其他bean也会失败。这种不可预测的行为的原因可能是什么,我应该注意什么?

spring spring-boot spring-cloud spring-cloud-config hashicorp-vault
1个回答
0
投票

默认情况下,结果证明,Spring Cloud Vault并非只是在启动时获取属性,而是经常更新属性。更新时,会有一个很短的时间窗口,当属性已从上下文中的属性源中删除,但没有被新属性填充时,它实际上可能在上下文初始化期间发生(我认为这是超级可疑的行为),从而导致某些Bean损坏。

如果您不希望在运行时更新属性,只需将spring.cloud.vault.config.lifecycle.enabled设置为false

© www.soinside.com 2019 - 2024. All rights reserved.