简介:本文深入探讨Spring Cloud Gateway作为API网关的核心功能,解析其在请求路由、负载均衡、安全控制等方面的技术实现,并结合实际场景提供可操作的配置建议。
在微服务架构中,服务实例的数量与复杂度随业务扩展呈指数级增长。以电商系统为例,用户下单可能涉及用户服务、商品服务、库存服务、支付服务等多个独立部署的模块。若每个服务直接暴露HTTP接口,客户端需处理以下问题:
Spring Cloud Gateway通过集中式入口解决上述痛点,作为API调用的组织者,它承担了请求路由、协议转换、安全加固等核心职责。
基于属性匹配的路由规则是Gateway的核心特性。通过RouteLocator接口,可实现如下配置:
@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("order_route", r -> r.path("/api/orders/**").and().header("X-Version", "v2").uri("lb://order-service")).route("payment_route", r -> r.host("*.payment.example.com").filters(f -> f.addRequestHeader("X-Request-ID", UUID.randomUUID().toString())).uri("http://payment-gateway")).build();}
此配置展示了:
lb://前缀实现服务发现Gateway提供全局过滤器(GlobalFilter)与局部过滤器(GatewayFilter)两种机制:
全局过滤器示例:
public class AuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String token = exchange.getRequest().getHeaders().getFirst("Authorization");if (token == null || !validateToken(token)) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);}@Overridepublic int getOrder() {return -100; // 高优先级执行}}
filters()方法链式调用,如添加重试机制:
spring:cloud:gateway:routes:- id: product_routeuri: lb://product-servicepredicates:- Path=/api/products/**filters:- name: Retryargs:retries: 3statuses: BAD_GATEWAY,SERVICE_UNAVAILABLE
Gateway内置多种弹性模式:
spring:cloud:gateway:routes:- id: rate_limit_routeuri: http://example.compredicates:- Path=/api/public/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10redis-rate-limiter.burstCapacity: 20redis-rate-limiter.requestedTokens: 1
@Beanpublic GlobalFilter circuitBreakerFilter() {CircuitBreaker circuitBreaker = CircuitBreaker.ofDefaults("backendService");return (exchange, chain) -> {Supplier<Mono<Void>> decoratedSupplier = CircuitBreaker.decorateSupplier(circuitBreaker, () -> chain.filter(exchange));return Mono.fromSupplier(decoratedSupplier).onErrorResume(e -> handleFallback(exchange));};}
/api/user、/api/order)通过Actuator端点暴露关键指标:
management:endpoints:web:exposure:include: gateway,metrics,healthendpoint:gateway:enabled: true
配合Prometheus+Grafana实现可视化监控,重点关注:
WAF集成:通过自定义过滤器实现SQL注入检测
public class WafFilter implements GlobalFilter {private static final Pattern SQL_PATTERN = Pattern.compile(".*(?:'|;|\||--|#|/*|*/|xp_cmdshell|exec|union|select|insert|update|delete).*",Pattern.CASE_INSENSITIVE);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {String query = exchange.getRequest().getURI().getQuery();if (SQL_PATTERN.matcher(query).matches()) {exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);return exchange.getResponse().setComplete();}return chain.filter(exchange);}}
通过权重路由实现金丝雀发布:
spring:cloud:gateway:routes:- id: gray_routeuri: lb://user-servicepredicates:- Path=/api/user/**- Weight=group1, 80, group2, 20filters:- name: AddRequestHeaderargs:name: X-Groupvalue: "#{@weightCalculator.getGroup()}"
配合自定义WeightCalculator Bean动态决定流量分配。
处理WebSocket到HTTP的转换:
@Beanpublic RouteLocator websocketRoute(RouteLocatorBuilder builder) {return builder.routes().route("ws_route", r -> r.path("/ws/**").filters(f -> f.setPath("/api/ws").addRequestHeader("X-Forwarded-Proto", "ws")).uri("ws://backend-service")).build();}
全局CORS配置示例:
@Beanpublic WebFilter corsFilter() {return (exchange, chain) -> {ServerHttpResponse response = exchange.getResponse();response.getHeaders().add("Access-Control-Allow-Origin", "*");response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");response.getHeaders().add("Access-Control-Allow-Headers", "Content-Type, Authorization");return chain.filter(exchange);};}
随着Service Mesh的兴起,Gateway正从应用层向边车(Sidecar)模式演进。Istio等方案将部分路由功能下沉到数据面,但Spring Cloud Gateway在以下场景仍具优势:
建议持续关注Spring Cloud Alibaba等国内生态的兼容性改进,特别是在多云环境下的路由策略优化。
结语:作为API调用的组织者,Spring Cloud Gateway通过其灵活的路由机制、强大的过滤链和完善的弹性设计,已成为微服务架构中不可或缺的基础设施。合理运用其特性,可显著提升系统的可维护性与可靠性。