任务

启动admin,与网关。 admin操作,使用http长轮询同步数据到网关

http 长轮询

概念

http 长轮询机制如上所示,soul-web 网关请求 admin 的配置服务,读取超时时间为 90s,意味着网关层请求配置服务最多会等待 90s,这样便于 admin 配置服务及时响应变更数据,从而实现准实时推送。

http 请求到达 soul-admin 之后,并非立马响应数据,而是利用 Servlet3.0 的异步机制,异步响应数据。首先,将长轮询请求任务 LongPollingClient 扔到 BlocingQueue 中,并且开启调度任务,60s 后执行,这样做的目的是 60s 后将该长轮询请求移除队列,即便是这段时间内没有发生配置数据变更。因为即便是没有配置变更,也得让网关知道,总不能让其干等吧,而且网关请求配置服务时,也有 90s 的超时时间。

http 同步

soul-admin,配置 http 同步策略。

1
2
3
4
soul:
sync:
http:
enabled: true

网关,添加 http 同步依赖,配置 http 同步策略。

1
2
3
4
5
6
<!--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>
1
2
3
4
soul :
sync:
http:
url : http://localhost:9095

启动 http 的 example 注册 http 的服务。测试接口调用http://localhost:9195/http/test/findByUserId?userId=1,请求成功:{"userId":"1","userName":"hello world"}

测试 http 同步数据:

  1. 更新 divide 插件的 rule。查看数据同步的情况。
  2. admin 的日志:更新 rule 的缓存,并发送请求。
  3. 网关的日志:组配置(rule)更新,并更新 rule 的配置。

image.png

1
2
3
/*soul-admin 的日志*/
2021-01-25 00:22:24.848 INFO 17760 --- [0.0-9095-exec-3] o.d.s.a.l.AbstractDataChangedListener : update config cache[RULE], old: {group='RULE', md5='c2419914270383316b8770ef10fd8fa3', lastModifyTime=1611505161283}, updated: {group='RULE', md5='b50efb5bbd7264d34f3f495a70b86db9', lastModifyTime=1611505344848}
2021-01-25 00:22:24.848 INFO 17760 --- [-long-polling-1] a.l.h.HttpLongPollingDataChangedListener : send response with the changed group,ip=127.0.0.1, group=RULE, changeTime=1611505344848
1
2
3
4
/* 网关的日志 */
2021-01-25 00:22:24.849 INFO 21756 --- [-long-polling-1] o.d.s.s.data.http.HttpSyncDataService : Group config changed: [RULE]
2021-01-25 00:22:24.849 INFO 21756 --- [-long-polling-1] o.d.s.s.data.http.HttpSyncDataService : request configs: [http://localhost:9095/configs/fetch?groupKeys=RULE]
2021-01-25 00:22:24.854 INFO 21756 --- [-long-polling-1] o.d.s.s.d.h.refresh.AbstractDataRefresh : update RULE config: {"md5":"b50efb5bbd7264d34f3f495a70b86db9","lastModifyTime":1611505344848,"data":[{...]}

image.png

Link