Spring Cloud Gateway笔记一之网关处理流程

245 阅读2分钟

Spring Cloud Gateway笔记一

介绍:

Spring Cloud Gateway是基于netty和reactor的非阻塞的高性能网关,一台4核8G内存的机器在优化参数后可以抗住5万QPS请求,响应平均在60ms,错误率在0%,以下把Spring Cloud Gateway简称为SCG;

SCG请求整体流程如下:

客户端请求 → Netty 接收 → 路由匹配 → 全局过滤器 → 局部过滤器 → 请求转发 → 响应处理 → 返回客户端

1.客户端请求阶段:

1.1 Netty 接收请求:

Spring Cloud Gateway 默认使用 Netty 作为底层 Web 服务器,通过异步非阻塞的方式接收 HTTP 请求

1.2 请求封装:

Netty 将请求封装为 ServerHttpRequest 对象,并传递给 Gateway 的核心处理链

2.路由匹配阶段

2.1 路由定位器(RouteLocator):

RouteLocator将SCG接收到的请求与加载的路由断言规则router比对(path、header、方法类型等),如果断言为真则执行全局过滤器及router下的局部filter(如果有的话),如果断言为false则返回404;

Gateway 通过 `RouteLocator` 组件查找与请求匹配的路由规则。路由规则由以下部分组成:
**ID**:路由的唯一标识。
**URI**:目标服务地址(如 `lb://service-name` 或 `http://example.com`)。
**谓词(Predicates)** :定义匹配条件(如路径、Header、方法等)。
**过滤器(Filters)** :定义请求处理逻辑(如修改请求头、参数等)。

3. 过滤器链执行阶段

3.1 全局过滤器(Global Filters):

全局过滤是针对所有请求的。在路由匹配后,首先执行全局过滤器(如 LoadBalancerClientFilter、AdaptCachedBodyGlobalFilter 等)。通过实现GlobalFilter, Ordered接口可以自定义全局过滤器;

3.2 局部过滤器(Route Filters):

局部过滤器只对配置了该局部过滤器的路由生效(如 RewritePathGatewayFilter、AddRequestHeaderGatewayFilter 等)。可以通过继承AbstractGatewayFilterFactory自定义局部过滤器; 过滤器链执行顺序通过Ordered接口控制过滤器的执行顺序,数值越小优先级越高。

4.请求转发阶段

4.1 客户端负载均衡:

如果目标 URI 是服务名(如 lb://service-name),Gateway 会通过 LoadBalancerClient 选择一个具体的服务实例。

4.2 HTTP 客户端转发:

使用 WebClient(基于 Reactor 的异步 HTTP 客户端)将请求转发到目标服务。

5.响应处理阶段

响应式处理:通过 Mono 或 Flux 异步处理响应数据,避免阻塞线程

5.1 响应修改:

过滤器可以对响应进行修改(如添加 Header、修改状态码等)。

5.2 返回客户端:

将最终的响应通过 Netty 返回给客户端。