Soul 源码阅读 05|Http 长轮询同步数据分析
http 长轮询机制如上所示,soul-web 网关请求 admin 的配置服务,读取超时时间为 90s,意味着网关层请求配置服务最多会等待 90s,这样便于 admin 配置服务及时响应变更数据,从而实现准实时推送。
http 请求到达 sou-admin 之后,并非立马响应数据,而是利用 Servlet3.0 的异步机制,异步响应数据。首先,将长轮询请求任务
LongPollingClient
扔到BlocingQueue
中,并且开启调度任务,60s 后执行,这样做的目的是 60s 后将该长轮询请求移除队列,即便是这段时间内没有发生配置数据变更。因为即便是没有配置变更,也得让网关知道,总不能让其干等吧,而且网关请求配置服务时,也有 90s 的超时时间
首先,我们知道 Http 长轮询同步数据是要由网关主动发起请求的,所以我们先来看网关部分的代码。
通过阅读 org.dromara.soul.sync.data.http.HttpSyncDataService
,我们可以得到以下信息:
配置数据被分成了 5 个组:APP_AUTH、PLUGIN、RULE、SELECTOR、META_DATA
首次运行时,会一次性获取所有组的配置,并创建一个线程池,去监听后续的数据变化
doLongPolling
中通过请求/configs/listener
可以获取到哪些组的配置数据发生了变化,然后会再通过doFetchGroupConfig
方法去请求数据发生变化的组的全部信息。
通过对网关代码的分析,可以知道网关是通过 soul-admin 提供的 /configs/listener
和 /configs/fetch
这两个接口对配置数据进行监听变化和获取,我们来看看 soul-admin 中这两个接口是如何处理的。
/configs/fetch 很简单,就是按组获取配置数据,然后返回结果
configs/listener
请求时配置数据有更改:立即返回发生更改的组信息
请求时配置数据无更改:阻塞并监听数据变化,直到数据有变化或达到超时时间
版权声明: 本文为 InfoQ 作者【哼干嘛】的原创文章。
原文链接:【http://xie.infoq.cn/article/45cbd19f83b59647c188e2e2b】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论