soul源码阅读(七)Spring Cloud应用示例运行续2

好咧,咱们继续上篇文章运行Spring Cloud应用示例出现的问题,{"code":-106,"message":"Can not find url, please check your configuration!","data":null}。

全文搜索关键字Can not find url, please check your configuration,凭已有的经验(啥经验?读一遍前两篇Spring Cloud的文章,并试着debug看看,就有这个经验了。)定位到org.dromara.soul.plugin.httpclient.WebClientPlugin#excute(),在该源码处打个debug断点验证下猜想。

debug进来了,且看soulContext的内容,看起来都是符合预期的,但是urlPath在exchange.getAttribute(Constants.HTTP_URL)的时候获取到的值为null,然后就抛出开头提到的那个异常了。

再来看下什么地方putAttribute(Constants.HTTP_URL)呢?因为咱们现在要运行着的是Spring Cloud插件,所以全文搜索下关键字Constants.HTTP_URL定位到org.dromara.soul.plugin.springcloud.SpringCloudPlugin#doExecute(),可看到在该处其实是做了exchange.getAttributes().put(Constants.HTTP_URL, realURL)的处理的,那么同样我们也debug观察看看,是怎么回事?

这回没达到预期了,debug断点没进来,不慌,咱们回到org.dromara.soul.web.handler.SoulWebHandler#execute()方法看下,只加载到16个插件,看起来并没有spring cloud插件,那么插件是怎么加载进来的呢?继续往前定位源码。

我们可以看到org.dromara.soul.web.handler.SoulWebHandler#SoulWebHandler()方法里做了插件的初始化,然后new SoulWebHandler(soulPlugins)的位置在org.dromara.soul.web.configuration#soulWebHandler()方法里去初始化注册bean的,只是final ObjectProvider<List<SoulPlugin>> plugins这个参数值时怎么拿到的呢?全文搜了下,没找到有这么一个集合初始化的位置。最终问过大佬们(一起学习源码的小伙伴),soul作者给我们答疑过这个问题,去翻了下,明白了,这个参数是已经被注册的spring bean,或者在注册这个bean之前会先去找到参数的bean然后注册,而同类型的bean注册完了后,spring会将它放到一个这样的list集合里。

类似截图中这样的两个初始化操作,被先被找到,且注册后放到SoulPlugin的集合中。那么我们继续找,为什么SpringCloudPlugin没被注册?是不是在网关启动的时候没有starter它?

 

果然找了下bootstrap的pox.xml,没有引入starter,打开注释,重启。

Spring Cloud插件加载进来了,请求的时候doExcute方法也被加载了,那么是不是都正常了呢?不巧的是,又报新错误了。

不慌,咱们浏览器直接请求下我们的示例服务进程

那就不是应用服务的锅了,还是bootStrap有点问题?

跟踪了下WebClientPlugin插件最终请求后端服务的时候,回去buildMediaType,其中拿到的Content-Type:"*/*",不太对。问了大佬后(同源码学习的小伙伴)

get请求的时候,要将request body的text去掉复选框,再请求就发现成功了,成功请求的截图如下:

至此,终于经过三天的debug调试,Spring Cloud示例运行起来了,当然这过程也让我们大致了解了一个请求到soul bootstrap后,插件的工作流程。下篇文章,不妨我们再把这个流程给梳理下。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值