当前位置: 首页>后端>正文

【SpringCloud】-GateWay源码解析

GateWay系列

【SpringCloud】-GateWay网关


一、背景介绍

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

二、正文

下面这张图相信很多学习Gateway的小伙伴都见过的图,在讲述源码之前我们先宏观的对每一部分在回顾回顾,这样对于之后深入细节起到指导

【SpringCloud】-GateWay源码解析,【SpringCloud】-GateWay源码解析_java,第1张

Gateway Client:发送请求到 Spring Cloud Gateway 的客户端

Gateway Handler Mapping:是处理请求的组件,负责将请求映射到相应的处理器。处理请求将被路由到哪个路由规则,从而选择对应的过滤器链

Gateway Web Handler:实际处理请求的组件,会依次执行过滤器链,对请求进行处理

Gateway Filter:过滤器链由多个过滤器组成,每个过滤器执行一些特定代码逻辑

Proxied Service:被代理的服务,当执行完过滤器链之后会将请求转发到具体的目标服务

1、路由查找和匹配

根据请求的信息,将请求与配置的路由规则进行匹配。Gateway会遍历所有的路由规则,根据路由规则匹配符合的路由,通过路由的谓词逐个遍历路由,找到第一个匹配的路由,并进行一些额外的处理,如记录日志和验证路由。

其中对每个路由使用 filterWhen 操作符,其中 r.getPredicate().apply(exchange) 会应用路由的谓词(Predicate)来检查当前请求是否匹配该路由。如果匹配成功,则保留该路由,否则过滤掉。

路由规则:匹配的路径、Predicates断言……

【SpringCloud】-GateWay源码解析,【SpringCloud】-GateWay源码解析_java_02,第2张

2、创建 Gateway 过滤器链

目的:通过上一步我们找到了匹配的路由规则,Gateway会将多个过滤器组成一个过滤器链,每个过滤器都有自己负责的逻辑,通过过滤器可以对请求进行修改、验证、记录日志等等

在我分享的文章中也提到了GateWay包含的一些GlobalFilter全局过滤器

【SpringCloud】-GateWay源码解析,【SpringCloud】-GateWay源码解析_java_03,第3张

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

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

【SpringCloud】-GateWay源码解析,【SpringCloud】-GateWay源码解析_spring cloud_04,第4张

步骤:

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

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

3、逐个执行过滤器

借鉴网上的一张图片,下面的图片描述了具体的执行流程

思想:逐个调用过滤器链的filter方法,其中有个过滤器需要我们着重关注:

loadbalance :将service通过ribbon负载均衡器转换成实际微服务下游地址,后面我也会着重对这一部分讲述

【SpringCloud】-GateWay源码解析,【SpringCloud】-GateWay源码解析_spring cloud_05,第5张

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

当通过路由到服务的请求时,该过滤器会被调用,确保请求被正确地路由到具体的服务实例上

核心代码是:final ServiceInstance instance = choose(exchange);这一句,内部通过loadBalancer去截取lb://后面的服务名称

【SpringCloud】-GateWay源码解析,【SpringCloud】-GateWay源码解析_java_06,第6张

gateway通过和ribbon获取服务实例

目的:选择服务实例,在默认情况下,Ribbon会使用RoundRobin轮询作为默认的负载均衡策略

【SpringCloud】-GateWay源码解析,【SpringCloud】-GateWay源码解析_Cloud_07,第7张

【SpringCloud】-GateWay源码解析,【SpringCloud】-GateWay源码解析_java_08,第8张

【SpringCloud】-GateWay源码解析,【SpringCloud】-GateWay源码解析_spring cloud_09,第9张

②、替换到下游服务地址

uri是请求的地址,instance是真正通过ribbon获取到的代理地址,将请求转发到真正的instance地址上

【SpringCloud】-GateWay源码解析,【SpringCloud】-GateWay源码解析_spring cloud_10,第10张


4、路由转发

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

5、请求返回

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


三、总结

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

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




https://www.xamrdz.com/backend/3xu1924685.html

相关文章: