|
此版本仍在开发中,目前尚不稳定。如需最新稳定版本,请使用 Spring Cloud Kubernetes 5.0.1! |
PropertySource 刷新
| 此功能已在 2020.0 版本中弃用。请参阅 Spring Cloud Kubernetes 配置监听器 控制器,以了解实现相同功能的替代方法。 |
某些应用程序可能需要检测外部属性源的变化,并更新其内部状态以反映新的配置。Spring Cloud Kubernetes 的重新加载功能能够在相关 ConfigMap 或 Secret 发生变化时触发应用程序的重新加载。
默认情况下,此功能处于禁用状态。您可以通过使用 spring.cloud.kubernetes.reload.enabled=true 配置属性来启用它(例如,在 application.properties 文件中)。
请注意,这将仅启用对 ConfigMap 的监控(即:spring.cloud.kubernetes.reload.monitoring-config-maps 将被设置为 true)。
如果您希望启用对 Secret 的监控,则必须通过以下方式显式进行: spring.cloud.kubernetes.reload.monitoring-secrets=true。
以下重载级别受支持(通过设置 spring.cloud.kubernetes.reload.strategy 属性):
-
refresh(默认值):仅重新加载使用@ConfigurationProperties或@RefreshScope注解的配置 Bean。
此重新加载级别利用了 Spring Cloud Context 的刷新功能。 -
restart_context: 整个 SpringApplicationContext被优雅地重新启动。Bean 将根据新配置被重新创建。
为了使重启上下文功能正常工作,您必须启用并暴露重启监控端点。
management:
endpoint:
restart:
enabled: true
endpoints:
web:
exposure:
include: restart
-
shutdown: SpringApplicationContext已关闭,以触发容器的重启。当使用此级别时,请确保所有非守护线程的生命周期均绑定至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!
对与 Pod 关联的 ConfigMap 中名为 bean.message 的属性所做的任何更改都会反映在输出中。更一般地讲,与 @ConfigurationProperties 注解中定义的 prefix 字段值前缀匹配的属性所关联的更改会被检测到,并反映在应用程序中。将一个 ConfigMap 与 Pod 关联 在本章早些部分已作解释。
重新加载功能支持两种操作模式:
-
事件(默认):通过使用 Kubernetes API(WebSocket)监控配置映射或密钥的更改。
任何事件都会触发一次配置检查,如果存在变更,则会重新加载配置。
为监听配置映射的变更,服务账户上需要具有
view权限角色;而要监听密钥的变更,则需要更高权限的角色(例如edit),因为默认情况下不监控密钥。 -
轮询:定期从配置映射和密钥中重新创建配置,以检查其是否已更改。
您可以通过使用
spring.cloud.kubernetes.reload.period属性来配置轮询周期,其默认值为 15 秒。它需要与被监控的属性源相同的权限角色。
这意味着,例如,对文件挂载的密钥源启用轮询时,并不需要特殊的权限。