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

文章目录

    • 一、创建 CachingRouteLocator
    • 二、监听 ContextRefreshedEvent 事件
    • 三、加载路由
    • 四、缓存路由

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

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

一、创建 CachingRouteLocator

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

org.springframework.cloud.gateway.config.GatewayAutoConfiguration

【源码】Spring Cloud Gateway 启动时加载并缓存路由_第1张图片

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

二、监听 ContextRefreshedEvent 事件

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

org.springframework.cloud.gateway.route.RouteRefreshListener

【源码】Spring Cloud Gateway 启动时加载并缓存路由_第2张图片

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

【源码】Spring Cloud Gateway 启动时加载并缓存路由_第3张图片

三、加载路由

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

org.springframework.cloud.gateway.route.CachingRouteLocator

【源码】Spring Cloud Gateway 启动时加载并缓存路由_第4张图片

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

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

org.springframework.cloud.gateway.route.CompositeRouteLocator

【源码】Spring Cloud Gateway 启动时加载并缓存路由_第5张图片

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

org.springframework.cloud.gateway.route.RouteDefinitionRouteLocator

【源码】Spring Cloud Gateway 启动时加载并缓存路由_第6张图片

四、缓存路由

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

org.springframework.cloud.gateway.route.CachingRouteLocator

【源码】Spring Cloud Gateway 启动时加载并缓存路由_第7张图片

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

org.springframework.cloud.gateway.route.CachingRouteLocator

【源码】Spring Cloud Gateway 启动时加载并缓存路由_第8张图片

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

org.springframework.cloud.gateway.route.CachingRouteLocator

【源码】Spring Cloud Gateway 启动时加载并缓存路由_第9张图片

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

你可能感兴趣的:(Spring,Cloud,java,spring,cloud,gateway,源码分析)