Spring Cloud Gateway——路由分析
Posted 不去天涯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Gateway——路由分析相关的知识,希望对你有一定的参考价值。
概述
Spring Cloud Gateway的路由里包含了API的转发逻辑、处理切面,是Spring Cloud Gateway最最关键的组件。在Spring Cloud Gateway里有两种添加路由的方式:一种是properties配置方式,一种是Java代码配置方式。
一起看下,Spring Cloud Gateway路由配置信息转化成路由对象,并且和RoutePredicateHandlerMapping建立关联关系的过程。
路由初始化
Spring Cloud Gateway的路由延续了Spring一贯的做法,由RouteDefinition和Route两个基础类组成,RouteDefinition对应到properties文件中的路由描述,Route对应为路由的内存数据结构。
RouteDefinitionLocator实现RouteDefinition的查找、解析,当前Spring Cloud Gateway支持3种形式的路由描述存储方式,也就是上图绿色的1,2,3:PropertiesRouteDefinitionLocator(properties文件)、DiscoveryClientRouteDefinitionLocator(服务发现)、InMemoryRouteDefinitionRepository(内存存储,用于动态路由)。
CompositeRouteDefinitionLocator是一个合成器,集合里上述3个路由,并且被注解为了@Primary,所以路由定义解析的时候都会从CompositeRouteDefinitionLocator里获取路由描述,也就是能同时取出PropertiesRouteDefinitionLocator、DiscoveryClientRouteDefinitionLocator、InMemoryRouteDefinitionRepository
3种形式存储的路由描述。
builder.routes().build()返回的是一个RouteLocator类型的实例,和CompositeRouteDefinitionLocator一样,都会注入到CompositeRouteLocator里,再封装成CachingRouteLocator。
RoutePredicationHandlerMapping在处理webflux请求的时候,逐个调用RouteLocator中所有Route实例的Predicte.apply方法确定此次请求由哪个Route处理。
RouteDefinitionRouteLocator
RouteDefinitionRouteLocator用来把RouteDefinition转换成Route,转换过程在convertToRoute方法完成。
private Route convertToRoute(RouteDefinition routeDefinition)
//1.解析predicate
AsyncPredicate<ServerWebExchange> predicate = combinePredicates(routeDefinition);
//2.解析filters
List<GatewayFilter> gatewayFilters = getFilters(routeDefinition);
//3.构建Route对象实例
return Route.async(routeDefinition).asyncPredicate(predicate)
.replaceFilters(gatewayFilters).build();
Predicate和GatewayFilter的解析逻辑类似,都是通过Definition.name()找到对应的解析Factory,然后完成Definition到对象实例的解析过程。
以下是PredicteFactory的内置实现:
以下是GatewayFilter的内置实现:
builder.routes().route(fn).build()
buidler是一个RouteLocatorBuilder类型的实例,在GatewayAutoConfiguration里创建。
builder.route()创建一个内部类的实例,也就是RouteLocatorBuilder.Builder的实例,用来构建Route对象。
.route(fn)用来创建routeBuilder,并且添加到RouteLocatorBuilder.Builder的routes列表里。
fn是一个FunctionalInterface接口,入参是PredicateSpec,返回值是Route.AsyncBuilder。
public Builder route(Function<PredicateSpec, Route.AsyncBuilder> fn)
//fn的入参是一个RouteSpec对象
Route.AsyncBuilder routeBuilder = fn.apply(new RouteSpec(this).randomId());
//添加到routes列表
add(routeBuilder);
return this;
.build()返回一个RouteLocator,内部逻辑是逐个创建Route对象。
public RouteLocator build()
return () -> Flux.fromIterable(this.routes)
.map(routeBuilder -> routeBuilder.build());
以上是关于Spring Cloud Gateway——路由分析的主要内容,如果未能解决你的问题,请参考以下文章