SpringCloud Gateway 初始化加载流程源码解析

Spring Cloud Gateway 初始化加载流程包括以下几个关键步骤:从配置文件读取配置、初始化路由定义、注册过滤器和断言工厂等。下面是对这些步骤的源码解析。

1. 从配置文件读取配置

Spring Cloud Gateway 使用 Spring Boot 的配置机制,从配置文件(如 application.ymlapplication.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 提供了一些默认的全局过滤器,如 NettyRoutingFilterNettyWriteResponseFilter 等。

@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 提供了多种默认的断言工厂,如 PathRoutePredicateFactoryMethodRoutePredicateFactory 等。

@Configuration
public class PredicateFactoryConfiguration {
    @Bean
    public PathRoutePredicateFactory pathRoutePredicateFactory() {
        return new PathRoutePredicateFactory();
    }

    @Bean
    public MethodRoutePredicateFactory methodRoutePredicateFactory() {
        return new MethodRoutePredicateFactory();
    }
}

5. 路由初始化

在 Spring Cloud Gateway 启动时,RouteDefinitionLocatorRouteDefinitionRepository 会协同工作,加载和存储路由定义,并通过 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 的各种机制协同工作,确保在启动时能够正确加载和配置所有必要的组件和路由。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值