浅谈Spring Cloud Gateway源码

news2025/7/19 7:10:54

本文不谈Spring Cloud Gateway相关的使用,仅梳理在微服务项目中,在使用Spring Cloud Gateway做为服务网关后,接收到请求后的大体执行流程。


文章目录

  • 大致流程图
  • 具体流程
    • 一、DispatcherHandler
    • 二、getHandler
      • 1、getHandlerInternal
      • 2、lookupRoute
      • 3、RouteDefinitionRouteLocator.getRoutes()
      • 4、r.getPredicate().apply()
      • 5、AbstractRoutePredicateFactory(断言配置predicates)
    • 三、invokeHandler
      • 1、FilteringWebHandler(过滤器配置filters)
      • 2、filter(exchange)

大致流程图

不难发现gateway的主体流程并不复杂,换句话说,gateway的源码不是特别难。唯一膈应的就是大量使用了jdk8的新特性,调试代码极不方便。



具体流程

流程图比较粗略,具体细节可以往下看

一、DispatcherHandler

该组件可以类比于Spring MVC中的DispatcherServlet。这里不在赘述Spring MVC接收到一个请求之后的跳转逻辑,如果对相关源码感兴趣的,可以查看我之前关于Spring MVC源码的分析。

浅谈SpringMVC源码的SpringServletContainerInitializer的完整加载流程

浅谈SpringMVC源码的DispatcherServlet组件执行流程

我们都知道,如果我们要使用Spring Cloud Gateway,需要移除Sping MVC相关的依赖,否则会出现依赖冲突。其本质是因为,Spring Cloud Gateway中是使用WebFlux替代了常规的Spring MVC做为请求转发,由于WebFlux是基于响应式编程,所以在面对大量请求的时候,性能是要明显优于Spring MVC的。



补充一点自己对技术相关的思考

以我一个毕业一年的Java开发从业者的角度看来,很多中间级提升效率的底层逻辑都差不多。这里以一篇我曾经记录的IO模型说明为起点:请不要再说NIO和多路复用IO是同一个东西了(内含BIO、NIO、多路复用、Netty、AIO案例测试代码) 。真的就有点万变不离其宗的味道。

我们熟知的高性能中间件,如Redis、Netty,包括我们这里说的WebFlux,它们底层不都是Reactor模型嘛。都是摒弃传统的一条龙执行到底的策略,使用基于事件响应的策略,继而达到提高响应性能的效果。但是有一说一,这种源码是真调试,对初学者并不友好。



前文我说过该组件可以类比于Spring MVC中的DispatcherServlet,所以不难发现该部分的代码逻辑风格大体相同

那么主要也就是两条路,一条是getHandler,一条是invokeHandler



二、getHandler

获取对应的处理器list,然后依次对每一个处理器进行响应的判断,要么返回一个empty,要么就是原样返回

1、getHandlerInternal

由于我们是在学习gateway相关的源码,所以可以直接跳转到gateway包下面的AbstractHandlerMapping抽象类的实现类中

该方法也可以主要分为3部分:

1、完成相关的参数判断,满足条件直接返回empty

2、调用lookupRoute方法,完成具体逻辑(重点)

3、移除exchange中的GATEWAY_PREDICATE_ROUTE_ATTR标签(这个标签是lookupRoute方法中放进去的)


2、lookupRoute

该方法内部内部分为三部分:

1、获取到所有的router信息,也就是我们配置在yaml中的配置

2、执行apply方法,完成路径相关的处理(我们想自己拼接相关的字符串)

3、其他的校验和日志打印


3、RouteDefinitionRouteLocator.getRoutes()

根据方法我们不难看出,gateway的解析逻辑为,将我们配置的每一组路由信息,会封装为一个RouteDefinition对象,然后调用convertToRoute方法,转换为一个Route对象,即就是我们的路由信息

获取解析后的配置信息的逻辑比较简单,可以自行了解。前文的获取getRouteDefinitions也就会调用该方法,即表示调用GatewayProperties类中的getRoutes方法。GatewayProperties想都不用想,直接就是一个@ConfigurationProperties注解,配置一个前缀,借助Spring Boot的能力,完成文件解析。


4、r.getPredicate().apply()

r即为route,获取路由信息上配置的断言接口,此处完成调用。用技术的角度来说,就是初始化route对象的时候,其中一个参数是函数式接口类型,这里就会拿到对应的属性,完成方法的调用。

具体有哪些类型的


5、AbstractRoutePredicateFactory(断言配置predicates)

这是gateway里面一个十分重要的扩展抽象类,即第4点中的断言工厂具体有多少种,如何使用,可以参考官方文档。我认为功能就可以类比为一个Filter差不多

我们这里可以简单看一个比较简单的实现:HeaderRoutePredicateFactory

1、首先获取我们的请求中的请求头,封装为一个list

2、如果list为空,或者和我们配置的断言工厂没有匹配的都会返回false。



三、invokeHandler

前文我们已经获取到了handlerMapping,并且进行了相关的断言处理。接下来我们要真正的开始处理我们的请求了,即调用handle方法。

这里和Spring MVC的代码写法类似

同样的,我们这里直接跳转到gateway对应的类中进行具体的逻辑处理


1、FilteringWebHandler(过滤器配置filters)

这个类里面的代码就很简单了,这里也出现了我们所熟知的GatewayFilter和GlobalFilter,即一个是作用在具体的路由路径上,一个是作用在所有的路由请求上。这两种不同类型接口放入一个list中,使用了一个适配器模式,这里就不再赘述,可参考:适配器模式(Gateway中GatewayFilter和GlobalFilter整合实现)


2、filter(exchange)

根据代码风格,我们也可以明白,该步骤完成的功能是把我们所有的Filter构建为一个责任链模式的调用形式,然后完成对应的责任链的中逻辑。

这里具体会有哪些Filter就根据你自己的配置了。

  • GatewayFilter则直接看具体的内部类实现。
  • GlobalFilter的调用逻辑则是位于GatewayFilterAdapter类中(适配器包了一层)。这里的请求就包含了把请求发送到具体服务器的功能

相关的Filter则都是以@Bean的形式加入到了Spring的容器中



补充两张Filter的功能图:
在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GlobalMapper精品教程】027:路径剖面和和视线工具的使用

文章目录 一、路径剖面简介二、创建剖面图1. 加载DEM2. 创建剖面图3. 计算填挖方3. 保存剖面图一、路径剖面简介 路径剖面视线工具允许您使用加载的高程数据集沿用户指定的路径获取垂直剖面。 要定义生成3D路径剖面所遵循的路径,只需单击鼠标左键选择路径的点,然后石键单击…

[acwing周赛复盘] 第 60 场周赛20220716

[acwing周赛复盘] 第 60 场周赛20220716 一、本周周赛总结二、 4722. 数列元素1. 题目描述2. 思路分析3. 代码实现三、4723. 队列1. 题目描述2. 思路分析3. 代码实现四、4724. 靓号1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 第一次打acwing,…

POJ1007:DNA排序

一、Description One measure of unsortedness in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence DAABEC’‘, this measure is 5, since D is greater than four letters to its ri…

傻白入门芯片设计,典型的2D/2D+/2.5D/3D封装技术(六)

集成电路终于成为了一级学科,对集成电路领域的投入也日益加大,集成电路属于电子集成技术的一种,那么,现在的电子集成技术发展到了什么程度呢? 先进的电子集成技术可以在不到芝麻粒大小的1平方毫米内集成1亿只以上的晶体…

Tableau 合集3:格式设置之可视化图显示百分比和提示工具对齐问题

一、前言 本文通过可视化图中显示不了百分比和提示工具无法对齐两个小问题出发,介绍了关于Tableau设置格式和工具提示的一些使用方法。 环境:Windows11 64位、Tableau desktop 2021.2 二、问题1:可视化图中显示不了百分比 问题描述&#…

springboot整合其它项目(连接池和监控)

目录 一、整合Druid 1. Druid是什么? 2.如何在Spring Boot中集成Druid连接池和监控? 二、整合Redis 1.集成redis之非注解式开发 2.集成redis之注解缓存开发 一、整合Druid 1. Druid是什么? Druid是Java语言中最好的数据库连接池。…

paddleocr识别模型训练记录

准备数据集 自己新建目录 下载识别预训练模型 下载之后是一个压缩包,解压后(注意:rec是自己新建的目录) 修改配置文件 修改内容: 1.训练后模型存储目录; 2.是否训练可视化; 3.训练数据集图…

tensorflow2 minist手写数字识别数据训练

✨ 博客主页:小小马车夫的主页 ✨ 所属专栏:Tensorflow 文章目录前言一、tenosrflow minist手写数字识别代码二、输出三、参考资料总结前言 刚开始学习tensorflow, 首先接触的是minist手写数字识别,用的梯度下降算法,…

linux下mysql的三种安装方法

目录1. 离线安装(.tar.gz安装包)2. 离线安装(rpm安装包)3. 在线安装(yum安装)前言安装环境 : Redhat Enterprise Linux 81. 离线安装(.tar.gz安装包) 参考这篇博客 2. 离线安装&am…

HTB-Toolbox

HTB-Toolbox信息收集提权信息收集 使用nmap简单扫描一下网站端口。 21 ftp22 ssh443 https? 去https看看。 网站基本是静态的。因为是https,所以有ssl协议,去看看吧。 more information里面能找到协议。 找到admin.megalogistic.com子域。…

Spring(完整版)

文章目录一、Spring(一)、Spring简介1、Spring概述2、Spring家族3、Spring Framework1、Spring Framework五大功能模块2、Spring Framework特性(二)、控制反转IOC1、IOC容器1、IOC思想2、IOC容器在Spring中的两种实现方式①BeanFactory②ApplicationContext③ApplicationContex…

配置elasticsearch用windows account(AD)登录

配置elasticsearch用windows account(AD)登录编辑es的配置文件创建role mapping文件添加windows account的密码给role mapping和cacert文件正确的权限重启kibana和elasticsearch在kibana页面登陆elasticsearch参考文章:• https://www.elasti…

vue中如何使用swiper以及解决swiper初始化过早的问题

后端的返回的数据用数组接收; 把swiper放到根组件里的mounted,也会出现swiper先初始化,dom再加载的问题: swiper初始化在mounted里执行;setTimeout定时器是从后端请求回来的数据; 代码执行顺序是:当组件创…

Eureka Server配置

01.Eureka Server配置 Eureka Server提供注册服务,各个节点启动后,会在EurekaServer中进行注册,Eureka Server会存储所有可用信息的服务节点,其信息可以在界面中直观的观察到。(服务注册中心 CAP核心理论 一个分布式…

(十六)Spring对事务的支持

文章目录环境事务概述引入事务场景第一步:准备环境第二步:编写持久层第三步:编写业务层第四步:编写Spring配置文件第五步:编写表示层(测试程序)模拟异常Spring对事务的支持Spring事务管理API声明…

mysql-6-主从复制搭建

1 总结 1:主从复制最大缺陷就是延迟。 2 搭建前的准备 2.1复制的基本原则 每个slave只有一个master每个slave只能有一个唯一的服务器ID每个master可以有多个slavemysql版本尽量一致,防止出问题。两台服务能ping通MySQL主从是基于binlog的,主上…

Face Global | 创龙科技2款新品登陆TI全球官网

日前,创龙科技AM62x、AM64x处理器平台齐登TI全球官方网站,向全球TI用户提供高可靠性的工业核心板以及工业评估套件。 图 1 TI全球官网截图-AM64x 图 2 TI全球官网截图-AM62x 创龙科技(Tronlong)作为TI中国官方合作伙伴,自2013年成立以来,已基于TI Sitara、C6000、DaVinci、…

【网络安全必看】如何提升自身WEB渗透能力?

前言 web渗透这个东西学起来如果没有头绪和路线的话,是非常烧脑的。 理清web渗透学习思路,把自己的学习方案和需要学习的点全部整理,你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词,叫35岁危机,&#xf…

OSPF路由策略引入

功能介绍: distribute-list 分发列表,通过distribute-list 工具对路由更新进行控制,只能进行路由条目过滤,不能修改路由的属性。 一、组网要求 在R2上把rip路由重分发进ospf,并且在重分发时进行路由过滤,…

【云原生】Docker-compose单机容器集群编排

内容预知 1.Compose的相关知识 1. Compose的相关概念 2. 为何需要docker-compose docker镜像管理的问题 Docker Compose的解决方案 3. Compose的特征 2. Docker-compose的安装 3. Compose配置常用字段和YAML 文件编写 3.1 YAML 文件格式及编写注意事项 (1&…