跳到主要内容
版本:5.0.1

PropertySource 重载

DeepSeek V3 中英对照 PropertySource Reload PropertySource Reload

注意

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

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

默认情况下,此功能处于禁用状态。您可以通过使用 spring.cloud.kubernetes.reload.enabled=true 配置属性(例如,在 application.properties 文件中)来启用它。请注意,这将仅启用对 ConfigMap 的监控(即:spring.cloud.kubernetes.reload.monitoring-config-maps 将被设置为 true)。如果您希望启用对 Secret 的监控,必须通过 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 模式)的重新加载功能,当配置映射发生变化时,以下 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)监视配置映射或密钥的更改。任何事件都会触发对配置的重新检查,并在发生更改时重新加载。为了监听配置映射的更改,服务账户需要具备 view 角色。对于密钥,则需要更高级别的角色(例如 edit)(默认情况下,密钥不受监视)。

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