Soul网关源码分析-网关转发http服务总结
- 结合之前的学习关于soul网关和admin数据同步的知识,以http服务注册为例,探究soul-admin与soul网关服务节点数据变动的同步机制
- http服务注册时soul-admin与soul网关数据同步机制
HTTP服务注册时soul-admin与soul网关数据同步
回顾:
根据之前我们知道的http服务注册流程,其实是将准备注册的http服务通过@SoulSpringMvcClient
注解标注,在服务启动后由SpringMvcClientBeanPostProcessor
向soul-admin的/soul-client/springmvc-register
endpoint 发送POST请求,然后在soul-admin端通过soulClientRegisterService
注册springMVC
服务.
进一步探究
soul-admin是如何进一步处理要注册的http服务信息的?我们追踪进入SoulClientRegisterServiceImpl
这个实现类,在registerSpringMvc方法中不尽将selector和rule的信息本地持久化,并且将http服务节点的信息存放到后台缓存UpstreamCheckService
中。
我们继续追踪,进入到UpstreamCheckService
中,发现UPSTREAM_MAP
中作为缓存存放http服务节点相关信息。
至此在soul-admin端已经实现http服务节点信息的缓存处理,那么soul-admin又是如何与soul网关同步注册的http服务相关节点信息呢?如果我们仔细看SoulClientRegisterServiceImpl
会发现eventPublisher
发布数据变更的event
然后由DataChangedEventDispatcher:
来负责分发事件并且调用相应的listener方法来响应相关的event
通过打断点追踪,我们会发现会调用WebsocketDataChangedListener
来监听相应的数据变化,并且会调用WebsocketCollector
来维护websocket通信。
Soul网关处理数据更新
我们可以关注soul网关端的SoulWebsocketClient
会维持和soul-admin的websocket通信,并且调用websocketDataHandler
来根据相关的eventType选择不同的handler(PluginHandler, SelectorHandler, RuleDataHanlder等)来进行相应的处理。
我们可以理解webSocketDataHandler通过一系列链式调用WebSocketDataHandler-->AbstractDataHandler-->CommonPluginDataHandler-->DivideDataPluginDataHandler
最终调用handlerSelector
方法
在UpstreamCacheManager
中我们终于发现UPSTREAM_MAP
作为缓存存放着网关的 divide 插件服务节点信息
总结
soul网关结合了spring的publisher-subscriber
模式来进行服务节点信息的更新。稍后我会分析http服务下线后soul-admin与soul网关数据同步机制。