PropertySource 重载

此功能在 2020.0 版本中已弃用。请参阅 Spring Cloud Kubernetes Configuration Watcher 控制器,以了解实现相同功能的替代方法。

某些应用程序可能需要检测外部属性源的更改并更新其内部状态以反映新配置。Spring Cloud Kubernetes 的重载功能能够在相关的 ConfigMapSecret 发生更改时触发应用程序重载。

默认情况下,此功能是禁用的。您可以使用配置属性 spring.cloud.kubernetes.reload.enabled=true 来启用它(例如,在 application.properties 文件中)。请注意,这将仅启用对 configmaps 的监控(即:spring.cloud.kubernetes.reload.monitoring-config-maps 将设置为 true)。如果您想启用对 secrets 的监控,必须通过 spring.cloud.kubernetes.reload.monitoring-secrets=true 明确进行。

支持以下重载级别(通过设置属性 spring.cloud.kubernetes.reload.strategy):

  • refresh (默认): 仅重载带有 @ConfigurationProperties@RefreshScope 注解的配置 Bean。此重载级别利用了 Spring Cloud Context 的刷新功能。

  • restart_context: 整个 Spring ApplicationContext 会被优雅地重启。Bean 将使用新配置重新创建。为了使重启上下文功能正常工作,您必须启用并暴露 restart actuator endpoint。

management:
  endpoint:
    restart:
      enabled: true
  endpoints:
    web:
      exposure:
        include: restart
  • shutdown: Spring ApplicationContext 会被关闭以激活容器的重启。当您使用此级别时,请确保所有非守护线程的生命周期都绑定到 ApplicationContext,并且配置了 replication controller 或 replica set 来重启 pod。

假设重载功能已启用默认设置(refresh 模式),当 config map 更改时,以下 Bean 将被刷新:

@Configuration
@ConfigurationProperties(prefix = "bean")
public class MyConfig {

    private String message = "a message that can be changed live";

    // getter and setters

}

为了看到更改实际发生,您可以创建另一个 Bean,该 Bean 会定期打印消息,如下所示:

@Component
public class MyBean {

    @Autowired
    private MyConfig config;

    @Scheduled(fixedDelay = 5000)
    public void hello() {
        System.out.println("The message is: " + config.getMessage());
    }
}

您可以使用 ConfigMap 来更改应用程序打印的消息,如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  name: reload-example
data:
  application.properties: |-
    bean.message=Hello World!

与 pod 相关联的 ConfigMap 中名为 bean.message 的属性的任何更改都会反映在输出中。更普遍地说,与 @ConfigurationProperties 注解的 prefix 字段定义的值为前缀的属性相关的更改都会被检测到并反映在应用程序中。ConfigMap 与 pod 相关联已在本章前面解释。

重载功能支持两种操作模式:

  • 事件模式 (默认): 使用 Kubernetes API (web socket) 监视 config maps 或 secrets 的变化。任何事件都会触发对配置的重新检查,如果发生变化,则触发重载。需要 service account 具有 view 角色才能监听 config map 的变化。对于 secrets,需要更高级别的角色(例如 edit)(默认情况下不监控 secrets)。

  • 轮询模式: 定期从 config maps 和 secrets 中重新创建配置,以查看是否发生变化。您可以使用属性 spring.cloud.kubernetes.reload.period 配置轮询周期,默认值为 15 秒。它需要与被监控的属性源相同的角色。这意味着,例如,对文件挂载的 secret 源使用轮询不需要特殊权限。