承接上文,上文说到 Http 长轮询的概念和 Soul 上的解决思路,那么这节从源码层面讲解 Http 的配置和同步原理的初探。
配置
admin 端
将 application.yml 配置文件中的 soul.sync.http.enabled 置为 true
,注释掉其他的同步方式。
soul:
sync:
http:
enabled: true
启动 admin,观察日志,启动成功。
2021-01-28 23:38:10.031 INFO 42195 --- [ main] o.dromara.soul.admin.SoulAdminBootstrap : Started SoulAdminBootstrap in 9.65 seconds (JVM running for 10.205)
2021
2021-01-28 23:38:14.726 INFO 42195 --- [0.0-9095-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-01-28 23:38:14.726 INFO 42195 --- [0.0-9095-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-01-28 23:38:14.741 INFO 42195 --- [0.0-9095-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 15 ms
bootstrap 端
将 application-local.yml 中的 soul.sync.http.url 打开,注释掉其他方式。如下所示:
soul:
sync:
http:
url: http://localhost:9095
启动 bootstrap 端,观察日志,启动成功。
2021-01-28 23:38:14.196 INFO 42202 --- [ main] .s.s.b.s.s.d.h.HttpSyncDataConfiguration : you use http long pull sync soul data
2021-01-28 23:38:14.446 INFO 42202 --- [ main] o.d.s.s.data.http.HttpSyncDataService : request configs: [http://localhost:9095/configs/fetch?groupKeys=APP_AUTH&groupKeys=PLUGIN&groupKeys=RULE&groupKeys=SELECTOR&groupKeys=META_DATA]
2021-01-28 23:38:14.894 INFO 42202 --- [ main] o.d.s.s.data.http.HttpSyncDataService : get latest configs: ...
admin 启动分析
这块启动时分成了两个部分,一个是 Soul 本身注册的 HttpLongPollingDataChangedListener , 这个类中干了两件事情:
- LongPollingClient 的 ArrayBlockingQueue
- ScheduledThreadPoolExecutor 的线程池
- HttpSyncProperties 属性配置
第二个是 Bean 初识化的时候,先会更新一遍缓存, 然后启动一个延时队列,scheduleWithFixedDelay。
public final void afterPropertiesSet() {
updateAppAuthCache();
updatePluginCache();
updateRuleCache();
updateSelectorCache();
updateMetaDataCache();
afterInitialize();
}
afterInitialize 调用 scheduleWithFixedDelay 中的 refreshLocalCache 中会将所有的数据先缓存起来,也就是说第一次同步可能会使用全量同步的方式。这个我们后续得再验证。
protected void updateAppAuthCache() {
this.updateCache(ConfigGroupEnum.APP_AUTH, appAuthService.listAll());
}
总结
- 主要 http 的配置启动时做了 admin 端做了什么
- 下文我们继续讨论 bootstrap 启动后 admin 端又做了哪些
- 要想看懂这块的源码,还得知道 ArrayBlockingQueue 的概念和基本原理,ScheduledThreadPoolExecutor 的概念和常用的方法,以及他俩的区别。