从0到1手写配置中心config之实现配置中心客户端
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