1. Spring Cloud Gateway 是什么想象一下你是一个大型商场的经理每天有成千上万的顾客从不同入口进入商场。你需要一个智能系统来引导顾客去往正确的区域检查他们的会员资格甚至在某些情况下改变他们的行进路线——这就是API网关在微服务架构中扮演的角色。Spring Cloud Gateway是基于Spring 5、Spring Boot 2和Project Reactor等技术构建的API网关服务。它就像是微服务架构中的交通警察负责路由请求、安全认证、监控和弹性保护等关键功能。与传统的Zuul网关相比它采用了非阻塞式编程模型性能提升了1.5-2倍特别适合高并发场景。我在实际项目中遇到过这样的案例一个电商平台有20多个微服务每个服务都有自己的接口规范。没有网关时前端团队需要记住每个服务的地址和参数格式调试起来非常痛苦。引入Spring Cloud Gateway后我们统一了API入口前端只需要和网关交互后端服务的变更对前端完全透明。2. 核心配置详解2.1 路由断言工厂实战路由断言就像是网关的if语句决定哪些请求应该被转发到哪个服务。Spring Cloud Gateway提供了12种内置断言工厂覆盖了各种路由判断场景。最常用的Path断言配置示例spring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path/api/users/**这个配置会把所有以/api/users开头的请求路由到user-service。我在配置时踩过一个坑记得在Path值最后加上/**否则只会匹配精确路径。时间断言在促销活动中特别有用predicates: - After2023-12-25T00:00:00.00008:00[Asia/Shanghai] - Before2024-01-01T23:59:59.00008:00[Asia/Shanghai]这样配置可以确保圣诞促销活动只在指定时间段内生效。有个小技巧使用Java 8的ZonedDateTime.now()可以快速生成当前时区的时间戳格式。2.2 过滤器工厂深度应用过滤器就像是请求的加工车间可以在请求转发前后进行各种处理。Gateway提供了30多种内置过滤器这里介绍几个最有特色的请求头过滤器filters: - AddRequestHeaderX-Request-From, gateway - RemoveRequestHeaderSecret-Key这个配置会为所有请求添加一个标识头同时移除敏感头信息。我们在多团队协作时用这个功能来追踪请求来源。路径重写过滤器filters: - RewritePath/api/(?segment.*), /$\{segment}这个正则表达式会把/api/users变成/users。曾经有个项目前端坚持要用/api前缀而后端团队不想改代码重写路径完美解决了这个矛盾。限流过滤器配置示例filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 100 redis-rate-limiter.burstCapacity: 200 key-resolver: #{ipKeyResolver}这个配置实现了基于IP的限流每秒100个请求峰值200。记得在Spring容器中定义keyResolver beanBean public KeyResolver ipKeyResolver() { return exchange - Mono.just( exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()); }3. 动态路由与Nacos集成静态配置在开发环境还行但生产环境需要动态路由能力。结合Nacos可以实现服务发现和路由自动更新。首先添加依赖dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency然后配置Nacos地址spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848动态路由配置示例Bean public RouteDefinitionLocator nacosRouteDefinitionLocator() { return new NacosRouteDefinitionLocator( discoveryClient, nacosDiscoveryProperties ); }这样当有新服务注册到Nacos时网关会自动创建对应的路由规则。我们在灰度发布时就利用这个特性通过Nacos元数据控制流量比例。4. 高级自定义开发4.1 自定义全局过滤器全局过滤器会对所有请求生效适合做统一的鉴权、日志等处理。下面是一个认证过滤器的示例Component public class AuthFilter implements GlobalFilter { Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { String token exchange.getRequest().getHeaders().getFirst(Authorization); if (!validateToken(token)) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } private boolean validateToken(String token) { // 实现你的token验证逻辑 } }4.2 自定义路由断言当内置断言不满足需求时可以自定义断言工厂。比如实现一个基于HTTP方法的复杂断言Component public class CustomMethodPredicateFactory extends AbstractRoutePredicateFactoryCustomMethodPredicateFactory.Config { public CustomMethodPredicateFactory() { super(Config.class); } Override public PredicateServerWebExchange apply(Config config) { return exchange - { HttpMethod method exchange.getRequest().getMethod(); return config.getMethods().contains(method); }; } Data public static class Config { private ListHttpMethod methods; } }然后在配置中使用predicates: - name: CustomMethod args: methods: GET,POST5. 生产环境最佳实践5.1 性能调优网关作为流量入口性能至关重要。以下是几个关键参数server: reactor: netty: resources: loop: selector: 2 # 事件循环线程数建议CPU核数 worker: 4 # 工作线程数我们在压力测试中发现适当增加直接内存能提升性能-Dio.netty.maxDirectMemory512m5.2 高可用方案网关单点故障会导致整个系统不可用建议采用以下方案部署至少2个网关实例前置负载均衡器Nginx/LVS启用健康检查management: endpoint: health: enabled: true endpoints: web: exposure: include: health5.3 监控与告警集成Prometheus监控dependency groupIdio.micrometer/groupId artifactIdmicrometer-registry-prometheus/artifactId /dependency配置示例management: metrics: export: prometheus: enabled: true web: server: request: autotime: enabled: true关键监控指标http_server_requests_seconds请求耗时system_cpu_usageCPU使用率jvm_memory_used内存使用6. 常见问题排查问题1路由不生效检查predicates配置格式是否正确确认服务在Nacos中已注册查看网关日志logging.level.org.springframework.cloud.gatewayDEBUG问题2跨域问题spring: cloud: gateway: globalcors: cors-configurations: [/**]: allowedOrigins: * allowedMethods: * allowedHeaders: *问题3文件上传失败 需要调整最大请求大小spring: cloud: gateway: httpclient: max-in-memory-size: 10MB我在实际项目中还遇到过过滤器执行顺序问题。记住全局过滤器可以通过Order注解或实现Ordered接口来控制顺序数字越小优先级越高。