SpringCloudGateway:像城市交通指挥中心一样的API网关
SpringCloudGateway:像城市交通指挥中心一样的API网关
实际场景引入
想象一下你所在的城市有成百上千条道路,连接着学校、医院、商场和住宅区。如果没有红绿灯、交警和交通监控系统,整个城市将陷入混乱。在微服务架构中,每个服务就像一座独立的建筑,而用户请求就像车辆。Spring Cloud Gateway 就是那个掌控全局的“交通指挥中心”,负责路由、限流、安全校验等关键任务。
深度解析:核心功能与代码示例
1. 路由(Route)—— 如同交通路线规划
Gateway的核心是路由规则,它决定请求应该被转发到哪个微服务。
// 基于Java配置类的方式定义路由
@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("user_route", r -> r.path("/api/users/**").uri("http://localhost:8081") // 转发到用户服务.id("user-service")).route("order_route", r -> r.path("/api/orders/**").uri("http://localhost:8082") // 转发到订单服务.id("order-service")).build();}
}
类比:这就像交通系统为救护车规划专用路线,确保它能快速到达医院。
2. 过滤器(Filter)—— 如同交通检查站
过滤器可以在请求到达目标服务前或响应返回客户端前进行处理,比如添加请求头、身份验证、日志记录等。
// 自定义全局过滤器,用于记录请求耗时
@Component
@Slf4j
public class ResponseTimeFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {exchange.getAttributes().put("startTime", System.currentTimeMillis());return chain.filter(exchange).then(Mono.fromRunnable(() -> {Long startTime = exchange.getAttribute("startTime");if (startTime != null) {long executeTime = System.currentTimeMillis() - startTime;log.info("请求路径:{},耗时:{}ms", exchange.getRequest().getURI().getPath(), executeTime);}}));}@Overridepublic int getOrder() {return 0; // 执行顺序,越小越先执行}
}
类比:这类似于高速公路上的收费站或测速摄像头,对所有车辆进行统一检查。
3. 断言(Predicate)—— 如同交通规则判断
断言决定了某个路由是否匹配当前请求。常见的有路径、时间、请求头等条件。
# application.yml 配置方式
spring:cloud:gateway:routes:- id: timed_routeuri: http://localhost:8083predicates:- After=2025-04-05T00:00:00+08:00[Asia/Shanghai]- Header=X-Request-Id, \d+filters:- AddRequestHeader=Authorization, Bearer token123
上述配置表示:只有在指定时间之后,并且请求头包含
X-Request-Id
且其值为数字的请求,才会被转发,并自动添加认证头。
要点总结
- Spring Cloud Gateway 是基于 WebFlux 的非阻塞网关,性能远超传统的 Zuul 1.x。
- 三大核心组件:Route(路由)、Predicate(断言)、Filter(过滤器),共同构建灵活的请求处理流水线。
- 支持动态路由、限流、熔断等高级特性,是构建现代微服务架构不可或缺的一环。
掌握 Spring Cloud Gateway,就如同掌握了城市交通的调度艺术,让你的系统在高并发下依然井然有序。