SpringCloud不重启服务使配置文件生效
不涉及配置中心的搭建和使用,网上百度一大堆,主要说一下不重启微服务使配置文件生效的流程
首先我们得添加一个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
它会提供一个/refresh
这样的监控端点,当配置文件修改了的时候,我们可以去调用这个监控端点,让服务重新拉取配置文件,并刷新配置文件
接下来主要说一下这个监控端点做了什么 ContextRefresher
类的refresh()
方法中
public synchronized Set<String> refresh() {
Map<String, Object> before = extract(
this.context.getEnvironment().getPropertySources());
addConfigFilesToEnvironment();
Set<String> keys = changes(before,
extract(this.context.getEnvironment().getPropertySources())).keySet();
this.context.publishEvent(new EnvironmentChangeEvent(context, keys));
this.scope.refreshAll();
return keys;
}
SpringBoot的配置都是保存Environment
中,该方法先获取到旧的配置值,在addConfigFilesToEnvironment()
方法中会去重新拉取新的配置,并将新的配置赋值到Environment
中,然后会比较新旧配置的不同,然后再返回,所以我们调用/refresh
时是会返回修改了的配置
然后在说一下EnvironmentChangeEvent
事件的监听器
DelegatingApplicationListener
ConfigurationPropertiesRebinder
LoggingRebinder
ConfigurationPropertiesRebinder
会去刷新所有的配置类,就是带有ConfigurationProperties
注解的类
this.scope.refreshAll();
就会去刷新所有被@RefreshScope
注解配置的bean
ConfigurationPropertiesRebinder
Endpoint
EndpointHandlerMapping
MvcEndpoints