SpringCloudGateway:像城市交通指挥系统一样的微服务网关
实际场景引入
想象一下,你所在的城市正在举办一场国际峰会,成千上万的车辆需要有序进出城市。如果没有一个高效的交通指挥系统,城市将陷入瘫痪。交警、信号灯、应急车道、限行规则……这些元素共同构成了城市的‘网关’,决定着每一辆车(请求)能否通行、走哪条路、是否需要检查。
在微服务架构中,Spring Cloud Gateway 就扮演着这个“城市交通指挥系统”的角色。它位于所有外部请求和内部微服务之间,负责路由、过滤、限流、安全等核心职责。
深度解析:核心组件与代码示例
1. 路由(Route)—— 像交警指引车辆走向正确的道路
路由是网关最基本的功能,它定义了请求的路径如何被转发到具体的微服务。
// 配置类方式定义路由
@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("user_service_route", r -> r.path("/api/users/**").uri("http://localhost:8081")) // 转发到用户服务.route("order_service_route", r -> r.path("/api/orders/**").uri("http://localhost:8082")) // 转发到订单服务.build();}
}
或者使用更简洁的 application.yml
配置:
spring:cloud:gateway:routes:- id: user-serviceuri: http://localhost:8081predicates:- Path=/api/users/**- id: order-serviceuri: http://localhost:8082predicates:- Path=/api/orders/**
类比:就像交警根据车牌或目的地,将不同类型的车辆引导至不同的高速入口。
2. 过滤器(Filter)—— 像安检站和ETC通道
过滤器可以在请求被路由前或后执行逻辑,比如身份验证、日志记录、修改请求头等。
自定义全局过滤器:实现访问日志记录
@Component
@Order(-1) // 优先级最高
public class LoggingGlobalFilter implements GlobalFilter {private static final Logger log = LoggerFactory.getLogger(LoggingGlobalFilter.class);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();String path = request.getURI().getPath();String method = request.getMethodValue();log.info("[Gateway] 接收到请求: {} {}, 客户端IP: {}", method, path, getClientIp(exchange));// 继续执行后续过滤器链return chain.filter(exchange).then(Mono.fromRunnable(() -> {ServerHttpResponse response = exchange.getResponse();log.info("[Gateway] 响应完成: {} {}, 状态码: {}", method, path, response.getStatusCode());}));}private String getClientIp(ServerWebExchange exchange) {// 省略IP获取逻辑return "192.168.1.100";}
}
类比:这就像进入城市前的安检站,记录每辆车的信息,并在离开时记录其状态。
使用内置过滤器:添加请求头
spring:cloud:gateway:routes:- id: user-serviceuri: http://localhost:8081predicates:- Path=/api/users/**filters:- AddRequestHeader=Authorization, Bearer abc123xyz- RewritePath=/api/(?<segment>.*), /$\{segment}
RewritePath
过滤器会将 /api/users/1
重写为 /users/1
再转发,而 AddRequestHeader
则自动携带认证信息。
3. 断言(Predicate)—— 像限行政策决定谁可以通行
断言决定了一个请求是否符合某条路由的匹配条件。除了 Path
,还可以基于主机、时间、请求头等进行判断。
predicates:- Path=/api/users/**- Header=Authorization, Bearer .* # 必须携带Bearer Token- After=2023-10-01T00:00:00+08:00 # 只在某个时间之后生效
类比:就像城市规定“新能源车可通行”、“外地车限行”,网关通过断言对请求进行精细化筛选。
要点总结
- Spring Cloud Gateway 是响应式架构,基于 Spring WebFlux 和 Project Reactor,性能远超传统的 Zuul 1.x。
- 三大核心组件:Route(路由)、Predicate(断言)、Filter(过滤器),三者协同工作,构成完整的请求处理流水线。
- 强大的扩展性:支持自定义 Predicate 和 Filter,可轻松集成限流(如结合 Redis + Lua)、熔断、鉴权等高级功能。
掌握 Spring Cloud Gateway,就等于掌握了微服务世界的“交通指挥艺术”。合理设计网关规则,能让整个系统更加安全、高效、可控。