一、核心概念
路由Route
路由是网关的核心抽象。
1 | arduino复制代码public class Route implements Ordered { |
ServerWebExchange
ServerWebExchange是spring-web的一个接口,提供ServerHttpRequest、ServerHttpResponse,ApplicationContext等实例的get方法。
断言AsyncPredicate
断言用于判断路由是否匹配某个ServerWebExchange。
1 | csharp复制代码public interface AsyncPredicate<T> extends Function<T, Publisher<Boolean>> { |
路由过滤器GatewayFilter
针对于路由的过滤器,无法离开Route而存在。
1 | java复制代码public interface GatewayFilter extends ShortcutConfigurable { |
全局过滤器GlobalFilter
全局的过滤器,所有路由都必须执行的过滤器。后续Bean实例化的时候,会适配成GatewayFilter被使用。
1 | kotlin复制代码public interface GlobalFilter { |
过滤器链GatewayFilterChain
GatewayFilterChain过滤器链允许GatewayFilter过滤器按顺序,挨个执行。
1 | kotlin复制代码public interface GatewayFilterChain { |
路由定义RouteDefinition
类似于Spring的BeanDefinition,Route的一种构建方式就是通过RouteDefinition,比如从properties文件中解析得到的路由规则定义。
1 | typescript复制代码public class RouteDefinition { |
断言定义PredicateDefinition
从配置文件加载的断言定义,构造Route时,会用RoutePredicateFactory#applyAsync
转换成AsyncPredicate
。
1 | arduino复制代码public class PredicateDefinition { |
路由过滤器定义FilterDefinition
从配置文件加载的路由过滤器定义,构造Route时,会用GatewayFilterFactory#apply
转换为GatewayFilter
。
1 | arduino复制代码public class FilterDefinition { |
获取路由定义RouteDefinitionLocator
RouteDefinitionLocator具有获取路由定义的能力。
1 | csharp复制代码public interface RouteDefinitionLocator { |
最后对外暴露的实际是CompositeRouteDefinitionLocator,他组合了所有RouteDefinitionLocator。
获取路由RouteLocator
RouteLocator具有获取路由Route
的能力。网关处理请求时只会调用RouteLocator获取Route,通过Route的断言和过滤处理请求。
1 | csharp复制代码public interface RouteLocator { |
Spring容器加载的时候,会把路由都放到CachingRouteLocator里,后续运行时只会和CachingRouteLocator打交道。
二、加载路由
讲解从Gateway的Bean装配,到加载Route
到CachingRouteLocator
。
自动配置
Spring-Cloud-Gateway的自动配置类是org.springframework.cloud.gateway.config.GatewayAutoConfiguration
。重点看一些重要的Bean装配,全局Filter等下一章节讲请求流程的时候再分析。
Gateway配置文件
1 | typescript复制代码@Bean |
RouteDefinitionLocator相关
- PropertiesRouteDefinitionLocator:配置文件创建RouteDefinitionLocator
1 | less复制代码@Bean |
- InMemoryRouteDefinitionRepository:内存级别路由定义,无法持久化,支持动态新增和删除路由定义
1 | less复制代码@Bean |
- CompositeRouteDefinitionLocator:组合其他所有的RouteDefinitionLocator,并且是Primary的
1 | less复制代码@Bean |
RouteLocator相关
- RouteLocatorBuilder:辅助用编码方式注入自定义的RouteLocator。
1 | typescript复制代码@Bean |
- RouteDefinitionRouteLocator:用RouteDefinitionLocator和GatewayFilterFactory和RoutePredicateFactory构造Route,创建RouteLocator。
1 | typescript复制代码@Bean |
- CachingRouteLocator:委托CompositeRouteLocator聚合其他所有RouteLocator,实现RouteLocator。
1 | less复制代码@Bean |
加载路由入口类RouteRefreshListener
1 | typescript复制代码@Bean |
加载路由到CachingRouteLocator
RouteRefreshListener
加载路由到RouteLocator的入口,通过Spring事件触发。
1 | csharp复制代码public class RouteRefreshListener implements ApplicationListener<ApplicationEvent> { |
CachingRouteLocator
CachingRouteLocator
收到RefreshRoutesEvent
,委托CompositeRouteLocator
获取Flux<Route>
放入自己的缓存cache
中。
1 | typescript复制代码public class CachingRouteLocator implements Ordered, RouteLocator, |
CompositeRouteLocator
通过其他RouteLocator获取所有Route。
1 | kotlin复制代码public class CompositeRouteLocator implements RouteLocator { |
1 编码方式获取Route
1 | less复制代码@Bean |
RouteLocatorBuilder.Builder构造的RouteLocator,Bean注入的时候直接构造完成了。具体构造过程不细看了,也是利用了RoutePredicateFactory和GatewayFilterFactory。
1 | csharp复制代码public static class Builder { |
2 RouteDefinitionRouteLocator
RouteDefinitionRouteLocator只负责通过RouteDefinition创建Route,委托CompositeRouteDefinitionLocator获取RouteDefinition,并通过ConfigurationService、RoutePredicateFactory、GatewayFilterFactory将RouteDefinition转换为Route返回。
1 | arduino复制代码public class RouteDefinitionRouteLocator |
- CompositeRouteDefinitionLocator
getRouteDefinitions
循环所有RouteDefinitionLocator获取所有RouteDefinition。
1 | kotlin复制代码public class CompositeRouteDefinitionLocator implements RouteDefinitionLocator { |
RouteDefinitionLocator有很多种,以PropertiesRouteDefinitionLocator为例。
1 | kotlin复制代码public class PropertiesRouteDefinitionLocator implements RouteDefinitionLocator { |
- RouteDefinitionRouteLocator.convertToRoute
通过ConfigurationService、RoutePredicateFactory、GatewayFilterFactory将RouteDefinition转换为Route。
1 | scss复制代码private Route convertToRoute(RouteDefinition routeDefinition) { |
RouteDefinitionRouteLocator#combinePredicates
转换PredicateDefinition
为AsyncPredicate
。
1 | scss复制代码private AsyncPredicate<ServerWebExchange> combinePredicates( |
RouteDefinitionRouteLocator#getFilters
将FilterDefinition
转换为GatewayFilter
。
1 | scss复制代码private List<GatewayFilter> getFilters(RouteDefinition routeDefinition) { |
总结
- 理清Route、RouteLocator、RouteDefinition、RouteDefinitionLocator的含义。最后对运行时实际暴露的对象只有CachingRouteLocator和Route。
- RouteRefreshListener接收容器事件,发布RefreshRoutesEvent事件,触发路由加载至CachingRouteLocator。
本文转载自: 掘金