springcloud ,divide插件都能跑通了,现在就看下请求是如何转发的。

从调用栈可以看到,程序进来的入口类是 SoulWebHandler。

后面在 AbstractSoulPlugin 中,遍历 plugin list,一个个去调用开启的插件。这就是传说中的责任链模式了。责任链模式是行为型设计模式的一种,为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。一般每个接收者包含对另一个接收者的引用,如果一个对象不能处理该请求,那么会将请求传递给下一个接收者。

image-20210127224503300

可以看到 chain 上面绑定了好几层。

image-20210127231303557

这里就是一个个去执行插件。

这个 skip 方法,每个插件也是有自己的内部实现。如果 skip 为true,就去执行下一个插件,否则在当前插件执行。这里判断 DividePlugin 就是 rpcType 需要是 HTTP 的。

走到divide插件时,调用的是 DividePlugin 类。可以看到,这里拿对应的映射地址时,是从缓存拿的。

image-20210127225755070

从这边也能看到,插件选择器等数据都是从 BaseDataCache 类获取的,之前分析数据同步时,数据都是放在这个类里面的,其中去匹配选择器和规则时,里面也使用了很多设计模式,整个代码流程看起来很流畅。

拿完链接后。真正执行是用的 httpClient 插件,也就是这里执行的。

今天就简单跑了下插件的执行流程,理了下 divide 插件大概的执行顺序,具体的细节明天再继续分析。