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 返回给客户端。