概述
通过之前几篇文章的梳理,soul网关的主线逻辑已经清晰了,核心的功能逻辑在各个plugin中,流程逻辑在soul-web中。soul-web就是网关业务的实际执行者,下面我们来看看该项目中还有哪些我们没注意到的功能。
SoulConfig
根据soul-web的包,逐一往下看,首先看到的就是SoulConfig
1 |
|
有4个变量,首先是第一组filterTimeEnable和filterTime,这个两个变量共同控制的是一个TimeWebFilter,可以从soulConfiguration中看出来。
1 | public class SoulConfiguration { |
而timeWebFilter是一个已经删除的filter,原来好像控制的是请求时间不能和当前时间差太多。
1 |
|
下一个变量是fileMaxSize,这个变量是与soul.file.enabled
共同起作用的,当soul.file.enabled
为true时表示支持传输文件,而在支持文件的时候文件大小的上限是${fileMaxSize}mb。这些部分逻辑也是用webFilter实现的。并且也是在SoulConfiguration中注册的。
1 | public class FileSizeFilter implements WebFilter { |
最后1个参数是upstreamScheduledTime,猜测和定时更新配置有关,但是没到找调用该函数的地方,后面再补充。
HttpWebHandlerAdapter
之前我们提到过,在spring-webFlux中处理请求有一层是webServer将请求交个httpHandler,它接收接收ServerHttpRequest和ServerHttpResponse,然后构造成ServerWebExchange,交给webHandler来处理。在webFlux中,将httpHandler和webHandler串起来的是HttpWebHandlerAdapter
,它即同时实现了这两个接口,在httpHandler的逻辑中直接调用webHandler的handler。而他是由由WebHttpHandlerBuilder
构造的。HttpWebHandlerAdapter
实现了处理请求的全部外围逻辑。它包含了实际执行业务的soulWebHandler,所有的WebFilter,所有WebExceptionHandler(统一异常处理)以及可选的WebSessionManager(session管理器),ServerCodecConfigurer(在服务端扩展http读写的CodecConfigurer),LocaleContextResolver(提供国际化支持,通过设置系统的环境,根据运行环境使用不同的语言显示)。既然HttpWebHandlerAdapter
提供了这么多可扩展点,那么soul有没有使用呢?答案当然是有的,就在soul-web中。
webHandler
这里特别要注意webHandler和webFilter会一起构成HttpWebHandlerAdapter
,左右webFilter在soul中是可以使用的,并且soul也用了,刚才TimeWebFilter和FileSizeFilter就是很好的例子。那么soul还使用了哪些webFilter呢?在org.dromara.soul.web.filter
下我们发现还有跨域相关的CrossFilter
和webSocker参数处理相关的WebSocketParamFilter
。
CrossFilter
1 | // 跨域支持,就是加各种header |
WebSocketParamFilter
1 | // 验证 webSocket请求中httpheader是否完备 |
WebExceptionHandler
soul对WebExceptionHandler的实现是GlobalErrorHandler
,源码如下:
1 | // 这种错都是比较严重的,没有被捕获的意外错误 |
ForwardedRemoteAddressResolver
剩下soul-web中唯一看起来比较重要的就是实现了RemoteAddressResolver的ForwardedRemoteAddressResolver。他同样在SoulConfiguration中被实例化并委托给spring管理。功能是尝试从header中的 X-Forwarded-For 拿客户端的地址。
总结
总体来看soul的扩展都是围绕HttpWebHandlerAdapter提供的可扩展点展开的,而核心实现逻辑是使用换名字的小技巧将HttpWebHandlerAdapter默认使用的DispatcherHandler换为soulWebHandler来接管全部流量的。这也启发我们在扩展soul时不光可以写plugin来扩展,还可直接写webFilter等。