soul 网关(十三):数据同步方式之 Http(二)

承接上文,上文说到 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 , 这个类中干了两件事情:

    1. LongPollingClient 的 ArrayBlockingQueue
    1. ScheduledThreadPoolExecutor 的线程池
    1. 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());
    }

总结

  1. 主要 http 的配置启动时做了 admin 端做了什么
  2. 下文我们继续讨论 bootstrap 启动后 admin 端又做了哪些
  3. 要想看懂这块的源码,还得知道 ArrayBlockingQueue 的概念和基本原理,ScheduledThreadPoolExecutor 的概念和常用的方法,以及他俩的区别。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容