Soul网关源码阅读(七)—— http请求转发流程分析

概要

上一篇我们介绍了如何使用WebFlux快速的搭建一个请求转发的demo,了解一些基本的概念。这一篇我们来分析soul网关的设计思路,了解soul网关是如何做到将多个插件加载到webflux并进行请求转发的。我们以最简单的divide插件来进行http请求的分析。

我们从以下流程分析整个调用链。

  • 一切的开始——SoulConfiguration

  • 请求的核心处理入口——SoulWebHandler

  • Http请求插件——WebClientPlugin

  • Http响应处理插件——WebClientResponsePlugin

基础知识

开始之前需要了解,SpringWebFlux的工作原理,不然会很懵逼。

参考:

Soul网关源码阅读(六)—— Soul网关之WebFlux

Spring WebFlux 的设计及工作原理剖析

Soul网关http转发流程分析

SoulConfiguration

以上我们分析了如何将divide插件配置到我们的spring IOC容器,那么我们的soul网关又是如何加载他们到我们的请求处理链中的呢?

我们启动bootstrap服务,控制台打印了以下日志:
在这里插入图片描述

可以看到通过SoulConfiguration配置了类加载了很多不同的插件到Spring服务。
我们的分析就从SoulConfiguration开始,查看以下代码。

 /**
     * Init SoulWebHandler.
     *
     * @param plugins this plugins is All impl SoulPlugin.
     * @return {@linkplain SoulWebHandler}
     */
    @Bean("webHandler")
    public SoulWebHandler soulWebHandler(final ObjectProvider<List<SoulPlugin>> plugins) {
   
        List<SoulPlugin> pluginList = plugins.getIfAvailable(Collections::emptyList);
        final List<SoulPlugin> soulPlugins = pluginList.stream()
                .sorted(Comparator.comparingInt(SoulPlugin::getOrder)).collect(Collectors.toList());
        soulPlugins.forEach(soulPlugin -> log.info("load plugin:[{}] [{}]", soulPlugin.named(), soulPlugin.getClass().getName()));
        return new SoulWebHandler(soulPlugins);
    }

可以看到这里从上下文中将所有插件对象的集合plugins作为参数参入了SoulWebHandler,使SoulWebHandler具有处理所有插件的能力。

上面分析到SoulConfiguration配置文件将插件集合plugins配置到了SoulWebHandler,那么可以断定SoulWebHandler具备了我们网关所有插件的业务处理能力。

SoulWebHandler

查看SoulWebHandler的构造方法:

public final class SoulWebHandler implements WebHandler {
   

    private final List<SoulPlugin> plugins;

    private final Scheduler scheduler;

    /**
     * Instantiates a new Soul web handler.
     *
     * @param plugins the plugins
     */
    public SoulWebHandler(final List<SoulPlugin> plugins) {
   
        this.plugins = plugins;
        String schedulerType = System.getProperty("soul.scheduler.type", "fixed");
        if (Objects.equals(schedulerType, "fixed")) {
   
            int threads = Integer.parseInt(System.getProperty(
                    "soul.work.threads", "" + Math.max((Runtime.getRuntime().availableProcessors() << 1) + 1, 16)));
            scheduler = Schedulers.newParallel("soul-work-threads", threads
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值