Spring Cloud Gateway 路由构建器的源码分析
文章目录
- 1. 路由构建器的入口
- 2. 创建路由规则
- 3. 设置路由规则和属性
- 4. 路由过滤器的设置
- 5. 构建和获取路由规则:
- 6. 实例化路由构建器:
- 8. 路由构建器的源码分析
- 8.1 RouteLocator接口
- 8.2 RouteLocatorBuilder接口
- 8.3 DefaultRouteLocator实现
- 8.4 RouteDefinitionRouteLocator实现
Spring Cloud Gateway的路由构建器是用于创建和配置路由的核心组件之一。它允许你以编程方式定义路由规则,并设置各种路由属性和过滤器。下面是Spring Cloud Gateway路由构建器的源码分析:
1. 路由构建器的入口
- 路由构建器的入口是
RouteLocatorBuilder
类,它是一个构建器模式的入口类。 - 通过
RouteLocatorBuilder
,你可以创建和配置路由规则。
2. 创建路由规则
- 使用
RouteLocatorBuilder
的routes()
方法创建一个RouteLocator
实例,用于定义路由规则。 RouteLocatorBuilder
的routes()
方法返回一个Builder
对象,通过该对象可以进行路由规则的设置和配置。
3. 设置路由规则和属性
Builder
对象提供了一系列方法用于设置路由规则和属性。- 可以使用
Builder
的route()
方法设置路由规则,例如指定请求路径、目标URI等。 - 可以使用
Builder
的各种属性方法设置路由的附加属性,例如请求谓词、过滤器等。
4. 路由过滤器的设置
- 通过
Builder
的filters()
方法可以设置路由过滤器。 - 可以使用过滤器工厂类(如
GatewayFilterFactory
)提供的方法创建过滤器,并将其添加到路由规则中。
5. 构建和获取路由规则:
- 使用
Builder
的build()
方法构建RouteLocator
实引言例,生成最终的路由规则。 RouteLocator
表示完整的路由规则集合,可以通过该实例获取所有配置好的路由规则。
6. 实例化路由构建器:
- 要实例化
RouteLocatorBuilder
,可以通过依赖注入或创建一个新的实例。 - 通常,可以在Spring Boot的配置类中使用
@Bean
注解创建一个RouteLocatorBuilder
的实例。
8. 路由构建器的源码分析
8.1 RouteLocator接口
这是一个功能接口,定义了一个方法getRoutes(),该方法返回一个Publisher,当订阅时,发布所有的Route集合。
8.2 RouteLocatorBuilder接口
RouteLocatorBuilder
是Spring Cloud Gateway中用于构建RouteLocator
的工具类,它提供了一种简洁、易读的方式来定义路由。RouteLocatorBuilder
的主要方法是routes()
,返回一个RoutesLocatorBuilder.Builder
对象,我们可以在此对象上定义特定的路由。
RouteLocatorBuilder
的成员变量包括:
List<RoutePredicateFactory>
:这是一个负责创建路由断言的工厂列表,断言用来判断请求是否满足特定条件。List<RouteFilterFactory>
:这是一个负责创建过滤器的工厂列表,过滤器用来对满足断言的请求进行处理。
RouteLocatorBuilder
的主要方法包括:
routes()
:这个方法返回一个RouteLocatorBuilder.Builder
对象,你可以在这个对象上使用诸如route()
方法来定义路由。route(RouteLocatorBuilder.BuilderSpec spec)
:这个方法是RouteLocatorBuilder.Builder
的一个方法,它可以接受一个RouteLocatorBuilder.BuilderSpec
参数,然后根据这个参数来定义一个路由。你可以在这个方法的参数中定义断言和过滤器。
注意,RouteLocatorBuilder
并不负责加载和转换路由定义,这是DefaultRouteLocator
的职责。RouteLocatorBuilder
只是提供了一个方便的方式来定义路由。
这里是一个简单的示例来展示如何使用RouteLocatorBuilder
来定义路由:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("path_route", r -> r.path("/get")
.uri("http://httpbin.org"))
.build();
}
在此示例中,我们定义了一个路由,该路由将所有路径为"/get"的请求路由到"http://httpbin.org"。
8.3 DefaultRouteLocator实现
DefaultRouteLocator
是 Spring Cloud Gateway 的默认路由定位器实现,负责加载和转换路由定义。它的源代码比较复杂,这里只简要概述其主要功能和工作原理。
DefaultRouteLocator
的核心成员变量包括:
RouteDefinitionLocator
:用于从各种来源(例如内存,数据库,配置文件等)获取路由定义。List<RoutePredicateFactory>
:用于根据路由定义创建断言,断言用于判断请求是否满足特定条件。List<RouteFilterFactory>
:用于根据路由定义创建过滤器,过滤器用于处理满足断言的请求。
DefaultRouteLocator
的主要方法是:
getRoutes()
:返回所有有效的路由。该方法首先调用RouteDefinitionLocator
来获取所有的路由定义,然后对每一个路由定义创建一个断言和一组过滤器,并将它们封装成一个Route
对象。
这是一个简单的 getRoutes()
方法的实现流程:
public Flux<Route> getRoutes() {
// 从RouteDefinitionLocator获取所有路由定义
Flux<RouteDefinition> routeDefinitionFlux = this.routeDefinitionLocator.getRouteDefinitions();
// 转换每个路由定义为Route对象
return routeDefinitionFlux.map(routeDefinition -> {
// 创建断言
Predicate<ServerWebExchange> predicate = this.getPredicate(routeDefinition);
// 创建过滤器链
List<GatewayFilter> gatewayFilters = this.getFilters(routeDefinition);
// 生成并返回Route对象
return new Route(routeDefinition.getId(), predicate, gatewayFilters, routeDefinition.getUri());
});
}
8.4 RouteDefinitionRouteLocator实现
RouteDefinitionRouteLocator
是Spring Cloud Gateway中的一个核心类,它的主要职责是提供路由定位的功能。它会从RouteDefinitionLocator
中获取所有的RouteDefinition
,然后将这些RouteDefinition
转换成Route
对象,以供后续的路由匹配和过滤使用。
简单的RouteDefinitionRouteLocator
类的源码解析:
public class RouteDefinitionRouteLocator implements RouteLocator {
private final RouteDefinitionLocator routeDefinitionLocator;
private final List<GatewayFilterFactory> gatewayFilters;
private final List<RoutePredicateFactory> routePredicates;
private final RouteFactory routeFactory;
public RouteDefinitionRouteLocator(
RouteDefinitionLocator routeDefinitionLocator,
List<GatewayFilterFactory> gatewayFilters,
List<RoutePredicateFactory> routePredicates,
RouteFactory routeFactory) {
this.routeDefinitionLocator = routeDefinitionLocator;
this.gatewayFilters = gatewayFilters;
this.routePredicates = routePredicates;
this.routeFactory = routeFactory;
}
@Override
public Flux<Route> getRoutes() {
return this.routeDefinitionLocator.getRouteDefinitions()
.flatMap(this::convertToRoute);
}
private Mono<Route> convertToRoute(RouteDefinition routeDefinition) {
List<Predicate<ServerWebExchange>> predicates = this.routePredicates.stream()
.map(factory -> factory.apply(routeDefinition.getId()))
.collect(Collectors.toList());
List<GatewayFilter> filters = this.gatewayFilters.stream()
.map(factory -> factory.apply(routeDefinition.getFilters()))
.collect(Collectors.toList());
return this.routeFactory.createRoute(routeDefinition, predicates, filters);
}
}
在这个类中,我们可以看到以下重要部分:
-
构造函数:它接收一个
RouteDefinitionLocator
,一个GatewayFilterFactory
列表,一个RoutePredicateFactory
列表,和一个RouteFactory
。这些都是从Spring容器中注入的。 -
getRoutes()
方法:该方法通过调用RouteDefinitionLocator.getRouteDefinitions()
来获取所有的RouteDefinition
,然后通过flatMap
操作符将每个RouteDefinition
转换为一个Route
对象。 -
convertToRoute(RouteDefinition routeDefinition)
方法:这个方法会将一个RouteDefinition
转换为一个Route
对象。转换过程中,会使用RoutePredicateFactory
列表和GatewayFilterFactory
列表来创建路由断言和过滤器。
这个类的主要作用就是将路由定义RouteDefinition
转换成实际可用的路由Route
,以供后续的路由匹配和过滤使用。
RouteDefinitionRouteLocator
类并不是Spring Cloud Gateway的官方源码,上面的代码只是一个简化版本,用来解释RouteDefinitionRouteLocator
工作原理。在实际的Spring Cloud Gateway源码中,这个类的名字是RouteDefinitionRouteLocator
,并且它的实现要复杂得多,包括处理各种异常情况,处理各种路由配置选项等等。