soul网关源码学习04-divide插件流程解析

本文详细解析了soul网关中divide插件的加载与调用流程,从SoulConfiguration加载插件开始,到SoulWebHandler执行插件调用链,深入探讨了divide插件如何进行请求转发,包括负载均衡策略和WebClientPlugin的接口调用。文章还介绍了整个流程的关键步骤,如GlobalPlugin、AbstractSoulPlugin和WebClientResponsePlugin的角色和功能。
摘要由CSDN通过智能技术生成

soul网关源码学习04-devide插件流程解析

目标:

  • 梳理soul的插件是如何加载的。
  • 梳理发送http请求的时候是如何调用插件链的。
  • 解析divide插件执行过程。

一、加载插件

从前面的学习可以知道,整个网关项目的入口是soul-bootstrap模块,先看一下里面的代码,简单的三个类和两个配置文件,可以猜想应该是在pom文件引入了其他模块的starter。
在这里插入图片描述
打开pom.xml,可以看到引入了很多插件的starter,先看一下这个gateway的stater。(这里需要注意一下,需要用到的插件一定要在这里加上依赖,否则使用过程中会找不到插件
在这里插入图片描述
进入soul-spring-boot-starter-gateway模块,可以看到这里仅仅是引入了soul-web模块。
在这里插入图片描述
进入soul-web模块,找到关键的配置类SoulConfiguration,打上断点。其实直接从启动的日志就可以找到这里,寻找入口一般都可以从启动的日志入手。
在这里插入图片描述

在这里插入图片描述
这里有个ObjectProvider的写法,第一次看到,查了一下资料,spring4.3之后的新特性,有延迟加载的作用。

/**
 * A variant of {@link ObjectFactory} designed specifically for injection points,
 * allowing for programmatic optionality and lenient not-unique handling.
 *
 * @author Juergen Hoeller
 * @since 4.3
 */
public interface ObjectProvider<T> extends ObjectFactory<T> {
   

这里参数plugins的类型是List,可以包含若干个SoulPlugin实现类实例,项目启动的过程中会先实例化所有实现了SoulPlugin接口的类,前提是已经starter进去的类,例如WebClientPlugin,打上几个断点调试一下流程,如下图所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

从加载的顺序可以看出确实延迟加载了,等所有的SoulPlugin实现类实例完成,开始实例化SoulWebHandler,把plugins作为参数传进去,然后把list拿出来,这里注意plugins是按照PluginEnum枚举类的code字段有小到大排序的,这个顺序也是后续整个插件调用链的顺序,然后返回一个SoulWebHandler实例。
进到SoulWebHandler类,执行构造方法,把拿到的所有plugins赋值给成员变量plugins。
在这里插入图片描述

二、调用插件

SoulWebHandler 这个类实现了WebHandler,可以进行Http请求处理,在每次http请求时,handle方法执行插件调用链,打上断点debug。问题来了,这个handle方法的exchange参数是怎么来的呢。

public final class SoulWebHandler implements WebHandler {
   
	//省略
	@Override
    public Mono<Void> handle(@NonNull final ServerWebExchange exchange) {
   
        MetricsTrackerFacade.getInstance().counterInc(MetricsLabelEnum.REQUEST_TOTAL.getName());
        Optional<HistogramMetricsTrackerDelegate> startTimer = MetricsTrackerFacade.getInstance().histogramStartTimer(MetricsLabelEnum.REQUEST_LATENCY.getName());
        return new DefaultSoulPluginChain(plugins).execute(exchange).subscribeOn(scheduler)
                .doOnSuccess(t -> startTimer.ifPresent(time -> MetricsTrackerFacade.getInstance().histogramObserveDuration(time)));
    }
}

发送一次http请求,debug看一下调用栈,netty的东西,看不太懂。
在这里插入图片描述
大概是找到了这里,可能就是接收请求的地方。
在这里插入图片描述
这里看了一下soul-bootstrap里面的一个netty的配置

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值