Spring Cloud PropertySource重新加载
某些应用程序可能需要检测外部属性源上的更改并更新其内部状态以反映新配置。当相关的ConfigMap
或Secret
发生更改时,Spring Cloud Kubernetes的重载功能能够触发应用程序重载。
默认情况下,此功能处于禁用状态。您可以使用spring.cloud.kubernetes.reload.enabled=true
配置属性(例如,在application.properties
文件中)启用它。
支持以下级别的重载(通过设置spring.cloud.kubernetes.reload.strategy
属性):* refresh
(默认):仅重载用@ConfigurationProperties
或@RefreshScope
注释的配置beans。
此重新加载级别利用了Spring Cloud上下文的刷新功能。* restart_context
:整个Spring ApplicationContext
已正常重启。用新配置重新创建Beans。* 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!
与容器关联的ConfigMap
中名为bean.message
的属性的任何更改都会反映在输出中。更一般而言,将检测与属性相关联的更改,这些更改的前缀为@ConfigurationProperties
注释的prefix
字段定义的值。
本章前面已经说明了将ConfigMap
与pod关联。
完整的示例可在中找到spring-cloud-kubernetes-reload-example
。
重新加载功能支持两种操作模式:*事件(默认):使用Kubernetes API(web套接字)监视配置映射或机密的更改。任何事件都会对配置进行重新检查,并在发生更改的情况下重新加载。服务帐户上的view
角色是必需的,以便侦听配置映射更改。秘密需要更高级别的角色(例如edit
)(默认情况下,不监视秘密)。
*轮询:从配置上通过配置映射和机密重新创建配置,以查看配置是否已更改。您可以使用spring.cloud.kubernetes.reload.period
属性来配置轮询时间,默认为15秒。它需要与受监视属性源相同的角色。例如,这意味着对文件挂载的秘密源使用轮询不需要特定的特权。
表140.3。Properties:
名称 | 类型 | 默认 | 描述 |
---|---|---|---|
|
|
|
使用 |
|
|
|
启用监视属性源和配置重载 |
|
|
|
允许监视配置映射中的更改 |
|
|
|
允许监视机密更改 |
spring.cloud.kubernetes.reload.strategy` |
|
|
触发重新加载时使用的策略( |
|
|
|
指定如何侦听属性源( |
注意:*请勿在配置映射或机密中使用spring.cloud.kubernetes.reload
下的属性。在运行时更改此类属性可能会导致意外结果。*使用refresh
级别时,删除属性或整个配置图不会恢复beans的原始状态。
更多建议: