Soul网关源码解析(番外2):soul-bootstrap启动流程
Soul网关源码解析(番外2):soul-bootstrap启动流程Debug Bootstrap的方法Soul-Bootstrap启动流程WebHandler的初始化Plugins的初始化SyncDataService初始化小结参考
Debug Bootstrap的方法
对于Bootstrap启动过程中,具体哪些类参与,分别干了什么,在刚开始我们是不知道如何入手的,这里介绍一种方式,能让我们较快的找到突破口,当然这种方式对阅读其他源码同样试用。
-
打开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
-
在日志中寻找关键类,比如下方的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..... ...
-
知道筛选出来的类,疯狂打断点,并加入输入语句,比如log.info()或者System.out.println(),这里一个是从日志信息找到输出打印的位置;另一个是猜测,猜测,猜测,重要的事情说三遍,凡是看着new操作,handler啥的,打上断点标记,错杀也不要放过。另外如果熟悉spring的,那一定会注意@Import,@Bean,@ConditionalXxx这类注解,构建时一定会将关联的类做些处理,那么这些类也会执行它的构造函数等。
-
在文档中记录执行的类与方法,因为上面的操作,往往一次是没办法完整找出启动初始化过程,需要多次的加日志,打断点,反复几次更新记录的文档,慢慢就熟悉了启动的执行过程。比方如下方式记录(学习萧朋友的格式)
#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这样一个极致性能的网关项目。