在微服务架构中,网关作为流量入口,承担着路由转发、负载均衡、限流熔断、鉴权认证、日志监控等核心职责,是微服务体系的 "门户守卫"。Spring Cloud Gateway 作为 Spring 官方推出的新一代网关组件,基于 Netty 实现非阻塞 IO,性能远超传统的 Zuul,同时原生整合 Spring Cloud 生态(Nacos、Sentinel、OAuth2 等),成为微服务网关的首选方案。
本文基于 Spring Cloud Gateway 3.1.x,从基础配置到进阶功能,全面讲解路由规则、限流熔断、统一鉴权、全局过滤等实战场景,结合代码实现生产级网关架构,解决网关开发中的常见问题与性能瓶颈。
一、核心认知:Spring Cloud Gateway 的优势与核心组件
1. 核心优势
- 非阻塞高性能:基于 Netty+Reactor 响应式编程,处理请求无线程阻塞,吞吐量是 Zuul 1.x 的数倍,支持高并发场景;
- 原生生态整合:无缝对接 Spring Cloud Alibaba(Nacos、Sentinel)、Spring Security OAuth2 等组件,无需额外适配;
- 功能丰富:内置路由转发、负载均衡、熔断限流、路径重写、跨域处理等功能,可通过自定义过滤器扩展;
- 易配置:支持 yml/properties 配置文件、Java 代码两种方式定义路由,配置灵活且易于维护。
2. 核心组件
- Route(路由):网关的核心元素,包含 ID、目标 URI、断言集合、过滤器集合,断言匹配成功则转发请求到目标 URI;
- Predicate(断言):用于匹配请求的条件(如路径、方法、请求头、参数等),支持多种内置断言,也可自定义;
- Filter(过滤器):对请求 / 响应进行拦截处理,分为 GlobalFilter(全局过滤器,对所有路由生效)和 GatewayFilter(局部过滤器,仅对指定路由生效)。
二、实战:网关基础配置与路由规则
1. 环境准备(依赖引入)
基于 Spring Boot 2.7.x + Spring Cloud Gateway 3.1.x,整合 Nacos 服务发现(用于动态路由与服务注册):
2. 基础路由配置(application.yml)
支持两种路由模式:静态路由(直接指定 URI)、动态路由(基于服务发现,转发到微服务)。
3. 常用内置断言(Predicate)
断言用于精准匹配请求,支持多种组合条件,满足复杂路由场景:
| 断言类型 | 配置示例 | 说明 |
|---|---|---|
| 路径断言 | Path=/api/** | 匹配指定路径的请求 |
| 方法断言 | Method=GET,POST | 匹配指定 HTTP 方法的请求 |
| 请求头断言 | Header=Token, \d+ | 匹配请求头中 Token 符合正则的请求 |
| 参数断言 | Query=userId, \d+ | 匹配请求参数 userId 为数字的请求 |
| 时间断言 | After=2024-01-01T00:00:00+08:00[Asia/Shanghai] | 匹配指定时间之后的请求 |
| IP 断言 | RemoteAddr=192.168.1.0/24 | 匹配指定 IP 段的请求 |
三、进阶功能:限流、熔断与统一鉴权
1. 限流实战(基于 Sentinel)
网关作为流量入口,限流是防止服务被压垮的关键。整合 Sentinel 实现多种限流策略(QPS 限流、IP 限流、用户级限流)。
(1)Sentinel 配置(application.yml)
(2)自定义限流规则(代码方式)
2. 统一鉴权(GlobalFilter)
通过全局过滤器实现所有请求的鉴权认证(如 Token 校验、权限判断),无需在每个微服务中重复实现。
3. 熔断降级(Sentinel)
当后端微服务故障或响应超时,网关自动熔断,返回降级响应,避免级联故障。
四、避坑指南与性能优化
1. 常见坑点与解决方案
- 坑点 1:路由匹配优先级混乱:多个路由规则同时匹配时,按配置顺序执行,先匹配的路由生效。解决方案:将精准路由(如 /order/detail/{id})放在前面,模糊路由(如 /order/**)放在后面。
- 坑点 2:跨域问题:前端请求网关出现跨域报错。解决方案:配置全局跨域过滤器,允许指定 Origin、Method、Header。
- 坑点 3:Sentinel 限流不生效:未指定路由 ID 或 Sentinel 控制台未加载规则。解决方案:确保路由 ID 与限流规则中的资源名一致,检查 Sentinel 控制台是否正常连接。
- 坑点 4:过滤器顺序冲突:多个 GlobalFilter 优先级设置不当,导致鉴权在前、日志在后等逻辑错误。解决方案:通过 @Order 注解明确优先级,核心过滤器(鉴权、限流)优先级高于辅助过滤器(日志、响应头添加)。
2. 性能优化建议
- 开启连接池复用:配置 Netty 连接池,复用 TCP 连接,减少连接建立开销。
- 关闭不必要的过滤器:仅保留核心过滤器(鉴权、限流),避免冗余过滤逻辑消耗性能。
- 开启缓存路由:网关路由规则加载后缓存到本地,避免每次请求都从 Nacos 获取。
- 限流粒度优化:针对高频接口单独设置限流规则,避免全局限流影响正常业务。