Spring Cloud Gateway (七)处理流程解析

本文深入剖析了Spring Cloud Gateway的处理流程,从HttpServerHandle的请求接收,经过ReactorHttpHandlerAdapter、HttpWebHandlerAdapter的传递,到DispatcherHandler的请求调度和RoutePredicateHandlerMapping的路由匹配。接着在FilteringWebHandler中,定制化的filter与全局filter结合处理请求。最后,一系列filter如WebsocketRoutingFilter、NettyRoutingFilter等执行核心功能,完成请求到响应的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Cloud Gateway (七)处理流程解析


简介

    初步梳理 Spring Cloud Gateway 的处理流程

过程记录

主要请求流程

    在前面的分析中,我们知道在 RoutePredicateHandlerMapping 中是实现了路由查找,于是在这个类中 getHandlerInternal 函数打上断点,通过调用栈向前追溯调用

    向前我们追溯到了 DispatcherHandler ,在这个断点处通过断点调试发现有类似循环的操作,这个感觉是查找相应 handler 进行处理,细节部分暂时不够,后面再来详细看

    public Mono<Void> handle(ServerWebExchange exchange) {
   
   
        return this.handlerMappings == null ? this.createNotFoundError() : Flux.fromIterable(this.handlerMappings).concatMap((mapping) -> {
   
   
            return mapping.getHandler(exchange);
        }).next().switchIfEmpty(this.createNotFoundError()).flatMap((handler) -> {
   
   
            return this.invokeHandler(exchange, handler);
        }).flatMap((result) -> {
   
   
            return this.handleResult(exchange, result);
        });
    }

    在上面函数打断点,再通过调用栈向前查找,找到 netty 相关的一个类: HttpServerHandle 。下面的函数中有类似 Mono 这里的代码,发布后触发调用

    public void onStateChange(Connection connection, State newState) {
   
   
        if (newState == HttpServerState.REQUEST_RECEIVED) {
   
   
            try {
   
   
                if (log.isDebugEnabled()) {
   
   
                    log.debug(ReactorNetty.format(connection.channel(), "Handler is being applied: {}"), new Object[]{
   
   this.handler});
                }

                HttpServerOperations ops = (HttpServerOperations)connection;
                // Mono 发布,这一步需要注意,跟踪handler下去
                Mono.fromDirect((Publisher)this.handler.apply(ops, ops)).subscribe(ops.disposeSubscriber());
            } catch (Throwable var4) {
   
   
                log.error(ReactorNetty.format(connection.channel(), ""), var4);
                connection.channel().close();
            }
        }
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值