【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 时进行一系列的预处理、转换、验证或者日志记录等操作,以及在响应返回时进行一系列的后处理操作
步骤:
- 获取路由信息和过滤器:会从配置文件中获取过滤器列表,
- 合并全局过滤器和路由过滤器
- 排序过滤器链:在配置文件中会设置order等级,此时会根据等级去排序
- 如果启用了 DEBUG 级别的日志,会输出排序后的过滤器列表
- 创建并执行过滤器链
过滤器链组装完毕接下来我们就该去分别执行每一个过滤器了,下面我们来看看每个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 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 …...
数据库一般会采取什么样的优化方法?
数据库一般会采取什么样的优化方法? 1、选取适合的字段属性 为了获取更好的性能,可以将表中的字段宽度设得尽可能小。 尽量把字段设置成not null 执行查询的时候,数据库不用去比较null值。 对某些省份或者性别字段,将他们定义为e…...
编程笔记 html5cssjs 015 HTML列表
编程笔记 html5&css&js 015 HTML列表 一、有序列表例1:例2: 二、无序列表例1:例2: 列表是一种特定文字格式,很常用。 HTML 列表。HTML 支持有序、无序和定义列表。 一、有序列表 例1: <!DOCTY…...
【力扣题解】P404-左叶子之和-Java题解
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P404-左叶子之和-Java题解🌏题目描述💡题解🌏总结…...
elasticsearch 索引数据多了怎么办,如何调优,部署
当Elasticsearch索引的数据量增加时,可能会遇到性能瓶颈,需要进行调优。以下是一些建议和步骤,可帮助你处理数据量增加的情况: 1. 硬件升级: 增加节点数或升级硬件,包括更快的CPU、更大的内存和更快的存储…...
Spring Cloud Gateway之Predicate断言详解
目录 Predicate(断言)内置Predicate请求参数匹配请求路径匹配Header 属性匹配Cookie 匹配请求方式匹配请求 ip 地址匹配时间匹配组合匹配 Predicate(断言) 在 Spring Cloud Gateway 中,Predicate(断言&…...
JavaScript中的prototype和_proto_的关系是什么
JavaScript中的prototype和_proto_的关系是什么 __proto__ 是 JavaScript 中对象的一个内部属性,它指向该对象的原型。JavaScript 中每个对象都有一个 __proto__ 属性,通过它可以访问对象的原型。prototype 是函数对象特有的属性,每个函数都…...
机器学习(二) -- 数据预处理(3)
系列文章目录 未完待续…… 目录 前言 tips:这里只是总结,不是教程哈。本章开始会用到numpy,pandas以及matplotlib,这些就不在这讲了哈。 “***”开头的是给好奇心重的宝宝看的,其实不太重要可以跳过。 此处以下所有…...
【数学建模美赛M奖速成系列】Matplotlib绘图技巧(三)
Matplotlib绘图技巧(三) 写在前面7. 雷达图7.1 圆形雷达图7.2 多边形雷达图 8. 极坐标图 subplot9. 折线图 plot10. 灰度图 meshgrid11. 热力图11.1 自定义colormap 12. 箱线图 boxplot 写在前面 终于更新完Matplotlib绘图技巧的全部内容,有…...
手写Spring与基本原理--简易版
文章目录 手写Spring与基本原理解析简介写一个简单的Bean加载容器定义一个抽象所有类的BeanDefinition定义一个工厂存储所有的类测试 实现Bean的注册定义和获取基于Cglib实现含构造函数的类实例化策略Bean对象注入属性和依赖Bean的功能Spring.xml解析和注册Bean对象实现应用上下…...
EasyNTS端口穿透服务新版本发布 0.8.7 增加隧道流量总数记录,可以知晓设备哪个端口耗费流量了
EasyNTS上云平台可通过远程访问内网应用,包含网络桥接、云端运维、视频直播等功能,极大地解决了现场无固定IP、端口不开放、系统权限不开放等问题。平台可提供一站式上云服务,提供直播上云、设备上云、业务上云、运维上云服务,承上…...
做独立网站需要注意什么好/网站推广方式组合
String str; str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str; str=str.substring(int beginIndex,int endIndex);截取str中从beginIndex开始至endIndex结束时…...
温州 网站建设/站长之家新网址
电脑蓝屏是在上网的时候再常见到的现象了,造成电脑蓝屏的原因很多,所以微软在操作系统中设计了蓝屏代码,让大家电脑在出现蓝屏的时候能够及时的发现是什么原因造成了蓝屏。一般蓝屏代码都位于屏幕提示文字的第一段或者倒数第三段,…...
宝安专业网站设计多少钱/百度竞价推广价格
转自:http://blog.csdn.net/joker0910/article/details/7171626 内核使用了大量不同的宏来标记具有不同作用的函数和数据结构。如宏__init 、__devinit 等。这些宏在include/linux/init.h 头文件中定义。编译器通过这些宏可以把代码优化放到合适的内存位置ÿ…...
眼科医院网站设计怎么做/天津优化网络公司的建议
首先我们打开一个测试用的文档。 然后,如果我们需要隐藏某一列,则选中这一列。 在【开始】选项卡的“单元格”组中单击【格式】按钮 在打开的下拉菜单中选择【隐藏和取消隐藏】,根据下级菜单中的相关命令来进行行列的隐藏操作。 选择【隐藏行…...
我是做网站的 怎么才能提高业绩/全网整合营销平台
文章目录前言1、乐观锁2、悲观锁3、自旋锁4、可重入锁(递归锁)5、读写锁6、公平锁7、非公平锁8、共享锁9、独占锁10、重量级锁11、轻量级锁12、偏向锁13、分段锁14、互斥锁15、同步锁16、死锁17、锁粗化18、锁消除19、synchronized20、Lock和synchronize…...
汽配网站源码/网店如何引流与推广
git .git目录提交我正在撰写一篇文章,概述了如何编写良好的Git提交消息,以及开发人员应遵循的各种Git提交消息约定和规则。 但是,正如我写的开发人员应遵循的最佳做法,我不断地发现自己在哪些开发商不应该做一个内部讨论。 我希望…...