【源码】Spring Cloud Gateway 启动时加载并缓存路由


在使用 Spring Cloud Gateway 进行路由转发时,它会在启动时就加载并缓存路由信息,以便在实际请求到来时能够快速进行路由转发。

那么,Spring Cloud Gateway 是如何完成这一过程的呢?让我们一起从源码中寻找答案吧。

一、创建 CachingRouteLocator

项目启动时,会创建一个名为 cachedCompositeRouteLocator ,类型为 CachingRouteLocator 的一个 RouteLocator 实现,如下所示:

org.springframework.cloud.gateway.config.GatewayAutoConfiguration

其中参数 routeLocators 为其他所有实现了 RouteLocator 接口的实例列表。

二、监听 ContextRefreshedEvent 事件

RouteRefreshListener 会监听到 Spring Boot 启动时发布的 ContextRefreshedEvent 事件。

org.springframework.cloud.gateway.route.RouteRefreshListener

然后调用 rest() 方法,也就是发布了一个 RefreshRoutesEvent 事件。

三、加载路由

CachingRouteLocator 监听了 RefreshRoutesEvent 事件,调用 fetch 方法获取路由。

org.springframework.cloud.gateway.route.CachingRouteLocator

因为 CachingRouteLocator 中的委派对象 deledateCompositeRouteLocator 实例,见第一步。

所以最终是调用的是 CompositeRouteLocatorgetRoutes 方法去获取路由。

org.springframework.cloud.gateway.route.CompositeRouteLocator

由第一步创建 CachingRouteLocator 源码可知,CompositeRouteLocatordelegates 为其他所有实现了 RouteLocator 接口的实现列表,主要包含 RouteDefinitionRouteLocator 和 其他自定义 RouteLocator 实现。

org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator

四、缓存路由

由第三步获取到所有的路由列表并排序后,直接放入缓存 cache

org.springframework.cloud.gateway.route.CachingRouteLocator

因为在 CachingRouteLocator 的构造函数中,将路由 routescache 进行了绑定,所有更新 cache 也就是更新了 routes

org.springframework.cloud.gateway.route.CachingRouteLocator

当请求进来的时候,直接返回 CachingRouteLocatorroutes,也就是缓存 cache 中的路由信息。

org.springframework.cloud.gateway.route.CachingRouteLocator

源码之下无秘密,以上四个步骤就是 Spring Cloud Gateway 在启动时加载并缓存路由信息的全部过程。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
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
发出的红包

打赏作者

i余数

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值