Soul API网关源码解析13-数据同步篇

目标

  • soul-bootstarp http初始化流程
  • soul-bootstrap 定时问admin要数据原理
  • soul-bootstrap 被动接收到数据之后处理流程
  • 总结

soul-bootstrap http初始化流程

pom依赖

image

yml 添加配置

image

这里支持多个admin 集群配置,类似 http://localhost:9095,http://localhost:9096...

HttpSyncDataConfiguration 初始化

根据自定义Boot Starter 原理初始化HttpSyncDataConfiguration

image
image

主要根据配置的请求基本信息(admin请求地址)和几个数据的发布者类组合,创建一个HttpSyncDataService,构造参数也是使用了ObjectProvider类进行依赖查找与注入

HttpSyncDataService分析

image
  • 这里使用了数据刷新工厂将 Plugin,Metadata,Auth事件发布类整合到刷新工厂类中,使用ConfigGroupEnum作为Key 进行统一管理。
image
  • 同时解析admin url list和初始化一个httpClient,默认读超时90s,作为发送请求的工具类
image
  • 然后根据配置的请求URL个数开启HttpLongPollingTask任务

Soul-Bootstrap 定时向admin要数据原理

HttpLongPollingTask初始化

image

根据代码我们知道,默认进来按照3次一个循环的进行获取数据,这里面没有使用超时就是使用了HttpClient的每次读超时,如果请求出现错误,这里就会进入catch 中,如果发生错误的时候次数小于设定的3次,那么继续获取请求,如果到3次则休眠5分钟之后再次尝试。

分析doLongPolling逻辑

  • 首先组织请求数据变化的参数
image
  • 然后如果请求的数据真的有变化,则进入doFetchGroupConfig
image

doFetchGroupConfig逻辑分析

image

从图中我们可以看出,doLongPolling 问admin 拿到数据发生变化的ConfigGroup名称,然后bootstrap 拿着这个变化的groupname 发起/configs/fetch 问admin 要对应的数据

  • 获取变化的数据
image
  • 将数据变化的事件发送给关心这个数据的实例,如果refresh 成功 会拿到true
image
image

如果更新成功,这里就打印记录并直接返回,如果数据没有更新,那么在进行休眠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。

image

总结

到这里数据同步篇就全部完成了,我们最开始的websocket 入手,给他家整体的分析了数据同步框架的原理,然后分别按照 zk nacos http 三种方式 一次给他家讲解了各自的同步原理。其实zk 与 nacos 原理基本一样都是靠监听watcher 机制。设计最巧的是http 长轮询,接下来 我就会从调用链方面给他们分析soul的插件化调用链方面的知识。

参考

soul github
soul document

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容