PropertySource
重新加载
PropertySource
Reload
此功能已在 2020.0 版本中弃用。请参阅 Spring Cloud Kubernetes Configuration Watcher 控制器,以获取实现相同功能的替代方法。
某些应用程序可能需要检测外部属性源的变化,并更新其内部状态以反映新的配置。Spring Cloud Kubernetes 的重载功能能够在相关的 ConfigMap
或 Secret
发生变化时触发应用程序的重载。
默认情况下,此功能是禁用的。你可以通过使用 spring.cloud.kubernetes.reload.enabled=true
配置属性(例如,在 application.properties
文件中)来启用它。请注意,这将仅启用对 configmaps 的监控(即:spring.cloud.kubernetes.reload.monitoring-config-maps
将被设置为 true
)。如果你想启用对 secrets 的监控,必须显式地通过以下配置来启用: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
: 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!
与 Pod 关联的 ConfigMap
中名为 bean.message
的属性的任何更改都会反映在输出中。更一般地说,与 @ConfigurationProperties
注解的 prefix
字段定义的值前缀相关联的属性的更改会被检测到并反映在应用程序中。本章前面已经解释了 将 ConfigMap 与 Pod 关联 的方法。
重新加载功能支持两种操作模式:
-
事件(默认):通过使用 Kubernetes API(WebSocket)监听配置映射或密钥的变化。任何事件都会触发配置的重新检查,并在发生更改时重新加载。为了监听配置映射的更改,服务账户需要具备
view
角色。对于密钥,则需要更高级别的角色(例如edit
)(默认情况下,密钥不会被监控)。 -
轮询:定期从配置映射和密钥重新创建配置,以检查是否发生了更改。你可以使用
spring.cloud.kubernetes.reload.period
属性配置轮询周期,默认值为 15 秒。它需要与被监控的属性源相同的角色。这意味着,例如,在文件挂载的密钥源上使用轮询不需要特殊权限。