Spring Cloud Gateway 初始化加载流程包括以下几个关键步骤:从配置文件读取配置、初始化路由定义、注册过滤器和断言工厂等。下面是对这些步骤的源码解析。
1. 从配置文件读取配置
Spring Cloud Gateway 使用 Spring Boot 的配置机制,从配置文件(如 application.yml
或 application.properties
)中读取配置。相关配置主要在 spring.cloud.gateway
下定义。
spring:
cloud:
gateway:
routes:
- id: route1
uri: http://example.com
predicates:
- Path=/foo/**
filters:
- AddRequestHeader=X-Request-Id, 1
2. 初始化路由定义
Spring Cloud Gateway 使用 RouteDefinitionLocator
接口来加载和解析路由定义。默认实现类是 PropertiesRouteDefinitionLocator
,它从配置文件中读取路由配置。
public class PropertiesRouteDefinitionLocator implements RouteDefinitionLocator {
private final RouteProperties properties;
public PropertiesRouteDefinitionLocator(RouteProperties properties) {
this.properties = properties;
}
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
return Flux.fromIterable(this.properties.getRoutes());
}
}
3. 路由定义存储
路由定义存储在 RouteDefinitionRepository
中。默认实现类是 InMemoryRouteDefinitionRepository
,它将路由定义存储在内存中。
public class InMemoryRouteDefinitionRepository implements RouteDefinitionRepository {
private final Map<String, RouteDefinition> routes = new ConcurrentHashMap<>();
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
return Flux.fromIterable(this.routes.values());
}
@Override
public Mono<Void> save(Mono<RouteDefinition> route) {
return route.doOnNext(routeDefinition -> this.routes.put(routeDefinition.getId(), routeDefinition)).then();
}
@Override
public Mono<Void> delete(Mono<String> routeId) {
return routeId.doOnNext(this.routes::remove).then();
}
}
4. 注册过滤器和断言工厂
Spring Cloud Gateway 提供了丰富的过滤器和断言工厂。它们在启动时通过 Spring 的依赖注入机制自动注册。
过滤器注册
过滤器通过实现 GlobalFilter
接口注册。Spring Cloud Gateway 提供了一些默认的全局过滤器,如 NettyRoutingFilter
、NettyWriteResponseFilter
等。
@Configuration
public class GatewayAutoConfiguration {
@Bean
@Order(Ordered.LOWEST_PRECEDENCE)
public NettyRoutingFilter routingFilter(
HttpClient httpClient,
ObjectProvider<List<HttpHeadersFilter>> headersFilters) {
return new NettyRoutingFilter(httpClient, headersFilters);
}
@Bean
@Order(Ordered.LOWEST_PRECEDENCE)
public NettyWriteResponseFilter nettyWriteResponseFilter(GatewayProperties properties) {
return new NettyWriteResponseFilter(properties);
}
}
断言工厂注册
断言工厂通过实现 RoutePredicateFactory
接口注册。Spring Cloud Gateway 提供了多种默认的断言工厂,如 PathRoutePredicateFactory
、MethodRoutePredicateFactory
等。
@Configuration
public class PredicateFactoryConfiguration {
@Bean
public PathRoutePredicateFactory pathRoutePredicateFactory() {
return new PathRoutePredicateFactory();
}
@Bean
public MethodRoutePredicateFactory methodRoutePredicateFactory() {
return new MethodRoutePredicateFactory();
}
}
5. 路由初始化
在 Spring Cloud Gateway 启动时,RouteDefinitionLocator
和 RouteDefinitionRepository
会协同工作,加载和存储路由定义,并通过 RouteLocator
实现类(如 RouteDefinitionRouteLocator
)进行初始化。
public class RouteDefinitionRouteLocator implements RouteLocator {
private final RouteDefinitionLocator routeDefinitionLocator;
private final List<GatewayFilterFactory> gatewayFilterFactories;
private final List<RoutePredicateFactory> predicates;
private final RouteDefinitionRepository routeDefinitionRepository;
public RouteDefinitionRouteLocator(RouteDefinitionLocator routeDefinitionLocator,
List<GatewayFilterFactory> gatewayFilterFactories,
List<RoutePredicateFactory> predicates,
RouteDefinitionRepository routeDefinitionRepository) {
this.routeDefinitionLocator = routeDefinitionLocator;
this.gatewayFilterFactories = gatewayFilterFactories;
this.predicates = predicates;
this.routeDefinitionRepository = routeDefinitionRepository;
}
@Override
public Flux<Route> getRoutes() {
return this.routeDefinitionLocator.getRouteDefinitions()
.map(this::convertToRoute)
.collectList()
.flatMapMany(Flux::fromIterable);
}
private Route convertToRoute(RouteDefinition routeDefinition) {
// Convert RouteDefinition to Route
}
}
总结
Spring Cloud Gateway 的初始化加载流程主要包括从配置文件读取配置、初始化路由定义、注册过滤器和断言工厂等步骤。这些步骤通过 Spring Boot 和 Spring Cloud 的各种机制协同工作,确保在启动时能够正确加载和配置所有必要的组件和路由。