概述
本文主要从源码的角度分析soul-bootstrap的启动。
pom.xml
从soul-bootstrap的pom文件中我们可以发现,我们的网关核心服务主要引用的包有:soul-spring-boot-starter-gateway
和soul-spring-boot-starter-plugin-XXX
,推断前者是soul网关服务的核心业务,后者是各个插件的实现。其中soul-spring-boot-starter-gateway
项目实质只是对soul-web
项目进行了一层spring引用的封装。而各个插件项目也是引用soul-plugin-xxx
项目并进行了spring封装,即实例化相关SoulPlugin
让spring容器接管。方式是通过spring.factories
文件配置一个被@Configuration
注解的配置类。下面以RateLimiter插件为例看主要代码:
spring.factories
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
RateLimiterPluginConfiguration
1 |
|
从这部分代码可以发现,如果想自定义插件,大体也至少需要这两部分,一个是插件处理类,一个是处理动态配置的类。
soul-web
从soul-bootstrap中我们猜测soul-web实现了soul的核心逻辑,下面我们来重点深入了解一下。首先还是从spring.factories
入手看看都加载了哪些类到spring容器中。spring.factories
内容如下:
1 | # Auto Configure |
SoulLogo
SoulLogo
实现spirng的ApplcationListener
接口监听ApplicationEnvironmentPreparedEvent
事件,即在SpringApplication启动时环境刚准备好时触发。结合类名可以推断出实现的功能是在项目启动时打印logo,经测试,这种配置方式打印的logo比spring的还靠前。发散一下,该种类可以用于启动时的环境的检测或修改一些配置。
SoulConfiguration
今天分析的重点,源码如下,注释大多为初步猜测可能不对:
1 |
|
总得来说,最重要的config里实例化了DispatcherHandler
,SoulWebHandler
以及很多spring的webFilter实现一些特定过滤逻辑。下面说下DispatcherHandler
以及Webhandler
。
DispatcherHandler
通过资料查询,发现DispatcherHandler是spring webFlux的核心,他负责处理全部请求,主要分3步,1.找到负责该请求的handler;2.执行handler得到result,3.处理result。官方注解如下:
1 | Central dispatcher for HTTP request handlers/controllers. |
DisDispatcherHandler 重要处理方法——handle。
1 |
|
但是请注意!!!由于在配置文件中,DispatcherHandler改了bean的名字,将soulWebHandler命名为webHandler,所以实际上webFlux没有用默认的DispatcherHandler,而是用的soulWebHandler!!!。这一点可以通过调用请求时debug DefaultWebFilterChain
,可以发现它持有的webHandler不是DispatcherHandler而是soulWebHandler。也是因为这个操作soul接管了所有请求流量。
所以SoulWebHandler是等同于DispatcherHandler一样重要,负责请求处理的核心代码!
SoulWebHandler
非常重要下次再讲。