介绍Spring Cloud Gateway
文章目录
- 一、核心定位与价值
- 二、核心特性
- 三、核心概念
- 四、工作原理
- 五、简单使用示例
- 1. 引入依赖(Maven)
- 2. 配置路由规则(application.yml)
- 示例 1:基本路由(转发到固定地址)
- 示例 2:结合服务发现(动态转发到服务名)
- 3. 自定义过滤器(示例:简单认证)
- 六、高级功能示例
- 1. 限流(基于 IP)
- 2. 集成 Sentinel 熔断降级
- 七、适用场景
- 总结
Spring Cloud Gateway 是 Spring Cloud 生态中的 新一代 API 网关,基于 Spring 5、Spring Boot 2.x 和 Project Reactor 开发,采用 非阻塞响应式编程模型,旨在为微服务架构提供统一的入口,实现路由转发、负载均衡、熔断降级、限流、认证授权等核心功能。它替代了已停止维护的 Spring Cloud Netflix Zuul,成为当前 Spring Cloud 网关的首选方案。
一、核心定位与价值
在微服务架构中,服务数量众多且分散,API 网关作为系统的“入口层”,承担以下核心职责:
- 统一入口:所有外部请求(如前端、移动端)通过网关进入系统,避免直接访问内部服务;
- 路由转发:根据请求路径、参数等规则,将请求转发到对应的微服务;
- 横切关注点:集中处理非业务逻辑(如认证、限流、监控、日志),减少服务重复开发;
- 服务治理:结合负载均衡、熔断降级等机制,保障系统稳定性。
二、核心特性
- 非阻塞响应式:基于 Netty 和 Reactor 实现,支持高并发、低延迟,性能远超传统阻塞式网关(如 Zuul 1.x);
- 动态路由:路由规则可通过配置文件、数据库或配置中心(Nacos/Apollo)动态更新,无需重启网关;
- 强大的路由匹配:支持基于路径(Path)、请求头(Header)、参数(Query)、方法(Method)等多种条件的路由匹配;
- 集成 Spring 生态:无缝对接 Spring Cloud 服务发现(Eureka/Nacos)、负载均衡(Spring Cloud LoadBalancer)、熔断降级(Sentinel/Resilience4j)等组件;
- 内置过滤器链:提供丰富的内置过滤器(如路径重写、请求头修改、跨域处理),支持自定义过滤器扩展;
- 限流支持:可基于 IP、路径、用户等维度实现限流,防止流量过载;
- 监控与追踪:集成 Spring Boot Actuator 提供监控指标,支持 Sleuth/Zipkin 分布式追踪。
三、核心概念
理解 Gateway 的核心概念是掌握其工作原理的关键:
| 概念 | 含义说明 |
|---|---|
| Route(路由) | 网关的基本单元,由 ID(唯一标识)、目标 URI(转发地址)、Predicate(断言) 和 Filter(过滤器) 组成。当请求满足断言条件时,会被转发到目标 URI。 |
| Predicate(断言) | 路由的匹配规则,基于 Spring Framework 的 Predicate 函数实现,用于判断请求是否符合路由条件(如路径匹配 /api/user/**、请求方法为 GET 等)。 |
| Filter(过滤器) | 对请求/响应进行拦截和处理的组件,分为 GatewayFilter(路由过滤器,仅对当前路由生效) 和 GlobalFilter(全局过滤器,对所有路由生效)。可实现日志记录、权限校验、路径重写等功能。 |
四、工作原理
Gateway 的工作流程可概括为“请求拦截→断言匹配→过滤器处理→路由转发”:
- 请求拦截:客户端请求进入 Gateway 后,首先被 Netty 服务器接收,交由 Gateway 的核心处理器处理;
- 断言匹配:处理器根据配置的路由规则,依次通过
Predicate对请求进行匹配(如路径是否为/api/order/**、请求头是否包含Token等),找到第一个匹配的路由; - 过滤器链执行:匹配到路由后,请求进入该路由的过滤器链(包括全局过滤器和路由过滤器),执行前置处理(如认证、日志记录);
- 路由转发:过滤器链前置处理完成后,Gateway 通过负载均衡器(如 Spring Cloud LoadBalancer)将请求转发到目标服务实例;
- 响应处理:目标服务返回响应后,请求再次经过过滤器链执行后置处理(如响应头修改、结果转换),最终返回给客户端。
五、简单使用示例
1. 引入依赖(Maven)
<!-- Spring Cloud Gateway 核心依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency><!-- 服务发现(如 Nacos,用于动态获取服务实例) -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
注意:Gateway 基于响应式编程,需排除 Spring MVC 依赖(避免冲突)。
2. 配置路由规则(application.yml)
通过配置文件定义路由,支持两种风格:快捷配置和完整配置。
示例 1:基本路由(转发到固定地址)
spring:cloud:gateway:routes:- id: user-service-route # 路由唯一IDuri: http://localhost:8081 # 目标服务地址(固定地址)predicates:- Path=/api/user/** # 断言:路径匹配 /api/user/** 时触发路由filters:- RewritePath=/api/user/(?<segment>.*), /user/$\{segment} # 路径重写:/api/user/1 → /user/1
示例 2:结合服务发现(动态转发到服务名)
spring:cloud:gateway:routes:- id: order-service-routeuri: lb://order-service # 目标服务名(lb:// 表示启用负载均衡)predicates:- Path=/api/order/** # 匹配路径- Method=GET # 仅匹配 GET 请求filters:- StripPrefix=1 # 去除路径前缀:/api/order/1 → /order/1
lb://order-service表示通过服务发现(如 Nacos)获取order-service的实例列表,并通过负载均衡选择实例转发。
3. 自定义过滤器(示例:简单认证)
实现 GlobalFilter 接口定义全局过滤器,对所有请求进行认证校验:
@Component
public class AuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求头中的 TokenString token = exchange.getRequest().getHeaders().getFirst("Token");// 简单校验:Token 不存在则返回 401if (token == null || token.isEmpty()) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}// 校验通过,继续执行过滤器链return chain.filter(exchange);}// 过滤器优先级:数值越小,优先级越高@Overridepublic int getOrder() {return -100;}
}
六、高级功能示例
1. 限流(基于 IP)
使用内置的 RequestRateLimiter 过滤器,基于 Redis 实现令牌桶限流:
spring:cloud:gateway:routes:- id: limit-routeuri: lb://user-servicepredicates:- Path=/api/user/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10 # 令牌桶填充速率(每秒10个)redis-rate-limiter.burstCapacity: 20 # 令牌桶最大容量(最多20个)key-resolver: "#{@ipKeyResolver}" # 基于 IP 限流的解析器redis:host: localhost # Redis 地址(限流依赖 Redis)# 定义 IP 解析器
@Configuration
public class RateLimitConfig {@Beanpublic KeyResolver ipKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());}
}
2. 集成 Sentinel 熔断降级
结合 Sentinel 实现路由级别的熔断降级,当目标服务异常时返回降级响应:
# 引入 Sentinel 依赖后,配置熔断规则
spring:cloud:sentinel:transport:dashboard: localhost:8080 # Sentinel 控制台gateway:routes:- id: sentinel-routeuri: lb://pay-servicepredicates:- Path=/api/pay/**filters:- name: Sentinel # 启用 Sentinel 过滤器args:blockHandler: com.example.gateway.handler.FallbackHandler # 降级处理类
七、适用场景
- 微服务统一入口:替代传统的 Nginx 作为业务网关,处理服务路由和横切逻辑;
- API 版本管理:通过路径匹配(如
/v1/user/**、/v2/user/**)转发到不同版本的服务; - 前后端分离架构:处理跨域(CORS)、请求转发,避免前端直接访问后端服务;
- 流量控制中心:集中实现限流、熔断、监控,保障系统在高并发下的稳定性。
总结
Spring Cloud Gateway 作为新一代 API 网关,凭借响应式编程的高性能、丰富的路由能力和 Spring 生态的无缝集成,成为微服务架构中流量管理的核心组件。它不仅能实现基本的路由转发,还能通过过滤器和第三方组件集成,满足认证授权、限流熔断、监控追踪等复杂需求,是构建高可用、可扩展微服务系统的关键一环。
