GateWay路由源码分析

本文深入分析了Spring Gateway的路由转发流程,从springgateway简介开始,探讨了HandlerMapping、RouteLocator、GlobalFilter和WebHandler的角色。特别地,详细解释了RoutePredicateHandlerMapping如何根据请求URL找到路由配置,并通过FilterWebHandler处理请求转发。同时,文章还介绍了RouteLocator的加载过程,包括Route的组成、加载来源,以及不同方式创建路由,如Properties文件、DiscoveryClient和数据库。此外,文中还讨论了GlobalFilter的加载,特别是NettyRoutingFilter在请求代理服务中的作用。

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

GateWay路由源码分析

springgateway 简介

springcloud 提供了便于我们编写网关组件,分别是zuul和gateway;在zuul1的通信模型是BIO而zuul2的通信模型采用了NIO;spring gateway的IO模型使用的是NIO;但是从netflix发布zuul2后spring已经 开始 不集成zuul组件了。spring gateway的架构是基于WebFlux基础开发的。它依赖springboot2.x,spring5和netty

Spring GateWay请求转发流程

在spring MVC是通过handlermapping解析请求连接然后根据请求连接找到执行请求的controller类;而gateway采用同样的方式,用handlerMapping 堆请求连接进行解析匹配对应的Route,然后有对应的filter做对应的请求转发。整个流程用户请求先通过dispatchHandler找到对应的GateWayHandlerMapping ,再由GateWayHandlerMapping解析匹配对应的handler;handler处理完成后再经过filter链处理最终分发到proxied service。
在这里插入图片描述

转发请求解析

在这里插入图片描述
在这里插入图片描述

  1. 请求先有DispatcherHandler进行处理,DispatchHandler在IOC容器初始化时会在容器中所有实现HandlerMapping接口的实例放到handlerMappers属性中,DispatchHandler调用handler方法迭代handlerMappings中的handlerMapping。
  2. RoutePredicateHandlerMapping是其中一个实现了HandlerMapping接口的类,它负责处理基于路由的处理的mapping实现类;RoutePredicateHandlerMapping 根据请求URL找到对应的路由配置信息将route的配置信息存放到ServerWebExchange中然后返回实现了WebHandler接口的FilterWebHandler,FilterWebHandler是一个存放过滤器的handler。
  3. 最后DispatchHandler通过SimpleHandlerAdaptor适配器调用FilteringWebHandler的handle方法,FilteringWebHandler调用所有的过滤器,包括proxy filter,通过proxy filter请求被代理的服务;处理完毕后将response返回去。

HandlerMapping,RouteLocator,GlobalFilter,WebHandler

HandlerMapping

handler 继承关系图
在这里插入图片描述

AbstractHandlerMapping

HandlerMapping和Ordered接口主要定义了获取getHandler和当前handler的加载顺序。AbstractHandlerMapping 在getHandler封装了CORS处理,因为所有的handler都会涉及到CORS处理,抽象到AbstractHandlerMapping处理,再提供getHandlerInternal让子类实现具体的查找方法在这里插入代码片。

/** 
*获取handler方法
**/
public Mono<Object> getHandler(ServerWebExchange exchange) {
   
        return this.getHandlerInternal(exchange).map((handler) -> {
   
            if (CorsUtils.isCorsRequest(exchange.getRequest())) {
   
                CorsConfiguration configA = this.globalCorsConfigSource.getCorsConfiguration(exchange);
                CorsConfiguration configB = this.getCorsConfiguration(handler, exchange);
                CorsConfiguration config = configA != null ? configA.combine(configB) : configB;
                if (!this.getCorsProcessor().process(config, exchange) || CorsUtils.isPreFlightRequest(exchange.getRequest())) {
   
                    return REQUEST_HANDLED_HANDLER;
                }
            }

            return handler;
        });
    }
   //抽象方法,让子类实现具体查找handler的
    protected abstract Mono<?> getHandlerInternal(ServerWebExchange var1);

我们可以通过代码学习学习到如果所有的接口的实现类都需要在接口定义方法或者后执行一些共性操作,我们可以通过抽象类实现共性的操作,再通过定义抽象方法,让子类实现特有的实现。这种模式叫做模板模式。

RoutePredicateHandlerMapping

RoutePredicateHandlerMapping是处理获取handler。RoutePredicateHandlerMapping中的RouteLocator存储gateway启动时加载的路由对象信息。获取路由的时候,调用RoutePredicateHandlerMapping的getHandlerInternal方法,从routeLocator获取路由存放在WebServerExchange中,返回Filter。

private final RouteLocator routeLocator;
@override
public Mono<?> getHandlerExternal(ServerWebExchange exchange){
   
  exchange.getAttributes().put(GATEWAY_HANDLER_MAPPER_ATTR, getClass().getSimpleName());

        return lookupRoute(exchange)
                // .log("route-predicate-handler-mapping", Level.FINER) //name this
                .flatMap((Function<Route, Mono<?>>) r -> {
   
                    exchange.getAttributes().remove(GATEWAY_PREDICATE_ROUTE_ATTR);
                    if (logger.isDebugEnabled()) {
   
                        logger.
Spring Cloud Gateway 是一个基于 Spring Framework 5、Spring Boot 2 和 Project Reactor 的 API 网关服务。它提供了一种简单而强大的方法来路由和过滤请求,并将它们转发到底层的微服务。对于理解 Spring Cloud Gateway 的工作原理和深入研究其源代码是非常有用的。 首先,通过源码可以发现 Spring Cloud Gateway 主要由三个核心模块组成:路由模块、过滤器模块和事件模块。路由模块负责根据定义的路由规则将请求转发到特定的目标地址。过滤器模块负责在请求的不同阶段执行一系列的过滤器来处理请求。事件模块则用于处理与路由和过滤器相关的异步事件。 源码中的路由模块使用了 Reactive Streams API 中的 Flux 和 Mono 类来处理异步操作。它利用 RouterFunction 和 HandlerFunction 来定义路由和处理请求的方法,并通过 RoutePredicateFactory 来解析和匹配路由规则。在路由模块中,使用了 Netty 库来实现底层的网络通信和请求转发。 通过源码分析过滤器模块,可以发现 Spring Cloud Gateway 的过滤器分为全局过滤器和自定义过滤器两种类型。全局过滤器在请求的全局范围内应用,并且可以用于添加一些全局的处理逻辑。自定义过滤器则允许开发者根据需要添加自定义的过滤逻辑。过滤器的执行顺序可以通过 Order 注解来控制,以满足不同过滤器的执行顺序需求。 事件模块在源码中使用了 Reactor 提供的 EventProcessor 来处理与路由和过滤器相关的事件。它使用了 Reactor 的 FluxSink 和 MonoSink 来创建异步事件源,并通过事件处理器将事件发送给注册的监听器。通过查看事件模块的源码,可以更加深入地了解 Spring Cloud Gateway 是如何处理与路由和过滤器相关的事件的。 总结而言,通过源码分析 Spring Cloud Gateway,我们可以更好地了解其内部的工作原理和实现细节。这对于开发者来说是非常有用的,因为它可以帮助我们更好地使用和扩展 Spring Cloud Gateway 来满足不同的场景需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值