在使用 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 在启动时加载并缓存路由信息的全部过程。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐