11.5. 使用 PropertySource Reload
有些应用程序可能需要检测外部属性源的更改,并更新其内部状态以反映新配置。当相关的 ConfigMap 或 Secret 更改时,Spring Cloud Kubernetes 的 reload 功能可以触发应用程序重新加载。
11.5.1. 启用 PropertySource Reload
Spring Cloud Kubernetes 的 PropertySource reload
功能默认禁用。
流程
-
导航到 Quickstart 项目的
src/main/resources
目录,再打开bootstrap.yml
文件。 -
更改配置属性
spring.cloud.kubernetes.reload.enabled=true
。
11.5.2. PropertySource Reload 的级别
属性 spring.cloud.kubernetes.reload.strategy
支持以下重新载入级别:
- refresh
(默认) 仅带有
@ConfigurationProperties
或@RefreshScope
注解的配置 Bean 会被重新加载。此重新加载级别利用 Spring Cloud Context 的刷新功能。注意PropertySource reload 功能只能在重新加载策略设置为
刷新
时用于 简单 属性(即而非集合)。由集合支持的属性不能在运行时更改。- restart_context
- 整个 Spring ApplicationContext 可以被安全重启。使用新配置重新创建 Bean。
- shutdown
- Spring ApplicationContext 关闭以激活容器重启。当使用此级别时,请确保所有非守护进程线程的生命周期已绑定到 ApplicationContext,并且复制控制器或副本集都配置为重启 pod。
11.5.3. PropertySource Reload 示例
以下示例说明了启用重新加载功能时会发生什么。
流程
假设使用默认设置(刷新 模式)启用了 reload 功能。配置映射更改时,以下 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 关联的配置映射中的名为
bean.message
的属性都会反映在程序的输出中。
11.5.4. PropertySource Reload 操作模式
reload 功能支持两种操作模式:
- event
-
(默认) 监视使用 Kubernetes API(web socket)的 ConfigMap 或 secret 的更改。任何事件都会对配置进行重新检查,并在出现更改时重新加载。服务帐户的
view
角色需要侦听配置映射更改。更高级别角色(例如:secret(默认情况下不监控secrets)需要编辑
。 - 轮询
-
从配置映射和 secret 定期重新创建配置以查看它是否已更改。轮询周期可以使用属性
spring.cloud.kubernetes.reload.period
配置,默认为 15 秒。它需要与被监控的属性源相同的角色。例如,这意味着在挂载的文件系统时对挂载的文件系统不需要特定的特权。
11.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
和shutdown
)。type 是Enum
,默认为刷新
。 - spring.cloud.kubernetes.reload.mode
-
指定如何侦听属性源中的更改(
事件
,轮询
)。type 是Enum
,默认为事件
。 - spring.cloud.kubernetes.reload.period
-
使用
轮询
策略时验证更改的周期(毫秒)。type 为Long
,默认为15000
。
请注意以下几点:
-
spring.cloud.kubernetes.reload.*
属性不应在 ConfigMap 或 Secret 中使用。在运行时更改这样的属性可能会导致意外的结果 ; -
在使用
刷新
级别时,删除属性或整个配置映射不会恢复 Bean 的原始状态。