当前位置: 首页 > 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结合使用的

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


http://www.lryc.cn/news/269863.html

相关文章:

  • 华为无线ac双链路冷备和热备配置案例
  • VSCode Python开发环境配置
  • 浅谈【GPU和CPU】
  • 啥是构造器?
  • Linux基础知识学习2
  • Grafana二进制部署并配置prometheus数据源
  • 时序预测 | Matlab实现SSA-CNN-BiLSTM麻雀算法优化卷积双向长短期记忆神经网络时间序列预测
  • Java中的单元测试
  • 143.【Nginx-02】
  • 代码随想录刷题 | Day2
  • C++ enum class 如何使用
  • 攻防技术-单包攻击防范:扫描、畸形、特殊(HCIP)
  • 基于 Vue3 和 WebSocket 实现的简单网页聊天应用
  • 【MYSQL】MYSQL 的学习教程(八)之 12 种慢 SQL 查询原因
  • C语言例题3
  • 很实用的ChatGPT网站——httpchat-zh.com
  • Python函数中的*args,**kwargs作用与用法
  • python可视化界面自动生成,python如何做可视化界面
  • 力扣热题100道-双指针篇
  • 数据库一般会采取什么样的优化方法?
  • 编程笔记 html5cssjs 015 HTML列表
  • 【力扣题解】P404-左叶子之和-Java题解
  • elasticsearch 索引数据多了怎么办,如何调优,部署
  • Spring Cloud Gateway之Predicate断言详解
  • JavaScript中的prototype和_proto_的关系是什么
  • 机器学习(二) -- 数据预处理(3)
  • 【数学建模美赛M奖速成系列】Matplotlib绘图技巧(三)
  • 手写Spring与基本原理--简易版
  • EasyNTS端口穿透服务新版本发布 0.8.7 增加隧道流量总数记录,可以知晓设备哪个端口耗费流量了
  • python自动合计各部周销