Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个 API 网关服务,基于 Spring 5、Spring Boot 2 和 Project Reactor 等技术开发,旨在为微服务架构提供一种简单、有效且统一的 API 路由管理方式。
核心概念
1. 路由(Route)
路由是网关的基本构建块,由 ID、目标 URI、断言集合和过滤器集合组成。当断言匹配时,请求会被转发到目标 URI 并经过一系列过滤器处理。
2. 断言(Predicate)
使用 Java 8 的 Predicate 接口,开发者可以匹配 HTTP 请求中的任何内容(如 headers 或参数),只有匹配的请求才会被路由。
3. 过滤器(Filter)
Spring Cloud Gateway 中的过滤器分为两种:
- Gateway Filter:作用于单个路由
- Global Filter:作用于所有路由
主要特性
- 动态路由:能够匹配任何请求属性,支持动态路由配置
- 请求限流:内置的请求限流功能
- 路径重写:支持路径重写
- 断路器集成:与 Hystrix 断路器集成
- 服务发现集成:支持与 Eureka、Consul 等服务发现组件集成
- 安全控制:易于与 Spring Security 集成
- 监控:提供监控端点
- 高性能:基于 Netty 的非阻塞异步模型
工作原理
Spring Cloud Gateway 的工作流程如下:
- 客户端向 Spring Cloud Gateway 发出请求
- 网关处理程序映射确定与请求匹配的路由
- 请求通过网关过滤器链处理
- 过滤器可以在发送代理请求之前或之后执行逻辑
- 代理请求被发出
- 响应通过过滤器链返回给客户端
配置示例
基本路由配置
yaml
spring:
cloud:
gateway:
routes:
- id: example-service
uri: http://example.com
predicates:
- Path=/example/**
filters:
- RewritePath=/example/(?<segment>.*), /$\{segment}
集成服务发现
yaml
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lowerCaseServiceId: true
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
常用过滤器
- AddRequestHeader:添加请求头
- AddRequestParameter:添加请求参数
- AddResponseHeader:添加响应头
- PrefixPath:添加路径前缀
- RequestRateLimiter:请求限流
- Retry:重试机制
- Hystrix:熔断器
- FallbackHeaders:熔断时的回退头
自定义开发
自定义过滤器
java
@Component
public class CustomFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 前置处理
exchange.getRequest().mutate().header("X-Custom-Header", "value");
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 后置处理
exchange.getResponse().getHeaders().add("X-Response-Header", "value");
}));
}
@Override
public int getOrder() {
return -1; // 过滤器执行顺序
}
}
自定义路由定位器
java
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("path_route", r -> r.path("/get")
.uri("http://httpbin.org"))
.route("host_route", r -> r.host("*.myhost.org")
.uri("http://httpbin.org"))
.build();
}
性能优化建议
- 合理配置路由数量,避免过多路由影响匹配效率
- 使用缓存过滤器缓存频繁访问的响应
- 合理配置连接池大小
- 启用响应压缩
- 合理使用熔断和降级策略
与 Zuul 的比较
- 性能:Spring Cloud Gateway 基于 Netty 和 Reactor,性能优于 Zuul 1.x
- 功能:Gateway 提供了更丰富的路由和过滤功能
- 扩展性:Gateway 更易于扩展和自定义
- 异步支持:Gateway 原生支持异步非阻塞模型
Spring Cloud Gateway 是构建现代微服务架构的理想选择,特别适合需要高性能、灵活路由和丰富过滤功能的场景。