目标
- soul-bootstarp http初始化流程
- soul-bootstrap 定时问admin要数据原理
- soul-bootstrap 被动接收到数据之后处理流程
- 总结
soul-bootstrap http初始化流程
pom依赖
yml 添加配置
这里支持多个admin 集群配置,类似 http://localhost:9095,http://localhost:9096...
HttpSyncDataConfiguration 初始化
根据自定义Boot Starter 原理初始化HttpSyncDataConfiguration
主要根据配置的请求基本信息(admin请求地址)和几个数据的发布者类组合,创建一个HttpSyncDataService,构造参数也是使用了ObjectProvider类进行依赖查找与注入
HttpSyncDataService分析
- 这里使用了数据刷新工厂将 Plugin,Metadata,Auth事件发布类整合到刷新工厂类中,使用ConfigGroupEnum作为Key 进行统一管理。
- 同时解析admin url list和初始化一个httpClient,默认读超时90s,作为发送请求的工具类
- 然后根据配置的请求URL个数开启HttpLongPollingTask任务
Soul-Bootstrap 定时向admin要数据原理
HttpLongPollingTask初始化
根据代码我们知道,默认进来按照3次一个循环的进行获取数据,这里面没有使用超时就是使用了HttpClient的每次读超时,如果请求出现错误,这里就会进入catch 中,如果发生错误的时候次数小于设定的3次,那么继续获取请求,如果到3次则休眠5分钟之后再次尝试。
分析doLongPolling逻辑
- 首先组织请求数据变化的参数
- 然后如果请求的数据真的有变化,则进入doFetchGroupConfig
doFetchGroupConfig逻辑分析
从图中我们可以看出,doLongPolling 问admin 拿到数据发生变化的ConfigGroup名称,然后bootstrap 拿着这个变化的groupname 发起/configs/fetch 问admin 要对应的数据
- 获取变化的数据
- 将数据变化的事件发送给关心这个数据的实例,如果refresh 成功 会拿到true
如果更新成功,这里就打印记录并直接返回,如果数据没有更新,那么在进行休眠30s
The config of the server[{}] has not been updated or is out of date. Wait for 30s to listen for changes again.
英文是注释写为什么等待30s 的原因
Soul-Bootstrap被动接收admin数据变化处理逻辑
这里面没有类似Nacos,ZK这些监听机制,其实bootstrap 被动模式,我们可以理解为,主动问admin 要数据时候,刚开始没有拿到数据,此时 admin 就启动DataChangeTask任务,此时会立马清空BlockQueue中的bootstrap请求连接。然后将变化的groupKey 发送给Bootstrap。
总结
到这里数据同步篇就全部完成了,我们最开始的websocket 入手,给他家整体的分析了数据同步框架的原理,然后分别按照 zk nacos http 三种方式 一次给他家讲解了各自的同步原理。其实zk 与 nacos 原理基本一样都是靠监听watcher 机制。设计最巧的是http 长轮询,接下来 我就会从调用链方面给他们分析soul的插件化调用链方面的知识。