文章目录
-
-
- 一、核心定位与价值
- 二、核心特性
- 三、核心概念
- 四、工作原理
- 五、简单使用示例
-
- [1. 引入依赖(Maven)](#1. 引入依赖(Maven))
- [2. 配置路由规则(application.yml)](#2. 配置路由规则(application.yml))
-
- [示例 1:基本路由(转发到固定地址)](#示例 1:基本路由(转发到固定地址))
- [示例 2:结合服务发现(动态转发到服务名)](#示例 2:结合服务发现(动态转发到服务名))
- [3. 自定义过滤器(示例:简单认证)](#3. 自定义过滤器(示例:简单认证))
- 六、高级功能示例
-
- [1. 限流(基于 IP)](#1. 限流(基于 IP))
- [2. 集成 Sentinel 熔断降级](#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)
xml
<!-- 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:基本路由(转发到固定地址)
yaml
spring:
cloud:
gateway:
routes:
- id: user-service-route # 路由唯一ID
uri: http://localhost:8081 # 目标服务地址(固定地址)
predicates:
- Path=/api/user/** # 断言:路径匹配 /api/user/** 时触发路由
filters:
- RewritePath=/api/user/(?<segment>.*), /user/$\{segment} # 路径重写:/api/user/1 → /user/1
示例 2:结合服务发现(动态转发到服务名)
yaml
spring:
cloud:
gateway:
routes:
- id: order-service-route
uri: 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 接口定义全局过滤器,对所有请求进行认证校验:
java
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 获取请求头中的 Token
String token = exchange.getRequest().getHeaders().getFirst("Token");
// 简单校验:Token 不存在则返回 401
if (token == null || token.isEmpty()) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 校验通过,继续执行过滤器链
return chain.filter(exchange);
}
// 过滤器优先级:数值越小,优先级越高
@Override
public int getOrder() {
return -100;
}
}
六、高级功能示例
1. 限流(基于 IP)
使用内置的 RequestRateLimiter 过滤器,基于 Redis 实现令牌桶限流:
yaml
spring:
cloud:
gateway:
routes:
- id: limit-route
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- name: RequestRateLimiter
args:
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 {
@Bean
public KeyResolver ipKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}
}
2. 集成 Sentinel 熔断降级
结合 Sentinel 实现路由级别的熔断降级,当目标服务异常时返回降级响应:
yaml
# 引入 Sentinel 依赖后,配置熔断规则
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制台
gateway:
routes:
- id: sentinel-route
uri: lb://pay-service
predicates:
- 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 生态的无缝集成,成为微服务架构中流量管理的核心组件。它不仅能实现基本的路由转发,还能通过过滤器和第三方组件集成,满足认证授权、限流熔断、监控追踪等复杂需求,是构建高可用、可扩展微服务系统的关键一环。