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

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

相关推荐
秋月的私语8 分钟前
如何快速将当前的c#工程发布成单文件
android·java·c#
天***889611 分钟前
使用python写一个应用程序要求实现微软常用vc++功能排查与安装功能
java
代码充电宝1 小时前
LeetCode 算法题【简单】283. 移动零
java·算法·leetcode·职场和发展
绝顶少年4 小时前
[特殊字符]️ Spring Cloud Eureka 三步通:搭建注册中心 + 服务注册 + 服务发现,通俗易懂!
spring cloud·eureka·服务发现
ccccczy_4 小时前
Spring Security 深度解读:JWT 无状态认证与权限控制实现细节
java·spring security·jwt·authentication·authorization·securityfilterchain·onceperrequestfilter
Lin_Aries_04214 小时前
容器化 Tomcat 应用程序
java·linux·运维·docker·容器·tomcat
sheji34164 小时前
【开题答辩全过程】以 springboot高校社团管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
zzywxc7875 小时前
大模型落地实践指南:从技术路径到企业级解决方案
java·人工智能·python·microsoft·golang·prompt
相与还5 小时前
IDEA+SpringBoot实现远程DEBUG到本机
java·spring boot·intellij-idea
小杨勇敢飞5 小时前
IDEA 2024 中创建 Maven 项目的详细步骤
java·ide·intellij-idea