soul从入门到进阶05——soul-bootstrap数据同步流程
我们在 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方法,是
AbstractDataHandler
的handle
方法
分析AbstractDataHandler的handle方法
- 事件类型(DataEventTypeEnum)有五种,分别是增删改 、刷新和Myself。REFRESH和Myself都是走刷新的逻辑
- DELETE
- CREATE
- UPDATE
- REFRESH
- MYSELF
handler
方法分别调用doRefresh
、doUpdate
、doDelete
方法- 以
doRefresh
方法为例,PluginDataHandler
的doRefresh
最终调用了
PluginDataSubscriber
的onSubscribe
方法。 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数据同步流程相关推荐
- soul从入门到进阶02——soul-admin的数据同步流程
soul-admin 的数据同步流程分析 在上一篇文章中我们提到,根据官网的介绍数据配置流程 soul网关的配置数据在修改后立即同步到soul gateway 中,不需要重启,性能高,生效快. 这个特 ...
- soul从入门到进阶01——soul网关初体验
笔者的环境 MacBook Pro 处理器 2.8 GHz 四核Intel Core i7 内存 16 GB 1600 MHz DDR3 其他环境准备 maven.jdk.git 概要简介 本篇文章主 ...
- soul从入门到进阶04——压测soul网关
这篇文章的主题是对soul网关进行压测 笔者的环境 MacBook Pro 处理器 2.8 GHz 四核Intel Core i7 内存 16 GB 1600 MHz DDR3 1. 压测soul-e ...
- 新手入门深度学习 | 2-4:时间序列数据建模流程示例
文章目录 一.准备数据 1. 导入数据 2. 数据预处理 3. 建立时间戳函数 二.建构模型 三.训练模型 四.结果分析
- 新手入门深度学习 | 2-3:文本数据建模流程示例
文章目录 一.准备数据 1. 导入数据 2. 数据分析 二.数据预处理 三.构建模型 四.情感预测
- 新手入门深度学习 | 2-1:图像数据建模流程示例
文章目录 一.准备数据 1. 导入数据 2 配置数据集 3. 数据可视化 二.定义模型 三.训练模型 四.评估模型 1. 混淆矩阵 2. 指标评估 五.保存及加载模型 六.模型预测
- 【Python基础】Matplotlib 实操干货,38个案例带你从入门到进阶!
译文出品:Python数据之道 原文作者:Rizky Maulana Nurhidayat 翻译:Lemon Matplotlib 实操干货, 38个案例带你从入门到进阶! 「Python数据之道」注 ...
- soul网关mysql8_深度解析 Soul 网关——数据同步
引子 从官网 clone 代码下来后,依次启动 soul-admin.soul-bootstrap 和 soul-examples-http 模块,启动成功后查看 soul-admin 会发现 sou ...
- python flask快速入门与进阶 百度云_Python Flask快速入门与进阶
课程目录 1-1 Python Flask快速入门与进阶.mp4 2-1 windows环境安装开发环境 (上).mp4 2-2 windows环境安装开发环境 (下).mp4 2-3 配置开发环境. ...
最新文章
- android 图片加载 软引用_Android 解决图片大量下载:软引用必须懂4点
- 使用迭代器从map或vector中删除元素
- Android绑定多个aidl,android aidl 多`module`版的实现
- python如何只保留数字_雷军透露小米或只保留数字、MIX和CC系列 官宣视频首度曝光小米CC...
- Non-interger Area 分类讨论 奇偶 取模 牛客练习赛95
- 不爱沟通的人可以做产品经理嘛?
- Magento: 在客户账户中添加自定义链接 My Account Add Link
- MongoDB运行状态、性能监控,分析
- AJAX实现导航式多条件搜索
- 超级好用的KeyBoard WPF软键盘
- 工程导论-----创造力
- 【python+selenium】保留浏览器的自定义设置,不恢复浏览器默认设置
- 中国人民银行招聘计算机考什么,求中国人民银行招聘计算机专业人员的考试题。...
- 【高等数学】第 2 讲 两个重要的极限定理
- 80004005错误代码_Win7系统提示0X80004005错误代码怎样解决 Win7系统错误代码0x80004005的解决办法...
- 对于Java的MyBatis的入门
- 龙威ol服务器维护是什么意思,《龙威OL》六大职业定位介绍
- Android 小米全面屏手势底部虚拟按键的适配
- 树莓派4B从开箱到连接电脑(超级小白)
- 听说高盛集体抗议 996 ,我们已经连 955 都不要了
热门文章
- Web项目部署到TongWeb的注意事项,TongWeb踩过的坑
- macbook如何使用visual studio code进行c语言编程
- 大数据交易研究_学术著作 | 基于电商平台大数据的特征价格指数研究——统计研究...
- Shell - timeout命令
- 跟着Cell学作图|9.PPI分析(GeNets数据库)
- 烤仔建工×MetaEstate×MetaCat | 明天来元宇宙过感恩节!
- 仿生多足机器人的发展和落地
- ROS2机器人笔记20-12-04
- 优化 window 命令行使用体验
- 2016下半年计算机水平模拟考试系统,2016下半年计算机等级考试试题及答案