9.5. 使用 PropertySource Reload


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

9.5.1. 启用 PropertySource Reload

Spring Cloud Kubernetes 的 PropertySource reload 功能被默认禁用。

流程

  1. 进入 Quickstart 项目的 src/main/resources 目录,再打开 bootstrap.yml 文件。
  2. 更改配置属性 spring.cloud.kubernetes.reload.enabled=true

9.5.2. PropertySource Reload 的级别

属性 spring.cloud.kubernetes.reload.strategy 支持以下重新加载级别:

refresh

(默认) 仅重新加载使用 @ConfigurationProperties@RefreshScope 注解的配置 Bean。此重新加载级别利用 Spring Cloud Context 的刷新功能。

注意

当 reload 策略被设置为 刷新 时,PropertySource reload 功能只能用于 简单 属性(即,而不是集合)。由集合支持的属性不能在运行时更改。

restart_context
整个 Spring ApplicationContext 已安全重启。Bean 使用新配置重新创建。
shutdown
Spring ApplicationContext 被关闭以激活容器重启。在使用此级别时,请确保所有非守护进程线程的生命周期都绑定到 ApplicationContext,并且复制控制器或副本集已配置为重启 pod。

9.5.3. PropertySource Reload 示例

以下示例解释了启用重新加载功能时会发生什么。

流程

  1. 假设使用默认设置(刷新 模式)启用了重新加载功能。配置映射更改时将刷新以下 bean:

    @Configuration
    @ConfigurationProperties(prefix = "bean")
    public class MyConfig {
    
        private String message = "a message that can be changed live";
    
        // getter and setters
    
    }
  2. 要查看发生的更改,请创建另一个 bean,以定期打印消息,如下所示。

    @Component
    public class MyBean {
    
        @Autowired
        private MyConfig config;
    
        @Scheduled(fixedDelay = 5000)
        public void hello() {
            System.out.println("The message is: " + config.getMessage());
        }
    }
  3. 您可以使用 ConfigMap 更改应用程序打印的消息,如下所示。

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

    对与 pod 关联的 Config Map 中名为 bean.message 的属性的任何更改都会反映在程序的输出中。

9.5.4. PropertySource Reload Operating Modes

reload 功能支持两种操作模式:

event
(默认) 监视使用 Kubernetes API (Web 套接字)的 ConfigMap 或 secret 的更改。在更改时,任何事件都会对配置生成重新检查,并重新加载。要侦听配置映射更改,需要服务帐户的 view 角色。更高级别的角色(例如,secret 需要编辑)(默认情况下不监控secrets)。
轮询
从配置映射和 secret 定期重新创建配置,以查看它是否已更改。可以使用属性 spring.cloud.kubernetes.reload.period 配置轮询周期,默认为 15 秒。它需要与 monitored 属性源相同的角色。例如,在文件挂载的 secret 源上使用轮询不需要特定的特权。

9.5.5. PropertySource Reload 配置属性

以下属性可用于配置重新载入功能:

spring.cloud.kubernetes.reload.enabled
启用对属性源和配置重新加载的监控。type 是 布尔值,默认为 false
spring.cloud.kubernetes.reload.monitoring-config-maps
允许配置映射中的监控更改。type 是 布尔值,默认为 true
spring.cloud.kubernetes.reload.monitoring-secrets
允许监控 secret 中的更改。type 是 布尔值,默认为 false
spring.cloud.kubernetes.reload.strategy
触发重新加载时使用的策略(刷新restart_context关闭)。type 为 Enum,默认为 refresh
spring.cloud.kubernetes.reload.mode
指定如何侦听属性源中的更改(事件轮询)。type 为 Enum,默认为 event
spring.cloud.kubernetes.reload.period
使用 轮询 策略时验证更改的时间(以毫秒为单位)。type 为 Long,默认为 15000

请注意以下几点:

  • spring.cloud.kubernetes.reload SetConfiguration 属性不应在 ConfigMap 或 Secret 中使用。在运行时更改这些属性可能会导致意外的结果;
  • 删除属性或整个配置映射在使用 刷新 级别时不会恢复 Bean 的原始状态。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.