当前位置: 首页 > 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协议探测出网《红蓝攻防对抗实战》三.内网探测协议出网…...

万象熔炉 | Anything XL部署教程:ARM架构(Jetson Orin)边缘端适配记录

万象熔炉 | Anything XL部署教程&#xff1a;ARM架构&#xff08;Jetson Orin&#xff09;边缘端适配记录 1. 项目简介与核心价值 最近在折腾边缘计算设备&#xff0c;手头的Jetson Orin Nano开发者套件性能不错&#xff0c;但一直想找个能稳定跑起来的图像生成模型。SDXL效果…...

ollama部署embeddinggemma-300m:面向初创团队的低成本AI基建方案

ollama部署embeddinggemma-300m&#xff1a;面向初创团队的低成本AI基建方案 对于很多初创团队来说&#xff0c;AI能力听起来很美好&#xff0c;但落地起来却困难重重。动辄需要云端GPU、复杂的部署流程和昂贵的API调用费用&#xff0c;让不少团队望而却步。有没有一种方案&am…...

逆变器核心技术解析:锁相环(PLL)在并网系统中的应用与优化

1. 锁相环(PLL)在并网逆变器中的核心作用 想象一下你正在参加一场合唱比赛&#xff0c;如果每个人的节奏都不一致&#xff0c;整个表演就会变得杂乱无章。并网逆变器面临的也是类似的问题——它需要与电网保持完美的"节奏同步"&#xff0c;而这个"指挥家"就…...

ooderAgent 龙虾时代的统一认证体系

当 Agent 从"工具"进化为"伙伴"&#xff0c;账户体系如何重新定义人机协作的信任边界&#xff1f; ​ 协议版本&#xff1a;ooderAgent v1.0.0 | 发布日期&#xff1a;2026-04-08 | 维护团队&#xff1a;ooderAgent Team 一、引言&#xff1a;从 0.7.3 到 …...

**为生命按下“刷新键”:当细胞科技成为健康管理的新日常**

清晨六点半&#xff0c;张教授在太湖边完成了他的五公里慢跑。这位年近六十的物理学博导&#xff0c;面色红润&#xff0c;步伐稳健&#xff0c;让许多年轻同事都自叹不如。朋友们常打趣问他保养秘诀&#xff0c;他总是笑笑说&#xff1a;“不过是尊重科学&#xff0c;提前管理…...

如何永久保存微信聊天记录?这个免费工具让你轻松备份和分析所有对话![特殊字符]

如何永久保存微信聊天记录&#xff1f;这个免费工具让你轻松备份和分析所有对话&#xff01;&#x1f680; 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https:…...

可视化监控OpenClaw:Qwen3-14B任务执行看板搭建

可视化监控OpenClaw&#xff1a;Qwen3-14B任务执行看板搭建 1. 为什么需要监控OpenClaw&#xff1f; 去年冬天的一个深夜&#xff0c;我被连续不断的微信消息惊醒——团队部署的OpenClaw自动化流程突然陷入死循环。由于缺乏实时监控&#xff0c;这个消耗了上千Token的异常任务…...

如何将Sublime Text打造成Python开发利器:Anaconda插件终极指南

如何将Sublime Text打造成Python开发利器&#xff1a;Anaconda插件终极指南 【免费下载链接】anaconda Anaconda turns your Sublime Text 3 in a full featured Python development IDE including autocompletion, code linting, IDE features, autopep8 formating, McCabe co…...

达梦数据库图形化安装界面常见报错及解决方案

1. 达梦数据库图形化安装界面常见报错解析 达梦数据库作为国产数据库的代表之一&#xff0c;在企业级应用中越来越普及。但在实际安装过程中&#xff0c;尤其是图形化安装界面环节&#xff0c;不少用户会遇到各种报错问题。我自己在第一次安装达梦数据库时也踩过不少坑&#xf…...

Pagefind静态搜索库:10个关键技巧实现大规模网站的高效低带宽搜索

Pagefind静态搜索库&#xff1a;10个关键技巧实现大规模网站的高效低带宽搜索 【免费下载链接】pagefind Static low-bandwidth search at scale 项目地址: https://gitcode.com/gh_mirrors/pa/pagefind Pagefind是一款革命性的静态搜索库&#xff0c;专为大规模网站设计…...