[TOC]
- 配置刷新,Client端是如何动态感知的?
- 多个配置优先级是怎样的?
- 集群节点是如何同步配置的?
- 以 SpringBoot 加载配置的代码逻辑为入口
- SpringBoot 提供的加载配置文件的接口
- bootstrap.yml
- application.yml
- application-dev.yml
- ApplicationContextInitializer
- Spring 的扩展点之一,在 ConfigurableApplication # refresh() 之前调用
- 通用用于需要对应用上下文做初始化的 Web 应用中,比如:
- 根据上下文环境注册属性源 或 激活配置文件等
- 在 spring-cloud-context 包中实现,通过 SPI 机制加载
- 在 SpringApplication 初始化的过程中,会通过 SpringFactoriesLoader 加载 ApplicationContextInitializer 类型的实现类到 initializers 中
- locate() 加载顺序:
- 共享资源配置
- 扩展资源配置
- 应用资源配置
- locate() 优先级: 3 > 2 > 1
- loadApplicationConfiguration() 加载顺序:
- 文件名(服务名)
- 文件名.扩展名
- 文件名-profile.扩展名
- **loadApplicationConfiguration() **优先级:3 > 2 > 1
- 调用栈
- 之前 @RefreshScope 标记的 bean 被 destroy 销毁后
- 下次应用获取这些 Bean,就会重新从 BeanFactory 中创建 Bean
- 此时该 Bean 就是最新的配置Bean了
- ConfigService
public class ConfigServerDemo {
public static void main(String[] args) throws NacosException, InterruptedException {
String serverAddr = "localhost:8848";
String dataId = "nacos-config-demo.yaml";
String group = "DEFAULT_GROUP";
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
//获取配置服务
ConfigService configService = NacosFactory.createConfigService(properties);
//获取配置
String content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
//注册监听器
configService.addListener(dataId, group, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("===recieve:" + configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
});
//发布配置
//boolean isPublishOk = configService.publishConfig(dataId, group, "content");
//System.out.println(isPublishOk);
//发送properties格式
configService.publishConfig(dataId,group,"common.age=30", ConfigType.PROPERTIES.getType());
Thread.sleep(3000);
content = configService.getConfig(dataId, group, 5000);
System.out.println(content);
// boolean isRemoveOk = configService.removeConfig(dataId, group);
// System.out.println(isRemoveOk);
// Thread.sleep(3000);
// content = configService.getConfig(dataId, group, 5000);
// System.out.println(content);
// Thread.sleep(300000);
}
}
- DiskUtil.targetFile() 也是从本地磁盘读取配置文件的方法
- 课程 debug 进入的该方法
- 直接改数据库配置文件的数据,是不能实现客户端配置动态刷新的
- 因为拉取配置时,Nacos Server都是直接从本地磁盘读的数据
- Console修改配置,需要发布 ConfigDataChangeEvent 的事件
- 触发本地文件和内存的更新
- Nacos Server中的DumpService