soul网关学习day04

今日目标

分析请求转发流程

 

请求处理流程

前一篇初步分析soul如何对不同的请求进行转发,找到了类AbstractSoulPlugin下面的execute方法,其中的代码看起来是使用了模板方法(逻辑最后执行doExecute方法,而doExecute方法是抽象方法,具体实现在子类里)

 

 

各插件实现类与AbstractSoulPlugin关系如下,所有插件都实现了doExecute方法

 

那么在转发请求的过程中,如何触发插件执行逻辑呢,通过查找对execute方法的调用,找到soul-web模块下SoulWebHandler的内部类DefaultSoulPluginChain中的execute方法

如上图,execute方法中从plugins中获取插件对象,然后执行了插件的execute方法,再向上查找,SoulWebHandler的handle方法调用了DefaultSoulPluginChain的execute方法

而SoulWebHandler实现了WebHandler接口,handle方法正是处理web请求的实现逻辑

至此,我们找到了逻辑触发的源头,处理流程如下图

 

遗留问题

插件如何加载

插件调用链初始化时传入了一个插件列表,列表如何加载的

查找soul-web模块的代码,发现SoulConfiguration里创建了SoulWebHandler类型的名为webHandler的bean,参数plugins将由spring自动装配所有SoulPlugin的实现类

 

如何顺序触发调用插件

  1. 当前插件是根据当前索引从初始化的插件列表plugins中获取(然后索引+1)
  2. DefaultSoulPluginChain触发插件的execute时,将自身作为参数传了进去,而在插件的execute逻辑中最后会调用传入DefaultSoulPluginChain的execute方法,此时索引已经+1,获取到下一个插件

 

插件扩展方式

从前面分析的插件加载逻辑看,只要实现SoulPlugin接口,就能够在初始化的时候将扩展的插件加入插件列表,从而在根据插件链顺序调用时触发扩展的插件的doExecute方法,当然还需要相关的一些代理规则配置,具体的后面再分析

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页