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

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. 创建路由规则

  • 使用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<RoutePredicateFactory>:这是一个负责创建路由断言的工厂列表,断言用来判断请求是否满足特定条件。
  2. List<RouteFilterFactory>:这是一个负责创建过滤器的工厂列表,过滤器用来对满足断言的请求进行处理。

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();
}

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

8.3 DefaultRouteLocator实现

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

DefaultRouteLocator的核心成员变量包括:

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

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());});
}

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;}@Overridepublic 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. 构造函数:它接收一个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,并且它的实现要复杂得多,包括处理各种异常情况,处理各种路由配置选项等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/166292.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA NCCL 源码学习(十一)- ring allreduce

之前的章节里我们看到了nccl send/recv通信的过程&#xff0c;本节我们以ring allreduce为例看下集合通信的过程。整体执行流程和send/recv很像&#xff0c;所以对于相似的流程只做简单介绍&#xff0c;主要介绍ring allreduce自己特有内容。 单机 搜索ring 在nccl初始化的过…

golang 反射机制

在 go 语言中&#xff0c;实现反射能力的是 reflect包&#xff0c;能够让程序操作不同类型的对象。其中&#xff0c;在反射包中有两个非常重要的 类型和 函数&#xff0c;两个函数分别是&#xff1a; reflect.TypeOfreflect.ValueOf 两个类型是 reflect.Type 和 reflect.Value…

嵌入式软件开发笔试面试

C语言部分&#xff1a; 1.gcc的四步编译过程 1.预处理 展开头文件&#xff0c;删除注释、空行等无用内容&#xff0c;替换宏定义。 gcc -E hello.c -o hello.i 2.编译 检查语法错误&#xff0c;如果有错则报错&#xff0c;没有错误则生成汇编文件。 gcc -S hello.i -o h…

shell算术运算符

文章目录 算术运算符&#xff1a;算术运算扩展算术运算指令expr算术运算指令let自增自减运算符 算术运算符&#xff1a; 加法 - 减法 * 乘法 / 除法 % 取余 ** 幂运算算术运算扩展 算术运算扩展的运算数只能是整数 [rootlocalhost tmp]# num1$[41] [rootlocalhost tmp]# echo …

[人工智能-综述-15]:第九届全球软件大会(南京)有感 -4-大语言模型全流程、全方面提升软件生产效能

目录 一、软件生产通用模型 1.1 企业软件生产模型 1.2 软件项目管理 VS 软件工程 1.3 企业管理与部门管理 二、第一步&#xff1a;企业数字化&#xff1a;企业信息系统 三、第二步&#xff1a;软件生产自动化&#xff1a;DevOps 四、第四步&#xff1a;软件生产智能化&a…

【Spring Cloud】如何确定微服务项目的Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本

文章目录 1. 版本选择2. 用脚手架快速生成微服务的pom.xml3. 创建一个父工程4. 代码地址 本文描述如何确定微服务项目的Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本。 1. 版本选择 我们知道Spring Boot、Spring Cloud、Spring Cloud Alibaba的版本选择一致性非常重…

CUDA学习笔记(二)CUDA简介

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/&#xff0c;仅用于学习。 CUDA是并行计算的平台和类C编程模型&#xff0c;我们能很容易的实现并行算法&#xff0c;就像写C代码一样。只要配备的NVIDIA GPU&#xff0c;就可以在许多设备上运行你的并行程序&#xf…

Linux中的shell编程

shell编程 重定向 cat >temp 输入内容到temp文件中&#xff0c;如果存在temp则覆盖&#xff0c;没有则新建 cat >>temp 追加内容 cat temp1>>temp2 将temp1中的内容追加到temp 命令执行控制符号 ; 一个命令行执行多条语句 命令替换符 1.双引号&#…

Node学习笔记之path模块

path 模块提供了 操作路径 的功能&#xff0c;我们将介绍如下几个较为常用的几个 API&#xff1a; API 说明 path.resolve 拼接规范的绝对路径常用 path.sep 获取操作系统的路径分隔符 path.parse 解析路径并返回对象 path.basename 获取路径的基础名称 path.dirname…

C#接口和继承的区别、联系与使用场景

在C#编程语言中&#xff0c;接口和继承是两个核心的概念。本文将详细介绍接口和继承之间的区别与联系&#xff0c;并探讨它们在实际编程中的使用场景。通过代码示例和详细说明&#xff0c;读者将能够深入理解这两个概念的功能和用法。 目录 引言1. 区别与联系1.1 区别1.2 联系 …

pytorch,tf维度理解RNN

input_t input_t.squeeze(1) 这行代码用于从 input_t 中去除尺寸为1的维度。在深度学习中&#xff0c;经常会出现具有额外尺寸为1的维度&#xff0c;这些维度通常是为了匹配模型的期望输入维度而添加的。 在这里&#xff0c;input_t可能具有形状 (batch_size, 1, feature_dim…

HTML+CSS+JS+Django 实现前后端分离的科学计算器、利率计算器

&#x1f9ee;前后端分离计算器 &#x1f4da;git仓库链接和代码规范链接&#x1f4bc;PSP表格&#x1f387;成品展示&#x1f3c6;&#x1f3c6;科学计算器&#xff1a;1. 默认界面与页面切换2. 四则运算、取余、括号3. 清零Clear 回退Back4. 错误提示 Error5. 读取历史记录Hi…

基于SSM的文化培训学校网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

【LeetCode】145. 二叉树的后序遍历 [ 左子树 右子树 根结点]

题目链接 文章目录 Python3方法一&#xff1a; 递归 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二&#xff1a; 迭代 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法三&#xff1a; Morris ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1) \rgroup ⟮O(n)、O(1)⟯写…

[SQL | MyBatis] MyBatis 简介

目录 一、MyBatis 简介 1、MyBatis 简介 2、工作流程 二、入门案例 1、准备工作 2、示例 三、Mapper 代理开发 1、问题简介 2、工作流程 3、注意事项 4、测试 四、核心配置文件 mybatis-config.xml 1、environment 2、typeAilases 五、基于 xml 的查询操作 1、…

Flutter之Widget生命周期

目录 初始化构造函数initStatedidChangeDependencies 运行时builddidUpdateWidget 组件移除deactivatedisposereassemble 函数生命周期说明&#xff1a;实际场景App生命周期 前言&#xff1a;生命周期是一个组件加载到卸载的整个周期&#xff0c;熟悉生命周期可以让我们在合适的…

嵌入式养成计划-46----QT--简易版网络聊天室实现

一百一十九、简易版网络聊天室实现 119.1 QT实现连接TCP协议 119.1.1 基于TCP的通信流程 119.1.2 QT中实现服务器过程 使用QTcpServer实例化一个服务器对象设置监听状态&#xff0c;通过listen()函数&#xff0c;可以监听特定的主机&#xff0c;也可以监听所有客户端&#x…

Cannot load from short array because “sun.awt.FontConfiguration.head“ is null

错误描述 在使用Easyexcel时发生了报错&#xff0c;请求返回空白 但是只在Linux上出现了该报错&#xff0c;在本地windows环境没有出现 JDK都使用的是17版本 错误原因 由于在linux上缺失Easyexcel使用的字体导致 解决办法 下载一个jdk1.8 在其jre/lib目录里复制fontconfi…

VTK8.0.0编译+QT5.9.2+VS2017

背景 VTK网上资料较多并且使用较多的版本可能是VTK8.2.0&#xff0c;但是由于之前先配置了QT 5.9.2 msvc2017 PCL1.8.1 VTK8.0.0环境&#xff0c;听说有人PCL1.8.1配置VTK8.2.0实测版本不兼容&#xff0c;需修改源码调试&#xff0c;比较麻烦&#xff0c;所以之前就使用的VT…

Ultralytics YOLOv8的关键特点

计算机视觉领域正在迅速增长&#xff0c;其中最重要的技术之一是目标检测。每六个月都会出现新的目标检测算法&#xff0c;不断提高准确性&#xff0c;与之前的算法相比。Ultralytics YOLOv8是最先进的目标检测算法&#xff0c;不仅提供卓越的准确性&#xff0c;还支持CPU和GPU…