PropertySource Reload

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

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

默认情况下,此功能被禁用。您可以通过使用 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。为了让重启上下文正常工作,必须启用重启执行器端点并公开此端点

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

假设使用默认设置(“刷新”模式)启用了重新加载功能,则会在 config map 更改时刷新以下 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 的属性执行的任何更改都反映在输出中。更笼统地说,检测到了与 Kubernetes prefix 设置的 @ConfigurationProperties 注释中的 prefix 字段值相关的属性前缀关联的更改,并将其反映在应用程序中。本章稍早解释了 Associating a ConfigMap with a pod

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

  • 事件(默认值):使用 Kubernetes API(WebSocket)监视 ConfigMap 或机密中的更改。任何事件都会重新检查配置,并在发生更改时重新加载。要监听 ConfigMap 更改,需要服务帐户上的 view 角色。对于机密,需要更高级别的角色(例如 edit)(默认情况下,不监视机密)。

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