Soul源码总结-01-28

  • .响应式编程与插件链调用过程分析
  • 总结

引子

前面我们介绍了divide插件,dubbo插件的底层实现原理以及他们是如何对http请求进行处理,转发至注册到网关的某一服务。那么疑问来了,soul网关是如何通过soul-bootstrap这个启动类实现响应式编程,插件链又是如何在这过程中被调用呢?本章将带着这些疑问,进行进一步探究。

Soul响应式编程

我们可以在soul-bootstrap中看到有配置项SoulNettyWebServerFactory,在项目启动时加载一个nettyHttpServer,同时配置相应的tcp配置。核心代码如下在这里插入图片描述
如果我们看一下pom.xml文件,发现soul网关的启动依赖soul-spring-boot-starter-gateway, 而这个依赖项又依赖soul-web
在这里插入图片描述在这里插入图片描述
可以看出soul-web在soul网关启动的一个重要的依赖项。我们追踪进入soul-web的自动装配类SoulConfiguration,发现自动装配了SoulWebHandler, DispatchHandler, PluginDataSubscriber, 以及针对dubbo, sofa等插件的Resolver解析器。在这里插入图片描述
SoulWebHandler里实现了WebHandler, 并在初始化阶段开启一个handler的线程池,以及重写了handle方法,来调用soulPluginChain来处理web请求。使用Webflux来实现响应式编程。 在这里插入图片描述

Soul插件链的调用源码解析

那么soul插件链是如何调用的呢?主要由DefaultSoulPluginChain中的execute方法来执行调用。该方法会递归调用soulPluginChain里的每个插件,并对插件进行检查是否应该skip.我们以divide插件为例,可以看到覆写了skip方法,核心代码如下:在这里插入图片描述
当我们发起HTTP请求时,其中 rpcType=http,正好对应 DividePlugin 的RPC类型,因此不会跳过DividePlugin,而会跳过其他 RPC 类型的插件,比如说 SpringCloudPlugin, SofaPlugin, DubboPlugin。
同时对应每个插件都实现了各自的doExecute方法,以ApacheDubboPlugin为例,核心实现方法如下:
在这里插入图片描述
值得注意的是,如果在插件doExecute过程中如果有任何异常或者错误抛出,则会中断插件链的调用,返回WebFluxResultUtils.result(exchange, error)如果顺利执行,则通过chain.execute(exchange)来继续执行下一个插件。

总结

今天大致理清了soul-bootstrap是如何将soul网关各个组件拼接起来,并通过webflux实现响应式编程的原理。最终又回顾了插件链具体是怎样调用的。接下来会继续进行对不同插件实现doExecute的原理分析。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值