Spring Cloud Gateway介绍 - -基础概念,简单工作原理和配置示例
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 发出请求
- 网关处理程序映射确定与请求匹配的路由
- 请求通过网关过滤器链处理
- 过滤器可以在发送代理请求之前或之后执行逻辑
- 代理请求被发出
- 响应通过过滤器链返回给客户端
配置示例
基本路由配置
spring:cloud:gateway:routes:- id: example-serviceuri: http://example.compredicates:- Path=/example/**filters:- RewritePath=/example/(?<segment>.*), /$\{segment}
集成服务发现
spring:cloud:gateway:discovery:locator:enabled: truelowerCaseServiceId: trueroutes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/api/users/**
常用过滤器
- AddRequestHeader:添加请求头
- AddRequestParameter:添加请求参数
- AddResponseHeader:添加响应头
- PrefixPath:添加路径前缀
- RequestRateLimiter:请求限流
- Retry:重试机制
- Hystrix:熔断器
- FallbackHeaders:熔断时的回退头
自定义开发
自定义过滤器
@Component
public class CustomFilter implements GlobalFilter, Ordered {@Overridepublic 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");}));}@Overridepublic int getOrder() {return -1; // 过滤器执行顺序}
}
自定义路由定位器
@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 是构建现代微服务架构的理想选择,特别适合需要高性能、灵活路由和丰富过滤功能的场景。