我们在 soul-admin的数据同步流程中分析了admin的数据同步流程,这篇我们来看看soul-bootstrap的数据同步流程

启动 soul-bootstrap

打印如下日志,我们同样从日志着手来分析。

  • 日志中打印了 you use websocket sync soul data
  • 我们根据日志,找到WebsocketSyncDataConfiguration这个类
2021-01-19 21:19:48.461  INFO 20364 --- [           main] b.s.s.d.w.WebsocketSyncDataConfiguration : you use websocket sync soul data.......
2021-01-19 21:19:48.526  INFO 20364 --- [           main] o.d.s.p.s.d.w.WebsocketSyncDataService   : websocket connection is successful.....
2021-01-19 21:19:48.617  INFO 20364 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 2 endpoint(s) beneath base path '/actuator'
2021-01-19 21:19:49.202  INFO 20364 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 9195
2021-01-19 21:19:49.205  INFO 20364 --- [           main] o.d.s.b.SoulBootstrapApplication         : Started SoulBootstrapApplication in 13.767 seconds (JVM running for 14.489)

分析WebsocketSyncDataConfiguration

  • 这个类的代码非常简单,从名字上看出来是一个配置类。
  • 下面这一行表示 前缀(prefix是soul.sync.websocket的属性),配置的名字是urls。才会来加载这个类。对应配置文件中的属性
soul :sync:websocket :urls: ws://localhost:9095/websocket
@ConditionalOnProperty(prefix = "soul.sync.websocket", name = "urls")
  • websocketSyncDataService方法里,会加载一个WebsocketSyncDataService类。

分析WebsocketSyncDataService

  • 初步观察 WebsocketSyncDataService这个类。
  • 发现构造方法里的意图是根据url的数量,创建了对应数量的websocket 客户端,以及对应数量的线程池。线程池定时检测websocket客户端的连接状态。
  • 同时WebsocketSyncDataService实现了AutoCloseable接口,来进行资源的管理

分析SoulWebsocketClient

  • 点击WebSocketClient抽象类,然后查看抽象类的实现类。
  • 发现SoulWebsocketClient实现了WebSocketClient
  • onMessage是收到websocket消息之后调用的方法。
   @Overridepublic void onMessage(final String result) {handleResult(result);}
  • handlerResult方法是真正处理收到的信息的方法
 private void handleResult(final String result) {WebsocketData websocketData = GsonUtils.getInstance().fromJson(result, WebsocketData.class);ConfigGroupEnum groupEnum = ConfigGroupEnum.acquireByName(websocketData.getGroupType());String eventType = websocketData.getEventType();String json = GsonUtils.getInstance().toJson(websocketData.getData());websocketDataHandler.executor(groupEnum, json, eventType);}
  • ConfigGroupEnum里面有五组config 分别是

    • APP_AUTH
    • PLUGIN 插件
    • SELECTOR 选择器
    • RULE 规则
    • META_DATA 元数据
  • 最后一行,websocketDataHandler.executor(groupEnum, json, eventType) ,是核心逻辑
  • WebsocketDataHandler类里面的excutor方法如下
 public void executor(final ConfigGroupEnum type, final String json, final String eventType) {ENUM_MAP.get(type).handle(json, eventType);}
  • 这里的handle方法,是AbstractDataHandlerhandle方法

分析AbstractDataHandler的handle方法

  • 事件类型(DataEventTypeEnum)有五种,分别是增删改 、刷新和Myself。REFRESH和Myself都是走刷新的逻辑

    • DELETE
    • CREATE
    • UPDATE
    • REFRESH
    • MYSELF
  • handler方法分别调用doRefreshdoUpdatedoDelete方法
  • doRefresh方法为例,PluginDataHandlerdoRefresh最终调用了
    PluginDataSubscriberonSubscribe方法。
  • PluginDataSubscriber的实现类是CommonPluginDataSubscriber

以CommonPluginDataSubscriber为例,

  • onSubscribe方法调用subscribeDataHandler
  • 最终操作的是BaseDataCache
    private <T> void subscribeDataHandler(final T classData, final DataEventTypeEnum dataType) {Optional.ofNullable(classData).ifPresent(data -> {if (data instanceof PluginData) {PluginData pluginData = (PluginData) data;if (dataType == DataEventTypeEnum.UPDATE) {BaseDataCache.getInstance().cachePluginData(pluginData);Optional.ofNullable(handlerMap.get(pluginData.getName())).ifPresent(handler -> handler.handlerPlugin(pluginData));} else if (dataType == DataEventTypeEnum.DELETE) {BaseDataCache.getInstance().removePluginData(pluginData);Optional.ofNullable(handlerMap.get(pluginData.getName())).ifPresent(handler -> handler.removePlugin(pluginData));}} else if (data instanceof SelectorData) {SelectorData selectorData = (SelectorData) data;if (dataType == DataEventTypeEnum.UPDATE) {BaseDataCache.getInstance().cacheSelectData(selectorData);Optional.ofNullable(handlerMap.get(selectorData.getPluginName())).ifPresent(handler -> handler.handlerSelector(selectorData));} else if (dataType == DataEventTypeEnum.DELETE) {BaseDataCache.getInstance().removeSelectData(selectorData);Optional.ofNullable(handlerMap.get(selectorData.getPluginName())).ifPresent(handler -> handler.removeSelector(selectorData));}} else if (data instanceof RuleData) {RuleData ruleData = (RuleData) data;if (dataType == DataEventTypeEnum.UPDATE) {BaseDataCache.getInstance().cacheRuleData(ruleData);Optional.ofNullable(handlerMap.get(ruleData.getPluginName())).ifPresent(handler -> handler.handlerRule(ruleData));} else if (dataType == DataEventTypeEnum.DELETE) {BaseDataCache.getInstance().removeRuleData(ruleData);Optional.ofNullable(handlerMap.get(ruleData.getPluginName())).ifPresent(handler -> handler.removeRule(ruleData));}}});}

分析BaseDataCache

  • BaseDataCache里面有三个ConcurrentMap分别存储了PLUGIN、SELECTOR、RULE的信息
  • 也就是说对插件、选择器、规则的操作,最终反映到内存中是对这个BaseDataCache中三个ConcurrentMap的操作

soul从入门到进阶05——soul-bootstrap数据同步流程相关推荐

  1. soul从入门到进阶02——soul-admin的数据同步流程

    soul-admin 的数据同步流程分析 在上一篇文章中我们提到,根据官网的介绍数据配置流程 soul网关的配置数据在修改后立即同步到soul gateway 中,不需要重启,性能高,生效快. 这个特 ...

  2. soul从入门到进阶01——soul网关初体验

    笔者的环境 MacBook Pro 处理器 2.8 GHz 四核Intel Core i7 内存 16 GB 1600 MHz DDR3 其他环境准备 maven.jdk.git 概要简介 本篇文章主 ...

  3. soul从入门到进阶04——压测soul网关

    这篇文章的主题是对soul网关进行压测 笔者的环境 MacBook Pro 处理器 2.8 GHz 四核Intel Core i7 内存 16 GB 1600 MHz DDR3 1. 压测soul-e ...

  4. 新手入门深度学习 | 2-4:时间序列数据建模流程示例

    文章目录 一.准备数据 1. 导入数据 2. 数据预处理 3. 建立时间戳函数 二.建构模型 三.训练模型 四.结果分析

  5. 新手入门深度学习 | 2-3:文本数据建模流程示例

    文章目录 一.准备数据 1. 导入数据 2. 数据分析 二.数据预处理 三.构建模型 四.情感预测

  6. 新手入门深度学习 | 2-1:图像数据建模流程示例

    文章目录 一.准备数据 1. 导入数据 2 配置数据集 3. 数据可视化 二.定义模型 三.训练模型 四.评估模型 1. 混淆矩阵 2. 指标评估 五.保存及加载模型 六.模型预测

  7. 【Python基础】Matplotlib 实操干货,38个案例带你从入门到进阶!

    译文出品:Python数据之道 原文作者:Rizky Maulana Nurhidayat 翻译:Lemon Matplotlib 实操干货, 38个案例带你从入门到进阶! 「Python数据之道」注 ...

  8. soul网关mysql8_深度解析 Soul 网关——数据同步

    引子 从官网 clone 代码下来后,依次启动 soul-admin.soul-bootstrap 和 soul-examples-http 模块,启动成功后查看 soul-admin 会发现 sou ...

  9. python flask快速入门与进阶 百度云_Python Flask快速入门与进阶

    课程目录 1-1 Python Flask快速入门与进阶.mp4 2-1 windows环境安装开发环境 (上).mp4 2-2 windows环境安装开发环境 (下).mp4 2-3 配置开发环境. ...

最新文章

  1. android 图片加载 软引用_Android 解决图片大量下载:软引用必须懂4点
  2. 使用迭代器从map或vector中删除元素
  3. Android绑定多个aidl,android aidl 多`module`版的实现
  4. python如何只保留数字_雷军透露小米或只保留数字、MIX和CC系列 官宣视频首度曝光小米CC...
  5. Non-interger Area 分类讨论 奇偶 取模 牛客练习赛95
  6. 不爱沟通的人可以做产品经理嘛?
  7. Magento: 在客户账户中添加自定义链接 My Account Add Link
  8. MongoDB运行状态、性能监控,分析
  9. AJAX实现导航式多条件搜索
  10. 超级好用的KeyBoard WPF软键盘
  11. 工程导论-----创造力
  12. 【python+selenium】保留浏览器的自定义设置,不恢复浏览器默认设置
  13. 中国人民银行招聘计算机考什么,求中国人民银行招聘计算机专业人员的考试题。...
  14. 【高等数学】第 2 讲 两个重要的极限定理
  15. 80004005错误代码_Win7系统提示0X80004005错误代码怎样解决 Win7系统错误代码0x80004005的解决办法...
  16. 对于Java的MyBatis的入门
  17. 龙威ol服务器维护是什么意思,《龙威OL》六大职业定位介绍
  18. Android 小米全面屏手势底部虚拟按键的适配
  19. 树莓派4B从开箱到连接电脑(超级小白)
  20. 听说高盛集体抗议 996 ,我们已经连 955 都不要了

热门文章

  1. Web项目部署到TongWeb的注意事项,TongWeb踩过的坑
  2. macbook如何使用visual studio code进行c语言编程
  3. 大数据交易研究_学术著作 | 基于电商平台大数据的特征价格指数研究——统计研究...
  4. Shell - timeout命令
  5. 跟着Cell学作图|9.PPI分析(GeNets数据库)
  6. 烤仔建工×MetaEstate×MetaCat | 明天来元宇宙过感恩节!
  7. 仿生多足机器人的发展和落地
  8. ROS2机器人笔记20-12-04
  9. 优化 window 命令行使用体验
  10. 2016下半年计算机水平模拟考试系统,2016下半年计算机等级考试试题及答案