- 启动admin,与网关。 admin操作,使用http长轮询同步数据到网关
- 记录心得并总结
Soul admin与Soul网关的http长轮询(long polling)同步
在soul-admin
项目application.yml
文件中引入http长轮询相关的dataSync
策略:
soul:
sync:
http:
enabled: true
在soul-bootstrap
项目application.yml
文件中引入
soul:
sync:
http:
url : http://localhost:9095
不要忘记检查pom.xml
中是否加入相关依赖项
<!--soul data sync start use http-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-sync-data-http</artifactId>
<version>${project.version}</version>
</dependency>
启动soul-admin和soul-bootstrap项目,在soul-bootstrap控制台看到以下日志:
说明此时http长轮询同步机制建立成功.
源码追踪
soul网关http长轮询机制可以参考官网的图示以及说明: soul http long polling mechanism
Soul网关
首先我们先关注soul网关服务,在HttpSyncDataConfiguration
类中在项目启动时将HttpSyncDataService
的bean注入到ioc容器中
此时需要注意的是在注册这个bean之前需要依赖名字为httpConfig
的bean,该bean的注册需要读取application-local.yml
文件中相关http长轮询的配置, HttpConfig
的数据结构如下:
我们追踪进入HttpSyncDataService
类中查看,和WebSocketSyncDataService, ZookeeperSyncDataService
一样,该类实现了SyncDataService
接口,在构造器中实现了初始化一个okhttpclient
以及启动一个线程池,线程池用来提交HttpLongPollingTask
,关键代码如下:
此时soul网关会一直向soul-admin发出http长轮询请求,并且读取超时时间为 90s。soul-admin作为http server端处理每个请求的最大阻塞时间为60s, 具体可以看到HttpConstants
中的配置:
在HttpLongPollingTask
中会一直执行doLongPolling
方法, 该方法会先向server端post PLUGIN, SELECTOR, RULE,以及元数据信息,然后异步的fetch相关的group配置,关键代码如下:
Soul-admin
在ConfigController
中注入longPollingListener
, 每当有请求打到/configs/listener
端口时会开启长轮询
我们进入HttpLongPollingDataChangedListener
中,看到关键方法doLongPolling
:
从该方法可以看出,每次执行长轮询就会生成一个新的异步任务,然后将该异步任务提交到ScheduledExecutorService
线程池中,每隔60s执行一次。同时会将发来请求的client放入BlockingQueue
中,每隔60s从队列中移除过期的client并加入新的client:
总结
http长轮询作为soul-admin和soul网关之间的同步方式,通websocket和zookeeper
相比逻辑上处理会比较复杂,应该首先看明白官网的http长轮询流程图,再带着问题看代码会事半功倍。