2024-5-9-从0到1手写配置中心Config之@ConfigurationProperties热更新

  1. 在PropertySourcesProcessor中,需要通过http从config-server获取配置。
  1. 使用ConfigMeta包装服务信息
  1. 在MidnightConfigService接口中添加默认实现类
  • 继承MidnightRepositoryChangeListener接口;
  • 获取默认的MidnightRepository;
  • 创建MidnightConfigServiceImpl实现类;
  • 添加listener
  1. 定义MidnightRepositoryChangeListener,用于事件监听的回调接口
  • onChange() 执行方法
  • ChangeEvent变动事件,传递参数
  1. 定义MidnightRepository接口
  • 提供默认实现类
  • getConfig()获取配置
  • addListener()添加监听器
  1. MidnightRepositoryImpl实现从server获取配置
  • meta保存服务配置源信息;
  • versionMap保存server版本号,用于比较本地和远程版本信息,用于比对配置是否发生变化;
  • configMap保存一个ns服务下所有配置信息;
  • executor定时任务,监听服务端配置是否发生变化;
  • listeners保存监听器。
  1. findAll()接口

发起http请求,从config-server获取所有配置信息。

  1. heartbeat() 心跳检测
  • 发起http请求,从配置中心服务端获取最新版本信息;
  • 当远程版本信息大于本地版本信息时,说明配置发生了变化。
  • 保存最新版本信息;
  • 从配置中心重新获取所有配置信息;
  • 保存最新的配置信息;
  • 发布配置发生变更事件
  1. onChange() 发布事件
  • 更新本地最新配置
  • 通过Spring发布环境变更事件。事件类EnvironmentChangeEvent来自于SpringCloud,解决微服务架构下配置热更新问题。
  1. 重新绑定配置

当EnvironmentChangeEvent事件发布之后,会重新绑定PropertySource,调用getProperty()方法获取最新配置。

  • @ConfigurationProperties 中的属性就会被更新
  1. 测试
  • 启动config-server
  • 启动config-client
  • 观察日志,最开始的值如下
  • 更新这两个值后,再观察日志。

发现版本发生了变化,重新获取了配置,并发布了EnvironmentChangeEvent事件。

  • 两个值已经被更新了

源代码:

https://github.com/midnight2104/midnight-config/tree/v3

相关推荐
morris1315 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
七星静香30 分钟前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员31 分钟前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU31 分钟前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie634 分钟前
在IDEA中使用Git
java·git
Elaine2023911 小时前
06 网络编程基础
java·网络
G丶AEOM1 小时前
分布式——BASE理论
java·分布式·八股
落落鱼20131 小时前
tp接口 入口文件 500 错误原因
java·开发语言
想要打 Acm 的小周同学呀1 小时前
LRU缓存算法
java·算法·缓存
镰刀出海1 小时前
Recyclerview缓存原理
java·开发语言·缓存·recyclerview·android面试