06 May 2024 |
- 配置加载原理
在Spring中PropertySource类实现了所有属性的实例化。
启动赋值:
- 定义自定义属性配置源,从config-server获取全局属性;
- Spring启动时,插入自定义属性配置源;
- 绑定属性会优先使用,给自定义属性配置源赋值。
动态更新:
- client端和server端保持心跳检测,当有配置变动时获取新配置;
- 对于@Value的字段需要反射赋值;
- 对于@ConfigurationProperties配置类可以发送刷新事件。
优先级:
- 自定义配资源;
- 来自系统属性;
- 来自application.yaml;
- 来自application.properties;
- 来自spring内置属性。
- 自定义客户端注解
使用该注解就能加载客户端程序
- 自定义ConfigService
接口: 获取所有配置名称;根据名称获取配置
实现类:使用Map保存所有配置信息
- 自定义配置源
继承了EnumerablePropertySource,从ConfigService中获取属性信息。
- 自定义配置源处理器
- 实现BeanFactoryPostProcessor接口重新bean的后置处理逻辑;
- 实现 EnvironmentAware接口获取环境变量;
- 实现 PriorityOrdered接口定义优先级。
在postProcessBeanFactory()方法中
- 通过http请求到 config-server 获取配置;
- 创建自定义配置源;
- 创建组合配置源,可以加载多个自定义的配置源;
- 放到属性源环境变量的最前面。
程序启动时,debug可以看到,配置中心的值加载到env的最前面了。
- 手动注册bean
配置中心的客户端只是一个jar包,不是web项目,不能自动扫描注解包,需要手动注册bean。
通过实现ImportBeanDefinitionRegistrarle完成手动注册。一开始先判断是否存在,避免重复加载,然后再注册。
- 测试
新建一个web工程,在启动类中使用注解@EnableMidnightConfig启动配置中心客户端。
在demo工程中,使用了@Value的方式和@ConfigurationProperties配置的方式。
工程中默认的配置值midnight.a=a100。
配置中心默认的是midnight.a=dev500。
启动工程,查看日志,两种配置方式都是dev500,说明配置中心起作用了。
源代码: https://github.com/midnight2104/midnight-config
06 May 2024 |
- 在PropertySourcesProcessor中,需要通过http从config-server获取配置。
- 使用ConfigMeta包装服务信息
- 在MidnightConfigService接口中添加默认实现类
- 继承MidnightRepositoryChangeListener接口;
- 获取默认的MidnightRepository;
- 创建MidnightConfigServiceImpl实现类;
- 添加listener
- 定义MidnightRepositoryChangeListener,用于事件监听的回调接口
- onChange() 执行方法
- ChangeEvent变动事件,传递参数
- 定义MidnightRepository接口
- 提供默认实现类
- getConfig()获取配置
- addListener()添加监听器
- MidnightRepositoryImpl实现从server获取配置
- meta保存服务配置源信息;
- versionMap保存server版本号,用于比较本地和远程版本信息,用于比对配置是否发生变化;
- configMap保存一个ns服务下所有配置信息;
- executor定时任务,监听服务端配置是否发生变化;
- listeners保存监听器。
- findAll()接口
发起http请求,从config-server获取所有配置信息。
- heartbeat() 心跳检测
- 发起http请求,从配置中心服务端获取最新版本信息;
- 当远程版本信息大于本地版本信息时,说明配置发生了变化。
- 保存最新版本信息;
- 从配置中心重新获取所有配置信息;
- 保存最新的配置信息;
- 发布配置发生变更事件
- onChange() 发布事件
- 更新本地最新配置
- 通过Spring发布环境变更事件。事件类EnvironmentChangeEvent来自于SpringCloud,解决微服务架构下配置热更新问题。
- 重新绑定配置
当EnvironmentChangeEvent事件发布之后,会重新绑定PropertySource,调用getProperty()方法获取最新配置。
- @ConfigurationProperties 中的属性就会被更新
- 测试
- 启动config-server
- 启动config-client
- 观察日志,最开始的值如下
发现版本发生了变化,重新获取了配置,并发布了EnvironmentChangeEvent事件。
源代码:
https://github.com/midnight2104/midnight-config/tree/v3
04 May 2024 |
- 添加依赖
新建的web工程中添加h2的依赖
- 添加h2的配置
- 设置数据源和密码
- 设置初始化sql语句
- 打开h2的控制台
初始化语句创建一个config表,保存服务配置信息。
- 完成CRUD接口
controller类
mapper接口
- 测试
在web控制台可以看到sql已经初始化完成,crud接口也比较简单。
源码: https://github.com/midnight2104/midnight-config