概述
本文主要分析soul中SoulWebHandler
的源码。该类实现了webHandler接口,替代了webFlux默认的DispatcherHandler
负责全部流量的处理。可以说SoulWebHandler
是soul处理流量的入口,体现了soul实现网关的核心思路。剧透核心思路就是挨个调用启动的插件,遍历插件配置,看流量是否匹配,如果匹配则根据配置执行插件逻辑。
插件大体可以分为路由插件和业务插件,路由插件负责将请求转发到正确的下游服务上,业务插件负责执行网关的通用业务逻辑,比如限流、鉴权等。流量必须在路由插件中配置才能正确转发,而业务插件不是必配的。每个插件都是单独针对全部流量配置筛选和使用规则,所以配置可以很灵活。
WebHttpHandlerBuilder
WebHandler定义了Web请求必要一些处理行为,官方解释如下:
Contract to handle a web request.
负责处理web请求
Use HttpWebHandlerAdapter to adapt a WebHandler to an HttpHandler.
使用HttpWebHandlerAdapter将WebHandler装饰为一个HttpHandler
The WebHttpHandlerBuilder provides a convenient way to do that while also optionally configuring one or more filters and/or exception handlers.
WebHttpHandlerBuilder提供了一种方便的方法,将WebHandler装饰为1个HttpHandler,同时还可以选择配置一个或多个过滤器和/或异常处理程序。
可以看出主要是WebHttpHandlerBuilder在使用WebHandler,它的build方法构造出了HttpHandler——用于处理Http请求,需要依托于webHandler。其核心源码如下:
1 | /* |
可以看出SoulWebHandler
在WebHttpHandlerBuilder
里和WebFilter
以及WebExceptionHandler
构成了1个处理链WebHandler,然后再通过装饰器变成HttpHandler提供http请求处理逻辑。这里取WebHandler是通过bean的名字取的,因此只要设置好名字SoulWebHandler就成功替代了dispatchWebHandler。
HttpWebHandlerAdapter
HttpWebHandlerAdapter
主要功能是使用WebHandler实现HttpHandler接口。核心处理逻辑简短说就是把HttpHandler接口入参request
和response
封装成WebHandler用ServerWebExchange,然后调WebHandler的处理方法。具体如下:
1 |
|
SoulWebHandler
直接上核心代码:
1 | public final class SoulWebHandler implements WebHandler { |
soulWebFilter的逻辑很简单,核心就是请求走一遍插件调用链,即调用每个插件的execute
方法,该方法需要ServerWebExchange
作为传参,这个参数就是WebFilter::handler的入参数。