springboot版本2.2.6,apollo版本1.6.1

接上一章,这章主要是PropertySourcesProcessor类,BeanFactory后置处理器

apollo配置中心springboot集成_封装

一.initializePropertySources(),初始化远程apollo配置

1.取注解@EnableApolloConfig({ "apollo-share", "apollo-test"})的value值apollo-share和apollo-test做为namespace

2.循环namespace,调用Config config = ConfigService.getConfig(namespace),新建apollo配置

1)创建DefaultConfigFactory工厂对象;2)创建远程配置仓库RemoteConfigRepository对象,发起http请求配置中心,查询远程配置,http的路径MetaServer可通过配置apollo.meta参数(同时也提供了MetaServerProvider扩展点来获取不同环境下的MetaServer,通过spi的方式注入,即在 resources下创建 META-INF/services/ com.ctrip.framework.apollo.core.spi.MetaServerProvider 文件,写入自定义实现 MetaServerProvider全类名,多个的话按照优先级顺序遍历所有的MetaServerProvider,直到获取到一个非空的Meta Server地址),如果多个MetaServer服务,用“,”分隔,使用简单随机负载;3)新建本地配置仓库LocalFileConfigRepository对象,将http请求回来的配置存储本地文件中(不同系统默认路径不一样,可以用apollo.cacheDir修改);4)本地配置仓库LocalFileConfigRepository同时又是一个监听器,监听远程配置仓库RemoteConfigRepository的变更;config配置对象也是一个监听器,监听着本地配置仓库LocalFileConfigRepository的变更

3.远程配置仓库RemoteConfigRepository对象内部三个http请求:1)trySync实时刷新-同步返回,对象实例化的时候调用,实时查询返回结果;2)schedulePeriodicRefresh定时任务反复刷新-同步返回;3)scheduleLongPollingRefresh死循环长连接刷新-异步返回,发出去的请求,会apollo服务端hold住,有配置变更时返回200,收到200时,调用trySync实时刷新-同步返回;没有信息变更,超时时间到了返回304,收到304什么也不做,因为是死循环,进入下一轮长连接请求

apollo配置中心springboot集成_ide_02

4.将新建的远程apollo配置封装成ConfigPropertySource对象,放入容器上下文件的配置集合中

apollo配置中心springboot集成_ide_03

二.initializeAutoUpdatePropertiesFeature(beanFactory)初始化自动更新监听器

1.新建AutoUpdateConfigChangeListener自动更新监听器,将其绑定在ConfigPropertySource资源对象上

2.Multimap是一个key对应多个实体value的map集合,存放过程中自动将实体进行归类,形成格式是Multimap<String,Collection<T>>

3.SpringValueRegistry类,主要封装属性中含有占位符${key}中的key找出来,key和field等做好关联,放入map集合中,方便后续拉取最新配置后实时找到对应映射关系并反射设置新值

apollo配置中心springboot集成_封装_04

三.AutoUpdateConfigChangeListener自动更新监听器

1.本地配置仓库LocalFileConfigRepository同时又是一个监听器,监听远程配置仓库RemoteConfigRepository对象的变更

2.config配置对象也是一个监听器,监听着本地配置仓库LocalFileConfigRepository的变更

3.AutoUpdateConfigChangeListener监听器监听着config配置对象的变更

apollo配置中心springboot集成_封装_05

四.AutoUpdateConfigChangeListener的监听方法

1.AutoUpdateConfigChangeListener对象中持有SpringValueRegistry,SpringValueRegistry对象里面封装着含有占位符${key}中key和属性或方法的映射关系,所有只要找到哪个key值有变更,解析变更后的新值

2.再取出对应要更新的属性或方法,反射设置新值