Soul网关源码分析-7期(番外)

开个小差, 追下网关的接收请求并转发中, soul借助 spring-web 的实现.


追下网关监听请求的开启, 找到配置类 SoulConfiguration:

@Configuration
public class SoulNettyWebServerFactory {

    private static final int DEFAULT_IO_WORKER_COUNT = Integer.parseInt(System.getProperty(
            ReactorNetty.IO_WORKER_COUNT,
            "" + Math.max(Runtime.getRuntime()
                    .availableProcessors() << 1, 16)));


    @Bean
    public NettyReactiveWebServerFactory nettyReactiveWebServerFactory() {
        NettyReactiveWebServerFactory webServerFactory = new NettyReactiveWebServerFactory();
        webServerFactory.addServerCustomizers(new EventLoopNettyCustomizer());
        return webServerFactory;
    }
}

这里应该是借助 Spring-web 框架 启动 Netty 的开始了.

再关注下另一个配置类 SoulConfiguration:

@Configuration
public class SoulConfiguration {

  @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("loader plugin:[{}] [{}]", soulPlugin.named(), soulPlugin.getClass().getName()));
    // 这里初始化 SoulWebHandler
    return new SoulWebHandler(soulPlugins);
  }
}

这里初始化了 SoulWebHandler 类, 这个类是插件链的关键, 分析下他到底为啥在请求中会被调用:

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))
                  );
  }
}

SoulWebHandler 实现 spring-web 框架的WebHandler 并实现 handle() , 这是框架链上一环, 请求时肯定也会被调用.

我们知道这个 SoulWebHandler 的插件链, 最最主要的功能就是请求转发并接受响应, 这里借助 spring-web 框架的 exchange 上下文, 在运行过程中将响应信息注入其中, 即可完成使命.

而后续我猜测 spring-web 框架也会订阅这整个Web链的Mono, 就能阻塞住请求线程, 即可在得到响应信息后返回.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值