Soul网关源码解析(番外2):soul-bootstrap启动流程

Soul网关源码解析(番外2):soul-bootstrap启动流程

Soul网关源码解析(番外2):soul-bootstrap启动流程Debug Bootstrap的方法Soul-Bootstrap启动流程WebHandler的初始化Plugins的初始化SyncDataService初始化小结参考

Debug Bootstrap的方法

对于Bootstrap启动过程中,具体哪些类参与,分别干了什么,在刚开始我们是不知道如何入手的,这里介绍一种方式,能让我们较快的找到突破口,当然这种方式对阅读其他源码同样试用。

  1. 打开debug日志,这里研究soul,所以针对性的只开启了soul的debug,其他并未开启(小声的告诉你,其他开启的话,打的真的有点多)

    logging:
        level:
            root: info
            org.springframework.boot: info
            org.apache.ibatis: info
            org.dromara.soul.bonuspoint: debug
            org.dromara.soul.lottery: debug
            org.dromara.soul: debug
  2. 在日志中寻找关键类,比如下方的SoulConfiguration和WebsocketSyncDataConfiguration,(发现开启debug并没有多打一条,翻车举例)

    ...
    2021-01-19 10:21:37.638  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[global] [org.dromara.soul.plugin.global.GlobalPlugin]
    2021-01-19 10:21:37.639  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[sign] [org.dromara.soul.plugin.sign.SignPlugin]
    2021-01-19 10:21:37.639  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[waf] [org.dromara.soul.plugin.waf.WafPlugin]
    2021-01-19 10:21:37.639  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[rate_limiter] [org.dromara.soul.plugin.ratelimiter.RateLimiterPlugin]
    2021-01-19 10:21:37.639  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[hystrix] [org.dromara.soul.plugin.hystrix.HystrixPlugin]
    2021-01-19 10:21:37.640  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[resilience4j] [org.dromara.soul.plugin.resilience4j.Resilience4JPlugin]
    2021-01-19 10:21:37.640  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[divide] [org.dromara.soul.plugin.divide.DividePlugin]
    2021-01-19 10:21:37.640  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[webClient] [org.dromara.soul.plugin.httpclient.WebClientPlugin]
    2021-01-19 10:21:37.640  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[divide] [org.dromara.soul.plugin.divide.websocket.WebSocketPlugin]
    2021-01-19 10:21:37.640  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[alibaba-dubbo-body-param] [org.dromara.soul.plugin.alibaba.dubbo.param.BodyParamPlugin]
    2021-01-19 10:21:37.641  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[dubbo] [org.dromara.soul.plugin.alibaba.dubbo.AlibabaDubboPlugin]
    2021-01-19 10:21:37.641  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[monitor] [org.dromara.soul.plugin.monitor.MonitorPlugin]
    2021-01-19 10:21:37.641  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[response] [org.dromara.soul.plugin.alibaba.dubbo.response.DubboResponsePlugin]
    2021-01-19 10:21:37.641  INFO 13204 --- [           main] o.d.s.w.configuration.SoulConfiguration  : load plugin:[response] [org.dromara.soul.plugin.httpclient.response.WebClientResponsePlugin]
    2021-01-19 10:21:38.659  INFO 13204 --- [           main] b.s.s.d.w.WebsocketSyncDataConfiguration : you use websocket sync soul data.......
    2021-01-19 10:21:39.577  INFO 13204 --- [           main] o.d.s.p.s.d.w.WebsocketSyncDataService   : websocket connection is successful.....
    ...
  3. 知道筛选出来的类,疯狂打断点,并加入输入语句,比如log.info()或者System.out.println(),这里一个是从日志信息找到输出打印的位置;另一个是猜测,猜测,猜测,重要的事情说三遍,凡是看着new操作,handler啥的,打上断点标记,错杀也不要放过。另外如果熟悉spring的,那一定会注意@Import,@Bean,@ConditionalXxx这类注解,构建时一定会将关联的类做些处理,那么这些类也会执行它的构造函数等。

  1. 在文档中记录执行的类与方法,因为上面的操作,往往一次是没办法完整找出启动初始化过程,需要多次的加日志,打断点,反复几次更新记录的文档,慢慢就熟悉了启动的执行过程。比方如下方式记录(学习萧朋友的格式)

    #GlobalPluginConfiguration
        @Bean
        @ConditionalOnMissingBean(value = SoulContextBuilder.class, search = SearchStrategy.ALL)
        public SoulContextBuilder soulContextBuilder() {
            return new DefaultSoulContextBuilder();
        }

Soul-Bootstrap启动流程

完整的Soul-Bootstrap启动流程如下时序图所示,当然这里还是有些地方是被省略和合并的,完整的太长了,下面分块介绍吧。

WebHandler的初始化

它的Bean在构建时,会先初始化入参对象,入参对象为ObjectProvider<List<SoulPlugin>> plugins,这里利用了Spring Bean容器,它会将所有SoulPlugin类型的Bean都初始化并放入上述List中,那么这些Plugin又是在哪里注入到Spring Bean容器的?

Plugins的初始化

每个Plugin都一个XxxPluginConfiguration类,这个类里@Bean注解就保证了所有Plugin对象注入到Spring Bean容器。同时,有些Plugin构造时,需要的参数,一般的都会在这个Configuration类中@Bean注入进去。比如下面

    @Bean
    public SoulPlugin globalPlugin(final SoulContextBuilder soulContextBuilder) {
        System.out.println("构建GlobalPluginConfiguration.GlobalPlugin");
        return new GlobalPlugin(soulContextBuilder);
    }
​
    @Bean
    @ConditionalOnMissingBean(value = SoulContextBuilder.class, search = SearchStrategy.ALL)
    public SoulContextBuilder soulContextBuilder() {
        System.out.println("构建GlobalPluginConfiguration.SoulContextBuilder");
        return new DefaultSoulContextBuilder();
    }

SyncDataService初始化

Bootstrap在启动时,会与soul-admin服务端进行数据同步,这里通过WebSocketClient对象进行处理,通过订阅插件数据,选择器数据,规则数据,认证数据以及元数据来感知soul-admin这五类数据的变化,同时会将这些数据缓存到内存中,以便高效的使用。

这里注意,在启动时插件数据是一次全量的数据更新。

小结

本小结以如何debug Soul Bootstrap模块开始,讲述了一般的代码流程梳理方式,接着展示了一个精简版的bootstrap启动时序图,然后着重介绍了WebHandler,Plugins以及SyncDataService的初始化,自此结束。希望能帮到你,初识soul这样一个极致性能的网关项目。

参考

Soul 官网

猜你喜欢

转载自blog.csdn.net/S_powerStone/article/details/113094255
今日推荐