概述
从今天admin端观察一下数据同步。主要看admin是在pluginData数据变更时是如何通知soul网关更新pluginData的数据。
WebsocketCollector
上一篇文章我们聊到如果使用websocket同步数据的方式,soul网关会在启动时连接soul-admin的”ws://adminIP:9095/websocket”。跟踪看到了soul-admin的WebsocketCollector
,从名字大胆猜测是websocket相关的collector
层,源码如下:
1 | // 地址与服务端注册地址相吻合 |
通过上述代码我们可以看出,通常是admin向连接的soul网关发送数据,发送数据的时机是静态send方法被调用时,发送的方式是遍历内存中的所有的session将消息发送他们,每个session都代表1个存活的soul网关。下面我们来着重研究下admin在什么时候会调用send方法以及MYSELF这个type代表的意义。
DataChangedListener
首先看send方法调用的地方,非常的集中,是在一个叫WebsocketDataChangedListener
的类中,该类继承了DataChangedListener
,该接口主要的方式从名字上看,意思是当Plugin、selector、rule、AppAuth、MetaData相关数据发生变化时触发发送数据的逻辑而WebsocketDataChangedListener是使用websocket发送数据的实现。在该实现中最后都是调用的WebsocketCollector::send
方法。那么又是什么时候WebsocketDataChangedListener
被调用的呢?
1 | public class WebsocketDataChangedListener implements DataChangedListener { |
继续跟踪发现soul-admin在项目启动时由DataSyncConfiguration
负责将WebsocketDataChangedListener
初始化并把它注册到spring容器中。那么又是哪个类会使用到DataChangedListener呢?根据我全目录下搜索DataChangedListener字符串,发言使用DataChangedListener主要是DataChangedEventDispatcher
这个类。
DataChangedEventDispatcher
这个类先大胆猜测这个类的主要功能是当有配置数据变化事件发生时的调度程序。直接上源码:
1 |
|
很明显ApplicationListener
是spring某种事件监听的实现,当关注的事件发生时,就会调用DataChangedEventDispatcher
的onApplicationEvent方法,而该方法就是调用所有DataChangedListener
的相关方法,实现数据发送到soul网关的逻辑。、
ApplicationListener
通过翻阅资料我们发现,ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成ApplicationContext的事件机制。如果容器中存在ApplicationListener的Bean,当ApplicationContext调用publishEvent方法时,对应的Bean会被触发。这一过程是典型的观察者模式的实现。在soul中DataChangedEventDispatcher
就是DataChangedEvent
事件的观察,DataChangedEvent
不出所料的继承了ApplicationEvent
。
再接着看就很简单了,以metaDataService
中的delete
方法来举例,该方法在接收到POST /meta-data/batchDeleted
时被调用,源码如下:
1 | "metaDataService") ( |
总结
soul-admin中使用spring的事件机制来发布各配置数据的变更事件,由DataChangedEventDispatcher
来统一处理这些事件,处理方式是调用所有DataChangedListener
的实现,因为可能存在有的soul网关是通过http长轮询连接到soul-admin而有些是通过websocket。这些DataChangedListener负责使用对应的方法将数据发送给使用该方式同步数据的soul网关。