概述
本文接着上一篇文章,继续分析soulWebHandler的代码细节,看他是怎么调用插件链的。
DefaultSoulPluginChain
上文粗鲁介绍了DefaultSoulPluginChain
,我们在复习一下,并以此为基础接着讲。它的核心代码不多,如下:
1 | // 该代码是soulWebHandler 中 handle方法实际执行的方法 |
逻辑就是挨个调用所有开启插件的execute方法。然后我们来看看soulPlugin的execute执行逻辑,这段逻辑在实现SoulPlugin接口的抽象类AbstractSoulPlugin
中。
SoulPlugin
介绍AbstractSoulPlugin
之前我们先看一眼SoulPlugin接口:
1 | public interface SoulPlugin { |
通过接口我们能很清晰的看出来每个插件需要干的事情。
AbstractSoulPlugin
所有插件都是集成抽象类AbstractSoulPlugin
,而它实现了execute方法,同时要求子类自行实现doExecute方法。在execute中主要干的是第一件事——根据当前流量找匹配的选择器和规则的逻辑。核心代码如下:
1 | /** |
每个插件通用的handler方法逻辑很简单。首先从cache中拿到插件配置PluginData,这个数据就是我们在soul-admin管理界面,点击”插件管理”–>”xx插件”,右侧配置的全部内容,主要是多个选择器以及每个选择器的多个规则。然后根据上下文exchange判断找出符合的选择器中符合的规则。然后调用各个插件需要实现的doExecute方法,该方法传入了:命中的选择器,命中的规则,请求上下文,以及插件调用链。其他省略的方法大多都是判断选择器、规则是否与当前请求匹配,主要是用java stream实现的。
soul的这部分代码逻辑非常清晰没有什么特别需要说明的。下面我们从一个sign插件的doExecute方法入手,看看各个插件时如何实现该方法的。
SignPlugin
直接上代码:
1 | public class SignPlugin extends AbstractSoulPlugin { |
从代码中可以看出,具体插件主要负责干的是后两件事:执行插件实际逻辑以及调用插件链的execute继续执行下个插件。这里插件业务逻辑是封装给SignService执行的,本文主要过逻辑暂不细究插件业务功能的实现。
总结
soul中所有流量走一遍插件调用链,就完成路由转发以及网关业务处理。插件调用链的执行方式以及各个插件内的执行逻辑十分清晰。不得不佩服做的深厚的软件开发功底。下一篇我们介绍2个非常重要的插件的实现,1个是globalPlugin以及1个路由插件(spring-cloud),这两个插件是所有访问spring-cloud下游服务的流量必须经过的2个插件。