Soul源码总结-01-22

  • 启动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长轮询流程图,再带着问题看代码会事半功倍。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值