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

【SpringCloud】-GateWay源码解析

GateWay系列

【SpringCloud】-GateWay网关


一、背景介绍

当一个请求来到 Spring Cloud Gateway 之后,会经过一系列的处理流程,其中涉及到路由的匹配、过滤器链的执行等步骤。今天我们来说说请求经过 Gateway 的主要执行流程和原理是什么吧

二、正文

下面这张图相信很多学习Gateway的小伙伴都见过的图,在讲述源码之前我们先宏观的对每一部分在回顾回顾,这样对于之后深入细节起到指导
在这里插入图片描述
Gateway Client:发送请求到 Spring Cloud Gateway 的客户端
Gateway Handler Mapping:是处理请求的组件,负责将请求映射到相应的处理器。处理请求将被路由到哪个路由规则,从而选择对应的过滤器链
Gateway Web Handler:实际处理请求的组件,会依次执行过滤器链,对请求进行处理
Gateway Filter:过滤器链由多个过滤器组成,每个过滤器执行一些特定代码逻辑
Proxied Service:被代理的服务,当执行完过滤器链之后会将请求转发到具体的目标服务


1、路由查找和匹配

根据请求的信息,将请求与配置的路由规则进行匹配。Gateway会遍历所有的路由规则,根据路由规则匹配符合的路由,通过路由的谓词逐个遍历路由,找到第一个匹配的路由,并进行一些额外的处理,如记录日志和验证路由。
其中对每个路由使用 filterWhen 操作符,其中 r.getPredicate().apply(exchange) 会应用路由的谓词(Predicate)来检查当前请求是否匹配该路由。如果匹配成功,则保留该路由,否则过滤掉。
路由规则:匹配的路径、Predicates断言……
在这里插入图片描述

2、创建 Gateway 过滤器链

目的:通过上一步我们找到了匹配的路由规则,Gateway会将多个过滤器组成一个过滤器链,每个过滤器都有自己负责的逻辑,通过过滤器可以对请求进行修改、验证、记录日志等等
在我分享的文章中也提到了GateWay包含的一些GlobalFilter全局过滤器
在这里插入图片描述

下面我们先来看看Gateway是如何组成过滤器链的吧!

将全局过滤器和路由过滤器按照优先级排序,然后创建并执行过滤器链。过滤器链是 Spring Cloud Gateway 中请求处理的核心机制之一,通过过滤器链,可以在请求进入 Gateway 时进行一系列的预处理、转换、验证或者日志记录等操作,以及在响应返回时进行一系列的后处理操作
在这里插入图片描述
步骤:

  1. 获取路由信息和过滤器:会从配置文件中获取过滤器列表,
  2. 合并全局过滤器和路由过滤器
  3. 排序过滤器链:在配置文件中会设置order等级,此时会根据等级去排序
  4. 如果启用了 DEBUG 级别的日志,会输出排序后的过滤器列表
  5. 创建并执行过滤器链
    在这里插入图片描述

过滤器链组装完毕接下来我们就该去分别执行每一个过滤器了,下面我们来看看每个filter方法是如何执行的

3、逐个执行过滤器

借鉴网上的一张图片,下面的图片描述了具体的执行流程
思想:逐个调用过滤器链的filter方法,其中有个过滤器需要我们着重关注:
loadbalance :将service通过ribbon负载均衡器转换成实际微服务下游地址,后面我也会着重对这一部分讲述
在这里插入图片描述

①、根据负载均衡的规则选择服务实例

当通过路由到服务的请求时,该过滤器会被调用,确保请求被正确地路由到具体的服务实例上
核心代码是:final ServiceInstance instance = choose(exchange);这一句,内部通过loadBalancer去截取lb://后面的服务名称
在这里插入图片描述

gateway通过和ribbon获取服务实例
目的:选择服务实例,在默认情况下,Ribbon会使用RoundRobin轮询作为默认的负载均衡策略
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

②、替换到下游服务地址

uri是请求的地址,instance是真正通过ribbon获取到的代理地址,将请求转发到真正的instance地址上
在这里插入图片描述


4、路由转发

通过过滤器链的filter之后,所有的请求都会转发到具体某个服务上

5、请求返回

当我们的目标服务执行完对应的逻辑处理之后,会将响应返回给Gateway,Gateway也可以对相应做一些记录日志或者添加响应头等操作


三、总结

我们发送的一个个请求经过 Gateway 的整体流程,从接收请求到路由匹配、过滤器链的执行,再到最终的响应返回给客户端,中间做了很多我们不知道的动作,通过分析源码了解其中奥秘,才知道Ribbon是如何和Gateway结合使用的

如果有想要交流的内容欢迎在评论区进行留言,如果这篇文档受到了您的喜欢那就留下你点赞+收藏+评论脚印支持一下博主~


相关文章:

【SpringCloud】-GateWay源码解析

GateWay系列 【SpringCloud】-GateWay网关 一、背景介绍 当一个请求来到 Spring Cloud Gateway 之后,会经过一系列的处理流程,其中涉及到路由的匹配、过滤器链的执行等步骤。今天我们来说说请求经过 Gateway 的主要执行流程和原理是什么吧 二、正文 …...

华为无线ac双链路冷备和热备配置案例

所谓的冷备和热备,冷备就是不用vrrp和hsb协议同步ap和用户信息,主的断了等七十五秒后,备的capwap和ap连接上去。 双链路冷备不用vrrp和hsb 双链路热备份只用hsb同步ap和用户信息,不用vrrp,两个ac可以不用在同一个二层…...

VSCode Python开发环境配置

目录 1 插件安装2 Debug和测试配置常见问题 1 插件安装 1.1 基础编译插件,Python、Pylance 1.2 修改语言服务器类型,进入用户配置页面搜索Python: Language Server,选择Pylance(一定要修改可以提供很多语法提示) 1…...

浅谈【GPU和CPU】

GPU和显卡的区别 GPU(Graphics Processing Unit,图形处理器)通常指的就是显卡。显卡是一种安装在计算机中的扩展卡,主要用于图形和图像处理任务。 GPU作为显卡的核心组件,负责处理图形渲染、图像处理、视频解码和其他…...

啥是构造器?

当我们new一个对象时就是在引用构造器 构造器又叫做构造函数 构造函数一般分为无参构造函数与有参构造函数 假设我们创建一个pet类,这个类里面就会有一个看不见的自动生成的无参构造函数 如果pet类里没有这个隐形的无参构造,我们new一个对象时就会报错…...

Linux基础知识学习2

tree命令的使用 可以看到dir2目录下的这些文件,要想显示dir2的具体结构,可用tree命令 mv命令 它可以实现两个功能 1.将文件移动到另一个目录中 2.对某一个文件进行重命名 1.将文件移动到另一个目录中 这里将dir1中的2.txt移动到他的子目录dir3中 执行…...

Grafana二进制部署并配置prometheus数据源

1、获取grafna二进制安装包 https://grafana.com/grafana/download?pggraf&plcmtdeploy-box-1 grafana官网下载地址 [rootambari-hadoop1 ~]# cd /opt/module/grafana/ [rootambari-hadoop1 grafana]# pwd /opt/module/grafana2、在安装自己的安装目录执行 wget https:…...

时序预测 | Matlab实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络时间序列预测

时序预测 | Matlab实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN-BiLSTM麻雀算…...

Java中的单元测试

单元测试 单元测试概述: 单元测试是指在软件开发中对软件的最小可测试单元进行测试和验证的过程。最小可测试单元通常是指函数、方法或者类,单元测试可以保证开发人员的代码正确性,同时也方便后期维护和修改。单元测试的主要目的是检测代码的正确性&am…...

143.【Nginx-02】

Nginx-02 (五)、Nginx负载均衡1.负载均衡概述2.负载均衡的原理及处理流程(1).负载均衡的作用 3.负载均衡常用的处理方式(1).用户手动选择(2).DNS轮询方式(3).四/七层负载均衡(4).Nginx七层负载均衡指令 ⭐(5).Nginx七层负载均衡的实现流程 ⭐ 4.负载均衡状态(1).down (停用)(2)…...

代码随想录刷题 | Day2

今日学习目标 一、基础 链表 接下来说一说链表的定义。 链表节点的定义,很多同学在面试的时候都写不好。 这是因为平时在刷leetcode的时候,链表的节点都默认定义好了,直接用就行了,所以同学们都没有注意到链表的节点是如何定…...

C++ enum class 如何使用

enum class 是 C11 引入的一种新的枚举类型,它是对传统 C 风格的枚举的一种改进。enum class 提供了更强大的类型安全性和作用域限定。以下是关于 enum class 的详细介绍和用法说明: 1. 基本语法 enum class EnumName {Enumerator1,Enumerator2,// ...…...

攻防技术-单包攻击防范:扫描、畸形、特殊(HCIP)

单包攻击类型介绍 一、扫描窥探攻击 1、地址扫描攻击防范 攻击介绍 运用ping程序探测目标地址,确定目标系统是否存活。也可使用TCP/UDP报文对目标系统发起探测(如TCP ping)。 防御方法 检测进入防火墙的ICMP、TCP和UDP报文,根…...

基于 Vue3 和 WebSocket 实现的简单网页聊天应用

首先附上项目介绍,后面详细解释技术细节 1. chat-websocket 一个基于Vue3和WebSocket的简易网络聊天室项目,包括服务端和客户端部分。 项目地址 websocket-chat 下面是项目的主要组成部分和功能: 项目结构 chat-websocket/ |-- server/ # WebSocket 服…...

【MYSQL】MYSQL 的学习教程(八)之 12 种慢 SQL 查询原因

日常开发中,我们经常会遇到数据库慢查询。那么导致数据慢查询都有哪些常见的原因呢?今天就跟大家聊聊导致 MySQL 慢查询的 12 个常见原因,以及对应的解决方法: SQL 没加索引SQL 索引失效limit 深分页问题单表数据量太大join 或者…...

C语言例题3

1.设x、y、z和k都是int型变量,则执行表达式:x(y4,z16,k32)后,x的值为(32); x(y4,z16,k32),x的值为32 理解逗号运算符在c语言中的工作方式:逗号运算…...

很实用的ChatGPT网站——httpchat-zh.com

很实用的ChatGPT网站——http://chat-zh.com/ 今天介绍一个好兄弟开发的ChatGPT网站,网址[http://chat-zh.com/]。这个网站功能模块很多,包含生活、美食、学习、医疗、法律、经济等很多方面。下面简单介绍一些部分功能与大家一起分享。 登录和注册页面…...

Python函数中的*args,**kwargs作用与用法

前言 最近在使用Python函数的时候,经常碰见函数中使用*args、**kwargs,而且参数的传递也是非常奇特,就特意对Python函数中*args、**kwargs进行了查询,下面就以实例进行说明。 1 Python中的*args、**kwargs 在 Python 中&#x…...

python可视化界面自动生成,python如何做可视化界面

大家好,小编来为大家解答以下问题,python gui可视化操作界面制作,python做出的炫酷的可视化,现在让我们一起来看看吧! 目录 前言 一.环境配置 插件: 1.python 2.Chinese 3.Open In Default Browser 安装pyt…...

力扣热题100道-双指针篇

文章目录 双指针283.移动零11.盛最多水的容器15.三数之和42.接雨水 双指针 283.移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 …...

终极图像超分辨率神器:waifu2x-caffe完整使用指南

终极图像超分辨率神器:waifu2x-caffe完整使用指南 【免费下载链接】waifu2x-caffe waifu2xのCaffe版 项目地址: https://gitcode.com/gh_mirrors/wa/waifu2x-caffe 你是否曾为低分辨率图片的模糊细节而烦恼?想要将心爱的动漫壁纸放大到4K分辨率&a…...

别再手动写Prompt了!Lovable原生AI编排引擎深度解析(附12个已验证行业工作流)

更多请点击: https://intelliparadigm.com 第一章:Lovable无代码AI应用构建指南 Lovable 是一款面向业务人员与开发者的低门槛 AI 应用构建平台,它通过可视化编排、预置模型组件和自然语言驱动逻辑,实现无需编写代码即可部署可运…...

Lie群方法在机器人状态估计中的创新应用

1. 状态估计技术演进与Lie群方法的核心价值在机器人导航与定位领域,状态估计技术扮演着大脑的角色。想象一下,当你在陌生城市使用手机导航时,系统需要实时融合GPS、陀螺仪和加速度计的数据来确定你的位置——这正是状态估计的典型应用场景。传…...

构建AI信任层TrustLayer:开源插件化架构保障AI输出安全与可靠

1. 项目概述:为什么我们需要一个AI信任层?最近几个月,我几乎把所有主流的AI工具都试了个遍。从代码助手到文案生成,从图像创作到数据分析,每个工具都承诺能提升效率。但用着用着,我发现一个越来越明显的问题…...

Adobe-GenP 3.0:三步解锁Adobe全家桶的终极指南

Adobe-GenP 3.0:三步解锁Adobe全家桶的终极指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为昂贵的Adobe Creative Cloud订阅费而烦恼吗&#…...

从空洞卷积到多尺度感知:图解PyTorch中ASPP的设计哲学与实现细节(附可运行代码)

从空洞卷积到多尺度感知:图解PyTorch中ASPP的设计哲学与实现细节(附可运行代码) 当我们观察一幅画时,眼睛会自然地聚焦在不同尺度的细节上——从整体构图到局部纹理,这种多尺度感知能力是人类视觉系统的核心优势。计算…...

Gemini3.1Pro解决新媒体小编选题难痛点

做新媒体的小编,最怕的不是写,而是“今天写什么”。 选题总是来得很急,热点总是变化很快,账号又要求持续更新,结果就是:内容压力大、时间不够用、框架搭不出来。如果你每天都在追热点、找角度、写标题、搭结…...

别再只做AB测试了!用Python实战倾向性得分匹配(PSM),搞定业务中的因果推断难题

用Python实战倾向性得分匹配(PSM):超越AB测试的因果推断利器 在数据驱动的决策时代,企业经常面临一个核心问题:如何准确评估策略或干预措施的真实效果?传统AB测试虽然简单直观,但在面对历史数据、观测数据等非随机实验…...

收藏 | 程序员小白也能掌握大模型开发,AI时代大有可为!

收藏 | 程序员小白也能掌握大模型开发,AI时代大有可为! 本文针对非AI专业背景的程序员,介绍了如何参与大模型应用开发。内容涵盖大模型基础、提示词编写与提示工程技巧,以及使用OpenAI API和LangChain框架进行应用开发的关键步骤。…...

基于OCR与NLP的智能账单分析系统:从数据处理到消费洞察

1. 项目概述:一个AI驱动的家庭账单智能分析系统最近在GitHub上看到一个挺有意思的项目,叫ai_code_family_bill。光看名字,你大概能猜到它和家庭账单、AI分析有关。作为一个长期和代码、数据打交道的技术人,我第一反应是&#xff1…...