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 将刷新:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要查看发生的更改,请创建一个定期打印消息的 bean,如下所示。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以使用 ConfigMap 来更改应用程序打印的消息,如下所示。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 与 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 的原始状态。