【源码】Spring Cloud Gateway 启动时加载并缓存路由
在使用 Spring Cloud Gateway 进行路由转发时,它会在启动时就加载并缓存路由信息,以便在实际请求到来时能够快速进行路由转发。那么,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 中的委派对象 deledate 是 CompositeRouteLocator 实例,见第一步。
所以最终是调用的是 CompositeRouteLocator 的 getRoutes 方法去获取路由。
org.springframework.cloud.gateway.route.CompositeRouteLocator

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

四、缓存路由
由第三步获取到所有的路由列表并排序后,直接放入缓存 cache。
org.springframework.cloud.gateway.route.CachingRouteLocator

因为在 CachingRouteLocator 的构造函数中,将路由 routes 和 cache 进行了绑定,所有更新 cache 也就是更新了 routes。
org.springframework.cloud.gateway.route.CachingRouteLocator

当请求进来的时候,直接返回 CachingRouteLocator 的 routes,也就是缓存 cache 中的路由信息。
org.springframework.cloud.gateway.route.CachingRouteLocator

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




所有评论(0)