springboot版本2.2.6,apollo版本1.6.1
接上一章,这章主要是PropertySourcesProcessor类,BeanFactory后置处理器
一.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什么也不做,因为是死循环,进入下一轮长连接请求
4.将新建的远程apollo配置封装成ConfigPropertySource对象,放入容器上下文件的配置集合中
二.initializeAutoUpdatePropertiesFeature(beanFactory)初始化自动更新监听器
1.新建AutoUpdateConfigChangeListener自动更新监听器,将其绑定在ConfigPropertySource资源对象上
2.Multimap是一个key对应多个实体value的map集合,存放过程中自动将实体进行归类,形成格式是Multimap<String,Collection<T>>
3.SpringValueRegistry类,主要封装属性中含有占位符${key}中的key找出来,key和field等做好关联,放入map集合中,方便后续拉取最新配置后实时找到对应映射关系并反射设置新值
三.AutoUpdateConfigChangeListener自动更新监听器
1.本地配置仓库LocalFileConfigRepository同时又是一个监听器,监听远程配置仓库RemoteConfigRepository对象的变更
2.config配置对象也是一个监听器,监听着本地配置仓库LocalFileConfigRepository的变更
3.AutoUpdateConfigChangeListener监听器监听着config配置对象的变更
四.AutoUpdateConfigChangeListener的监听方法
1.AutoUpdateConfigChangeListener对象中持有SpringValueRegistry,SpringValueRegistry对象里面封装着含有占位符${key}中key和属性或方法的映射关系,所有只要找到哪个key值有变更,解析变更后的新值
2.再取出对应要更新的属性或方法,反射设置新值