【源码】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)