在使用 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
然后调用 reset
方法,也就是发布了一个 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 在启动时加载并缓存路由信息的全部过程。
– End –
原文始发于微信公众号(i余数):【源码分析】Spring Cloud Gateway 启动时加载并缓存路由信息
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/194063.html