• Spring Cloud Gateway 路由构建器的源码分析


    Spring Cloud Gateway 路由构建器的源码分析


    Spring Cloud Gateway的路由构建器是用于创建和配置路由的核心组件之一。它允许你以编程方式定义路由规则,并设置各种路由属性和过滤器。下面是Spring Cloud Gateway路由构建器的源码分析:
    在这里插入图片描述

    1. 路由构建器的入口

    • 路由构建器的入口是RouteLocatorBuilder类,它是一个构建器模式的入口类。
    • 通过RouteLocatorBuilder,你可以创建和配置路由规则。

    2. 创建路由规则

    • 使用RouteLocatorBuilderroutes()方法创建一个RouteLocator实例,用于定义路由规则。
    • RouteLocatorBuilderroutes()方法返回一个Builder对象,通过该对象可以进行路由规则的设置和配置。

    3. 设置路由规则和属性

    • Builder对象提供了一系列方法用于设置路由规则和属性。
    • 可以使用Builderroute()方法设置路由规则,例如指定请求路径、目标URI等。
    • 可以使用Builder的各种属性方法设置路由的附加属性,例如请求谓词、过滤器等。

    4. 路由过滤器的设置

    • 通过Builderfilters()方法可以设置路由过滤器。
    • 可以使用过滤器工厂类(如GatewayFilterFactory)提供的方法创建过滤器,并将其添加到路由规则中。

    5. 构建和获取路由规则:

    • 使用Builderbuild()方法构建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成员变量包括:

    1. List:这是一个负责创建路由断言的工厂列表,断言用来判断请求是否满足特定条件。
    2. List:这是一个负责创建过滤器的工厂列表,过滤器用来对满足断言的请求进行处理。

    RouteLocatorBuilder的主要方法包括:

    1. routes():这个方法返回一个RouteLocatorBuilder.Builder对象,你可以在这个对象上使用诸如route()方法来定义路由。
    2. 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();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在此示例中,我们定义了一个路由,该路由将所有路径为"/get"的请求路由到"http://httpbin.org"。

    8.3 DefaultRouteLocator实现

    DefaultRouteLocator 是 Spring Cloud Gateway 的默认路由定位器实现,负责加载和转换路由定义。它的源代码比较复杂,这里只简要概述其主要功能和工作原理。

    DefaultRouteLocator的核心成员变量包括:

    1. RouteDefinitionLocator:用于从各种来源(例如内存,数据库,配置文件等)获取路由定义。
    2. List:用于根据路由定义创建断言,断言用于判断请求是否满足特定条件。
    3. List:用于根据路由定义创建过滤器,过滤器用于处理满足断言的请求。

    DefaultRouteLocator的主要方法是:

    1. 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());
        });
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    在这个类中,我们可以看到以下重要部分:

    1. 构造函数:它接收一个RouteDefinitionLocator,一个GatewayFilterFactory列表,一个RoutePredicateFactory列表,和一个RouteFactory。这些都是从Spring容器中注入的。

    2. getRoutes()方法:该方法通过调用RouteDefinitionLocator.getRouteDefinitions()来获取所有的RouteDefinition,然后通过flatMap操作符将每个RouteDefinition转换为一个Route对象。

    3. convertToRoute(RouteDefinition routeDefinition)方法:这个方法会将一个RouteDefinition转换为一个Route对象。转换过程中,会使用RoutePredicateFactory列表和GatewayFilterFactory列表来创建路由断言和过滤器。

    这个类的主要作用就是将路由定义RouteDefinition转换成实际可用的路由Route,以供后续的路由匹配和过滤使用。

    RouteDefinitionRouteLocator类并不是Spring Cloud Gateway的官方源码,上面的代码只是一个简化版本,用来解释RouteDefinitionRouteLocator工作原理。在实际的Spring Cloud Gateway源码中,这个类的名字是RouteDefinitionRouteLocator,并且它的实现要复杂得多,包括处理各种异常情况,处理各种路由配置选项等等。

  • 相关阅读:
    Java数据结构与算法---稀疏数组(二)
    C#winform OPCServer操作——KEPServerEX-6.4.321使用篇(二)西门子PLC添加变量
    每日一题42:最小化字符串长度
    【网络协议】RPC、REST API深入理解及简单demo实现
    Kurento多对多webrtc会议搭建测试
    优思学院|精益管理涵盖哪些内容?
    建模杂谈系列179 博弈推演模型探索
    Java框架(三)--Spring IoC容器与Bean管理(7)--基于注解配置IoC容器
    Spring面试题1:Spring框架的核心功能是什么?Spring框架的好处是什么?
    最接近的三数之和 c++
  • 原文地址:https://blog.csdn.net/wangshuai6707/article/details/133853418