概述
本文继续分析soul网关路由转发流程涉及的插件。路由转发是最小可行性网关最核心的功能。在soul中实现这个功能需要涉及4个插件,依次是:GlobalPlugin–> 路由插件 —> WebClientPlugin —> WebClientResponsePlugin。其中路由插件是一类插件,本文以spring-cloud Plugin为切入点介绍。
GlobalPlugin
作为插件处理链的第一环且全部流量都要经过的一环,globalPlugin插件实现的逻辑必定十分基础且通用并且关乎于后续插件的处理,废话不多说直接上代码:
1 | public class GlobalPlugin implements SoulPlugin { |
可以看出GlobalPlugin主要干的工作就是借助SoulContextBuilder用ServerWebExchange生成SoulContext,并将其存到ServerWebExchange的context
key下。
我们不纠结SoulContextBuilder
转化的具体逻辑,但是可以看看SoulContext
都存了什么,源码如下:
1 | public class SoulContext implements Serializable { |
可以看出以上这些变量是soul定义的上下文环境,部分变量根据下游服务不同有特殊处理需要注意,具体处理方式以DefaultSoulContextBuilder
的为准。
spring-cloud Plugin
spring-cloud插件的主要功是当下游服务是spring-cloud体系的服务时,保证请求能正常的请求到下游服务上,源码如下:
1 | public class SpringCloudPlugin extends AbstractSoulPlugin { |
可以看出spring-cloud插件也没做什么特殊的事情,主要就是用从注册中心找到合适的下游服务的URI地址,然后拼上其他信息形成实际要访问的URL,放在请求上下文的httpUrl key中。
和想象中的不太一样,我以为在此插件中就要访问后端服务了,我们继续找一下实际请求下游服务的地方
WebClientPlugin
看了下插件调用链,发现有个WebClientPlugin,大胆猜测这就是个webclient,用于请求实际服务。下面我们来看看源码:
1 | public class WebClientPlugin implements SoulPlugin { |
在WebClientPlugin
旁边还有个NettyHttpClientPlugin
,使用netty实现的http client,猜测可以通过配置可以启用netty的client。既然请求下游服务的插件找到了,那么顺便看看如何向上游服务回写结果的插件吧。
WebClientResponsePlugin
看了下插件调用链,发现有个WebClientResponsePlugin,大胆猜测这就是回写结果给请求方的插件,用于请求实际服务。下面我们来看源码:
1 | public class WebClientResponsePlugin implements SoulPlugin { |
在WebClientResponsePlugin
旁边同样也有个NettyClientResponsePlugin
,应该是和NettyHttpClientPlugin
成套配置的。核心逻辑基本相同,只不过组件从webflux的DefaultWebClient换成了reactor-netty。
总结
本文介绍了soul网关实现基础路由转发功能的全部插件,他们是:GlobalPlugin–> spring-cloud Plugin —> WebClientPlugin —> WebClientResponsePlugin ,且调用顺序如上。如果不考虑其他网关业务仅考虑路由转发功能的话,这些插件就足够了,这也是所有请求必走的主线流程。