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

Spring Boot & Vault: incomplete context initialization issue

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

我定义了 CbKafkaConsumerConfig(我的自定义 bean)类型的 bean,并在标记为 @EventListener(ApplicationReadyEvent.class) 的方法创建的线程中检查它的状态,所以我希望它被完全初始化观点。然而,这是我看到的:

我希望填充的值留有占位符。 下面是它们在 application.properties 文件中的定义方式。 (而且我检查了拼写 - 是正确的,否则每次都会失败,而不是偶尔)

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

这些属性在 Vault 中定义,我希望它们可以通过 Spring Cloud Vault 的强大功能获取和设置。在这里您可以看到 Vault 作为 属性 源存在并且这些属性已填充在那里。

同时,在上下文中还有其他相同类型的 bean CbKafkaConsumerConfig 引用这些属性,但它为它们解析得很好。

下面是 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,其他 bean 在 Vault 中正确设置时也可能会失败。这种不可预测的行为可能是什么原因以及我应该调查什么?

默认情况下 spring Cloud Vault 并不是简单地在启动时获取属性,它每隔一段时间就会更新它们。更新时,有一小段时间 window 属性已经从上下文中的 属性 源中删除,但没有填充新的属性,它实际上可能发生在上下文初始化期间(我认为超级可疑的行为) 导致一些 bean 被破坏。

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