大概一年前,我接到了一个网管系统的API管理后台的维护工作,当时那个系统的架构是这样子的:
- 1.管理员在管理后台上更新数据
- 2.数据都存储到DB里面
- 3.crontab定时任务从DB里面读取表数据,组成某种格式,写入配置文件,存到磁盘
- 4.网关系统发现磁盘上的配置文件的更新时间有变化,则重新载入配置文件到内存
这个老系统使用crontab的方式定时从数据库里读取数据,肯定是不够实时的。而且还和管理后台读了同一个数据库,有一定的耦合。
今天继续来进行soul网关源码的学习,看下soul网关的数据同步机制。
首先,先看官方文档里面关于数据同步的相关介绍,找到了数据同步原理和数据同步策略的介绍。
快速浏览了一下官方文档,发现soul网关2.x版本支持通过websocket、zookeeper、http长轮询、nacos四种同步方式,其中websocket是默认的方式。
WebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。各大浏览器都已经支持WebSocket,最贴近我们生活的就是聊天应用。聊天应用不用http的原因是http只能由客户端发起请求,要获取最新数据的话,只能起一个定时任务来轮询,但是轮询的效率低,非常浪费资源,聊天应用使用websocket就可以实时收到别人发过来的消息了。
本文主要学习一下websocket同步方式。看到官方文档里面对websocket的介绍:
websocket 和 zookeeper 机制有点类似,将网关与 admin 建立好 websocket 连接时,admin 会推送一次全量数据,后续如果配置数据发生变更,则将增量数据通过 websocket 主动推送给 soul-web
使用websocket同步的时候,特别要注意断线重连,也叫保持心跳。soul使用java-websocket 这个第三方库来进行websocket连接。
soul网关的源码里面这么多代码,一个个看过去是不行的,太浪费时间,而且很容易就放弃了。我们要找一个切入点。
soul使用java-websocket 这个第三方库来进行websocket连接
这个官方文档里面的信息,就是我本次的切入点。
首先在IDEA里面全局搜索一下java-websocket
这个关键字,发现在主pom和soul-sync-data-center这个子模块的pom里面出现了。在第一篇笔记里面已经对soul源码的模块的大致作用分析了一下,soul-sync-data-center这个模块主要是负责数据同步的。
从soul-sync-data-center
里面找到websocket相应的位置,看到里面文件不多,可以挨个点开快速看一下
其中最主要的文件是WebsocketSyncDataService
,这个里面进行了websocket连接和断线重连(30s)。与官方文档上的示例代码有一点出入,应该是官方文档更新不及时。不过变动不大,并不影响我们继续看下去。
可以看到使用了