前言
在微服务架构中,API 网关(API Gateway) 是一个关键的组件,它充当了微服务架构的“门面”,负责路由、认证、限流、熔断、日志记录等通用功能。随着微服务数量的增加,传统的网关方案(如 Zuul、Nginx 等)逐渐暴露出性能、可扩展性、灵活性等方面的不足。
Spring Cloud Gateway 是 Spring Cloud 官方推出的第二代 API 网关解决方案,基于 Project Reactor 和 Netty 构建,具有非阻塞、响应式、高性能的特点,是目前构建微服务架构中最主流的网关实现之一。
一、Spring Cloud Gateway 简介
Spring Cloud Gateway 是 Spring Cloud Alibaba 的一部分,但它本身是 Spring Cloud 的原生组件。它使用了 WebFlux + Reactor 技术栈,基于 Netty 提供异步非阻塞的网络通信能力。
1.1 核心概念
Spring Cloud Gateway 有三个核心概念:
- Route(路由):路由是网关的基本单元,由 ID、目标 URI、断言集合和过滤器集合组成。
- Predicate(断言):用于匹配请求是否符合某个条件(如路径、方法、头信息等)。
- Filter(过滤器):用于修改请求和响应,如添加头、修改请求体、限流、鉴权等。
二、Spring Cloud Gateway 的优势
与 Zuul 相比,Spring Cloud Gateway 有以下优势:
特性 | Spring Cloud Gateway | Zuul |
---|---|---|
性能 | 非阻塞,基于 WebFlux 和 Netty,性能更高 | 阻塞式 I/O,性能较低 |
支持协议 | HTTP/HTTPS | 仅支持 HTTP |
可扩展性 | 更容易扩展自定义断言和过滤器 | 扩展性较差 |
集成 | 与 Spring Cloud 生态无缝集成(如 Nacos、Sentinel) | 集成较为复杂 |
社区活跃度 | 活跃,持续更新 | 停止更新,转向 Gateway |
三、快速入门
3.1 添加依赖
<dependencies>
<!-- Spring Cloud Gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- Eureka Client(可选) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
3.2 配置文件(application.yml)
server:
port: 8080
spring:
application:
name: gateway-service
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- StripPrefix=1
上面的配置表示:
- 所有访问
/api/user/**
的请求都会被转发到user-service
微服务。 lb://user-service
表示使用负载均衡访问服务。StripPrefix=1
表示去掉第一层路径/api/user
,只保留后面的部分。
四、核心组件详解
4.1 Route(路由)
路由是网关的核心配置单元,由以下几个部分组成:
- id:路由的唯一标识
- uri:目标服务的地址,支持
http://
,lb://
(负载均衡)等 - predicates:一组断言,用于匹配请求
- filters:一组过滤器,用于修改请求或响应
示例:
routes:
- id: order-service
uri: http://localhost:8082
predicates:
- Method=POST
- Path=/api/order/**
filters:
- AddRequestHeader=X-Request-Id, 123456
4.2 Predicate(断言)
断言用于判断请求是否符合某个条件。Spring Cloud Gateway 提供了多种内置的断言,常见的包括:
断言 | 说明 |
---|---|
Path=/api/user/** |
匹配指定路径 |
Method=GET |
匹配指定 HTTP 方法 |
Header=X-Request-ID, \d+ |
匹配 Header 值是否符合正则 |
Query=username, abc.* |
匹配查询参数是否符合正则 |
After=2025-01-01T00:00:00+08:00[Asia/Shanghai] |
匹配请求是否在指定时间之后 |
Between=2025-01-01T00:00:00+08:00[Asia/Shanghai], 2025-12-31T23:59:59+08:00[Asia/Shanghai] |
匹配请求是否在某个时间段内 |
4.3 Filter(过滤器)
过滤器用于在请求前后对请求或响应进行处理。Spring Cloud Gateway 分为两种类型的过滤器:
- GatewayFilter(局部过滤器):作用于特定路由
- GlobalFilter(全局过滤器):作用于所有路由
常见过滤器示例
过滤器 | 说明 |
---|---|
StripPrefix=1 |
去除路径前缀 |
AddRequestHeader=X-Request-ID, 123456 |
添加请求头 |
RewritePath=/api/(?<segment>.*), /$\{segment} |
重写路径 |
Hystrix=commandName=fallback, fallbackUri=forward:/fallback |
熔断处理 |
RateLimiter=redis-rate-limiter.replenishRate=10, redis-rate-limiter.burstCapacity=20 |
限流 |
五、自定义断言和过滤器
5.1 自定义断言工厂
@Component
public class MyHeaderRoutePredicateFactory extends AbstractRoutePredicateFactory<MyHeaderRoutePredicateFactory.Config> {
public MyHeaderRoutePredicateFactory() {
super(Config.class);
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return exchange -> {
String header = exchange.getRequest().getHeaders().getFirst("X-Custom-Header");
return config.value.equals(header);
};
}
public static class Config {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
}
使用方式:
predicates:
- MyHeader=X-Custom-Value
5.2 自定义过滤器工厂
@Component
public class MyRequestTimeGatewayFilterFactory extends AbstractGatewayFilterFactory<MyRequestTimeGatewayFilterFactory.Config> {
public MyRequestTimeGatewayFilterFactory() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
long start = System.currentTimeMillis();
return chain.filter(exchange).then(
Mono.fromRunnable(() -> {
long end = System.currentTimeMillis();
System.out.println("请求耗时:" + (end - start) + " ms");
})
);
};
}
public static class Config {
// 可以添加配置项
}
}
使用方式:
filters:
- MyRequestTime
六、集成服务注册与发现(如 Nacos、Eureka)
Spring Cloud Gateway 可以自动从服务注册中心获取服务实例,并进行负载均衡调用。
示例(Eureka)
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
其中 lb://user-service
表示使用负载均衡访问服务。
七、集成熔断机制(Hystrix)
Spring Cloud Gateway 支持集成 Hystrix 进行熔断处理。
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- name: Hystrix
args:
name: fallback
fallbackUri: forward:/fallback
创建一个 fallback 接口:
@RestController
public class FallbackController {
@GetMapping("/fallback")
public String fallback() {
return "服务不可用,请稍后再试!";
}
}
八、限流(RateLimiter)
Spring Cloud Gateway 支持基于 Redis 的限流策略。
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/user/**
filters:
- name: RequestRateLimiter
args:
rate-limiter: redis-rate-limiter
key-resolver: #{@userKeyResolver}
自定义 Key 解析器:
@Bean
public KeyResolver userKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
}
九、日志与监控
Spring Cloud Gateway 支持与 Sleuth、Zipkin 集成,进行链路追踪;也可以使用 Prometheus + Grafana 进行性能监控。
十、总结
Spring Cloud Gateway 是当前构建微服务架构中最推荐的 API 网关实现,它基于响应式编程模型,具备高性能、低延迟、可扩展性强等优点。通过 Route、Predicate、Filter 三大核心组件,可以灵活实现路由、鉴权、限流、熔断等常见功能。