【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结合使用的

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


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

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

相关文章

Bwapp学习笔记

1.基本sql语句 #求绝对值 select abs(-1) from dual; #取余数 select mod(10,3); #验证show databases结果是取之于schemata表的 show databases; select schema_name from information_schema.schemata; #查询当前的数据库 select database(); -- 查询数据库版本 s…

HTML5刷题笔记

在 HTML5 中,onblur 和 onfocus 是:事件属性 onblur 和 onfocus 属于焦点事件: onblur:失去焦点 onfocus:获取焦点 HTML5事件window 事件属性 针对 window 对象触发的事件: onafterprint script 文档…

Python入门学习篇(六)——for循环while循环

1 for循环 1.1 常规for循环 1.1.1 语法结构 for 变量名 in 可迭代对象:# 遍历对象时执行的代码 else:# 当for循环全部正常运行完(没有报错和执行break)后执行的代码1.1.2 示例代码 print("----->学生检查系统<------") student_lists["张三",&qu…

Python运算符函数化模块

文章目录 标准运算符替代函数实用工具itemgetterattrgettermethodcaller 刷完这60个标准库模块&#xff0c;成为Python骨灰级玩家 作为编程语言&#xff0c;如果无法做到Lisp的括号风格&#xff0c;那么必然羞于承认自己是函数式。python的lambda表达式以及各种生成式&#xf…

网络基础知识制作网线了解、集线器、交换机与路由器

目录 一、网线的制作 1.1、材料 1.2、网线的标准类别 二、集线器、交换机介绍 2.1、概念&#xff1a; 2.2、OSI七层模型 2.3、TCP/IP四层 三、路由器的配置 3.1、概念 3.2、四个模块 1、 网络状态 2、设备管理 3、应用管理 无人设备接入控制 无线桥接 信号调节…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)ChannelMap 模块的实现

&#xff08;三&#xff09;ChannelMap 模块的实现 这个模块其实就是为Channel来服务的&#xff0c;前面讲了Channel这个结构体里边它封装了文件描述符。假如说我们得到了某一个文件描述符&#xff0c;需要基于这个文件描述符进行它对应的事件处理&#xff0c;那怎么办呢&…

面试官:看你简历了解过并发,我们简单聊一聊

前言&#xff1a; 今天和大家探讨最近的面试题&#xff0c;好久没有面试了&#xff0c;所以在此记录一下。本篇文章主要讲解CyclicBarrier和CountDownLatch的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xf…

HarmonyOS构建第一个ArkTS应用(FA模型)

构建第一个ArkTS应用&#xff08;FA模型&#xff09; 创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&a…

Jenkins自动化部署之后端

准备工作参考本人另外几篇Jenkins相关的文章 新建任务 添加参数配置 字符串参数&#xff1a;分支名称 多选框&#xff1a;项目名称&#xff08;Extended Choice Parameter插件必备&#xff0c;插件安装参考我另外的文章&#xff09; 这个分割规则自定义。只要根据Jenkins…

智能优化算法应用:基于爬行动物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于爬行动物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于爬行动物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.爬行动物算法4.实验参数设定5.算法结果6.…

代码随想录-刷题第三十六天

435. 无重叠区间 题目链接&#xff1a;435. 无重叠区间 思路&#xff1a;本题与452. 用最少数量的箭引爆气球非常像&#xff0c;弓箭的数量就相当于是非交叉区间的数量&#xff0c;只要把弓箭那道题目代码里射爆气球的判断条件加个等号&#xff08;认为[0&#xff0c;1][1&am…

PostGreSQL:货币类型

货币类型&#xff1a;money money类型存储固定小数精度的货币数字&#xff0c;小数的精度由数据库的lc_monetary设置决定。windows系统下&#xff0c;该配置项位于/data/postgresql.conf文件中&#xff0c;默认配置如下&#xff0c; lc_monetary Chinese (Simplified)_Chi…

WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER.

Hadoop启动时警告&#xff0c;但不影响使用&#xff0c;强迫症的我还是决定寻找解决办法 WARNING: HADOOP_SECURE_DN_USER has been replaced by HDFS_DATANODE_SECURE_USER. Using value of HADOOP_SECURE_DN_USER.原因是Hadoop安装配置于root用户下&#xff0c;对文件需要进…

《PySpark大数据分析实战》-18.什么是数据分析

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

计算机网络——数据链路层-点对点协议(组成部分、PPP帧格式、透明传输、差错检测、工作状态)

目录 介绍 组成部分 PPP帧格式 透明传输 字节填充法 比特填充法 差错检测 工作状态 本篇我们介绍点对点协议PPP 介绍 点对点协议PPP&#xff08;Point-to-Point Protocol&#xff09;是目前使用最广泛的点对点数据链路层协议。 请大家想想看&#xff1a;一般的英特…

哈希拓展攻击CTF题做法

目录 基础&#xff1a; 盐&#xff08;Salt&#xff09;&#xff1a; 哈希长度拓展攻击&#xff1a; kali下载相关工具hash-ext-attack&#xff1a; hash拓展题目特征&#xff1a; 哈希拓展ctf题&#xff1a; 2023楚慧杯upload_shell 实验吧之让我进去&#xff1a; 前言…

nodejs微信小程序+python+PHP计算机网络在线考试系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

编译opencv和opencv_contrib

1 下载源码 下载opencv源码https://github.com/opencv/opencv 下载opencv源码https://github.com/opencv/opencv_contrib 2 开始编译 构建需要下载ffmpeg的包&#xff0c;cmake构建时会自动下载&#xff0c;但是比较满&#xff0c;这里可以从下面链接直接下载 https://downloa…

新版IDEA中Git的使用(一)

说明&#xff1a;本文介绍如何在新版IDEA中使用Git 创建项目 首先&#xff0c;在GitLab里面创建一个项目&#xff08;git_demo&#xff09;&#xff0c;克隆到桌面上。 然后在IDEA中创建一个项目&#xff0c;项目路径放在这个Git文件夹里面。 Git界面 当前分支&Commit …

VSCode软件与SCL编程

原创 NingChao NCLib 博途工控人平时在哪里技术交流博途工控人社群 VSCode简称VSC&#xff0c;是Visual studio code的缩写&#xff0c;是由微软开发的跨平台的轻量级编辑器&#xff0c;支持几乎所有主流的开发语言的语法高亮、代码智能补全、插件扩展、代码对比等&#xff0c…