PropertySource 重新加载

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

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

默认情况下,此功能处于禁用状态。您可以使用 spring.cloud.kubernetes.reload.enabled=true 配置属性启用它(例如,在 application.properties 文件中)。请注意,这将仅启用对 ConfigMap 的监视(即: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。为了使重新启动上下文功能正常工作,您必须启用并公开重新启动执行器端点

management:
  endpoint:
    restart:
      enabled: true
  endpoints:
    web:
      exposure:
        include: restart
  • shutdown:Spring ApplicationContext 将关闭以激活容器的重新启动。当您使用此级别时,请确保所有非守护线程的生命周期都绑定到 ApplicationContext,并且已配置复制控制器或副本集以重新启动 Pod。

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

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

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

    // getter and setters

}

要查看更改是否有效,您可以创建另一个定期打印消息的 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(WebSocket)监视 ConfigMap 或 Secrets 中的更改。任何事件都会导致对配置进行重新检查,如果发生更改,则进行重新加载。为了侦听 ConfigMap 更改,需要在服务帐户中具有 view 角色。Secrets 需要更高级别的角色(例如 edit)(默认情况下,不会监视 Secrets)。

  • 轮询:定期从 ConfigMap 和 Secrets 重新创建配置以查看其是否已更改。您可以使用 spring.cloud.kubernetes.reload.period 属性配置轮询周期,默认为 15 秒。它需要与监视的属性源相同的角色。例如,这意味着在文件挂载的 Secret 源上使用轮询不需要特殊的权限。