昨天以使用者的角度体验了springCloud工程接入soul后的转发处理效果,结果最终结果报错了,如下图:
那么今天我们就基于这个报错来分析一下源码,到底是哪个环节导致最终结果出错,从这个图的报错信息可以看到,是无法找到正确的选择器导致的报错,结合之前对http请求以及dubbo请求的分析经验,尝试从插件链的角度分析问题出现的原因,先在soul-admin管理控制台中查看目前的插件列表,因为之前调试过dubbo请求,所以目前dubbo和springCloud插件状态都是开启状态,所以怀疑是否是受到dubbo插件的影响,故先把dubbo插件的状态改为关闭再进行调试。
由之前的调试经验,知道SoulWebHandler是入口程序,故在SoulWebHandler的execute方法中打了断点进行调试,然后我们今天调试的是springCloud请求,故根据之前的经验,必然是会执行SpringCloudPlugin插件的,但是经过调试发现,请求根本没进去SpringCloudPlugin插件,SpringCloudPlugin插件的skip标志位为true,也就是直接跳过了这个插件执行了,是为什么呢,点进去SpringCloudPlugin插件的skip方法查看,发现是如下的判断逻辑:
final SoulContext body = exchange.getAttribute(Constants.CONTEXT);
//当前请求的RpcType的值不为springCloud则返回true
return !Objects.equals(Objects.requireNonNull(body).getRpcType(), RpcTypeEnum.SPRING_CLOUD.getName())