当前位置: 首页 > news >正文

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,并且它的实现要复杂得多,包括处理各种异常情况,处理各种路由配置选项等等。

相关文章:

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

Spring Cloud Gateway 路由构建器的源码分析 文章目录 1. 路由构建器的入口2. 创建路由规则3. 设置路由规则和属性4. 路由过滤器的设置5. 构建和获取路由规则&#xff1a;6. 实例化路由构建器&#xff1a;8. 路由构建器的源码分析8.1 RouteLocator接口8.2 RouteLocatorBuilder…...

IT行业哪个方向比较好就业?

IT行业哪个方向比较好就业? IT行业里&#xff0c;哪些方向更好就业&#xff0c;这是一个很常见也很重要的问题。不同的IT方向有不同的技能要求、就业前景和发展空间&#xff0c;因此需要根据自己的兴趣、能力和目标来选择合适的方向。 软件开发与工程&#xff1a;软件开发是…...

uniapp中nvue页面使用fixed后,数据更改不更新到该视图。

解决方案&#xff1a;position: fixed;定位改成position: absolute; 记录一下&#xff0c;遇到这个贼离谱的问题&#xff0c;uniapp项目里的nvue页面因为要弄个引导蒙版&#xff0c;所以使用了fixed定位&#xff0c;点击蒙版关闭&#xff0c;加了this.$forceUpdate()也不行&am…...

力扣第55题 跳跃游戏 c++ 贪心 + 覆盖 加暴力超时参考

题目 55. 跳跃游戏 中等 相关标签 贪心 数组 动态规划 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &…...

系列十四、Redis的集群(一)

一、是什么 1.1、概述 由于数据量过大&#xff0c;单个master-slave模式难以承担&#xff0c;当出现master节点故障的一瞬间&#xff0c;哨兵重新选举新的master节点之前&#xff0c;这一小段时间将会导致Redis服务不可用&#xff0c;因此需要对多个master-slave主从复制集进行…...

红帽认证 | RHCE考试包括哪些内容?

Red Hat Certified Engineer&#xff08;RHCE&#xff09;考试是一项面向企业级系统管理员的认证考试&#xff0c;是认证Linux系统管理员技能的一种方式。 RHCE证书是Linux管理员领域中最受欢迎和最受认可的证书之一。 那RHCE考试都有哪些内容呢&#xff0c;一起来看看吧&…...

ASPICE标准快速掌握「3.1. 实践示例」

实践示例 本章内容是最重要的,建议慢下来跟着博主的思路一步一步前进 1. 示例背景说明 假设我们现在是一个Tier1的车窗控制软件开发商,我们给OEM提供软件解决方案 1.1. 本过程目标 根据客户、上级部门、安全团队与质量团队等提出的要求,本项目要求SYS.1过程达到ASPICE过…...

pytorch 训练可视化

pytorch 训练可视化 1.from torch.utils.tensorboard 1.from torch.utils.tensorboard from torch.utils.tensorboard import SummaryWriter在最新版本的pytorch中官方提供了tensorboard的api。以下是官方教程的链接 https://pytorch.org/tutorials/intermediate/tensorboard…...

webgis开发参考资料

一、ArcGIS相关 1、ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用 http://zhihu.geoscene.cn/article/1038 2、arcgis server 紧促&#xff08;bundle&#xff09;格式缓存文件的读取 https://blog.csdn.net/abc553226713/article/details/8668839 3、ArcGIS 10.0紧…...

JSX 注意事项

学习目标&#xff1a; 掌握 JSX 实际开发过程中的一些注意事项   1. JSX 必须具有一个根节点&#xff0c;如果没有根节点可以使用<></>(幽灵节点)代替根节点将所有元素包裹起来 function App() {return (<><div className"App">1</div&…...

MQ常见的问题(kafka保证消息不丢失)

MQ常见的问题 1&#xff0c;mq如何避免消息堆积问题。 消息堆积&#xff1a;生产者的生产速率远远大于消费者的消费速率&#xff0c;使消息大批量的堆积在消息队列。 解决方案&#xff1a;1&#xff0c;提升消费者的消费速率&#xff08;增加消费者集群&#xff09; 2&…...

Unity编辑器扩展 --- AssetPostprocessor资源导入自动设置

unity导入资源的编辑器设置: 防止策划资源乱导入,资源导入需要的格式&#xff0c;统一资源管理 AssetPostprocessor资源导入管线 AssetPostprocessor用于在资源导入时自动做一些设置&#xff0c;比如当导入大量图片时&#xff0c;自动设置图片的类型&#xff0c;大小等。Ass…...

用Flask快速生成报表

一、前言 《用Python快速生成报表之一》 我们介绍了用html-table快速生成表格数据报表&#xff0c;今天我们再介绍一下用Python Flask 快速开发报表&#xff0c;使用的是最古老的套页面方式。 二、Flask快速生成报表 Python有N多Web框架&#xff0c;最强大最出名的是Django&…...

关于时序预测可解释性预测

本文做一些论文收集使用&#xff0c;先更新一两篇 论文 1 Learning Structured Components: Towards Modular and Interpretable Multivariate Time Series Forecasting 论文地址&#xff1a; https://browse.arxiv.org/pdf/2305.13036.pdf 论文代码&#xff1a;https://gi…...

泊车功能专题介绍 ———— AVP系统技术要求之场地规范定位要求

文章目录 停车场场地规范场地分级规范场地标识规范位置标识跨层标识十字路口标识丁字路口处标识闸口/收费口标识上下车点标识 定位功能要求环境要求定位精度要求场端定位要求道路自动驾驶定位要求泊车入位定位要求 车端定位要求道路自动驾驶定位要求泊车入位定位要求初始定位要…...

【STM32】时钟设置函数(寄存器版)

一、STM32时钟设置函数移植 1.时钟模块回顾 一个疑问 前面代码并没有设置时钟为什么可以直接使用。 2.时钟树 3.时钟树分析 1.内部晶振&#xff08;HSI&#xff09; 内部晶振不稳定&#xff0c;当我们上电后&#xff0c;会自动产生振动&#xff0c;自动产生时钟&#xff0c;…...

【DDD】贫血模型和充血模型

基于业务开发的项目大多是MVC架构的。成为Web项目的标准开发模式&#xff0c;但它却是违反面向对象编程风格的&#xff0c;是面向过程的。之后基于领域驱动设计开发模式被人提倡。 DDD&#xff08;Domain-driven design&#xff09;领域驱动设计是一种通过将实现连接到持续进化…...

【JS学习】字符串的substring方法

1. 介绍 substring 是JavaScript字符串对象的一个方法&#xff0c;用于从一个字符串中提取子字符串&#xff0c;并返回提取的部分。 可以使用 substring 方法来截取字符串的一部分&#xff0c;指定起始索引和结束索引&#xff08;或只指定起始索引&#xff09;。 这个方法不…...

vue部署,chunk文件有部分404,解决方案

排查方案&#xff1a; 1&#xff0c;检查项目配置&#xff0c;再vue.config.js里面配置 publicPath: "./",2&#xff0c;打包后检查报错文件是否存在打包目录 3&#xff0c;如果1,2都有 找到部署后404的文件&#xff0c;查看是否为空文件 style里面全注释也会打包文…...

《红蓝攻防对抗实战》六.常规反弹之利用NC在windows系统执行反弹shell

目录 一.利用NC工具在windows系统执行反弹shell 1. Windows正向连接shell 2.Windows反向连接shell 前文推荐&#xff1a; 《红蓝攻防对抗实战》一. 隧道穿透技术详解《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网《红蓝攻防对抗实战》三.内网探测协议出网…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...