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——路由分析的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud gateway网关路由分配

Spring Cloud Gateway 和 DiscoveryClient 路由

Spring Cloud —— Gateway 服务网关

Spring Cloud-Gateway网关

Spring Cloud Gateway——路由分析

Spring Cloud Gateway——路由分析