1. 为什么需要API网关在微服务架构中随着服务数量的增加直接暴露所有服务端点会带来诸多问题。想象一下一个电商系统可能有用户服务、商品服务、订单服务、支付服务等数十个独立部署的微服务。如果让客户端直接与这些服务通信每个客户端需要知道所有服务的地址和端口跨服务功能如认证、限流需要在每个服务重复实现服务接口变更会导致所有客户端需要同步更新难以统一监控和管理所有入口流量API网关就像是大厦的前台接待处所有访客客户端请求都先到这里由它负责路由到正确的内部服务比如把/product请求转到商品服务统一处理跨领域关注点认证、日志、限流等对客户端隐藏内部架构细节提供灵活的策略控制点提示网关不同于Nginx等传统反向代理它能基于丰富的条件Header、路径、参数等进行智能路由并深度集成微服务生态。2. Spring Cloud Gateway核心架构Spring Cloud Gateway基于Reactor模式实现核心组件包括2.1 路由(Route)路由是网关的基本构建块定义了一个请求如何被转发到目标服务。一个典型路由配置包含routes: - id: user-service uri: lb://user-service predicates: - Path/api/user/** filters: - StripPrefix2id路由唯一标识uri目标服务地址lb://表示从注册中心负载均衡predicates匹配条件这里是路径匹配filters请求/响应处理链2.2 断言(Predicate)Predicate是Java 8的函数式接口决定请求是否匹配当前路由。常用内置断言类型示例说明Path- Path/foo/**路径匹配Method- MethodGET,POSTHTTP方法匹配Header- HeaderX-Request-Id, \d请求头匹配Query- Queryname, Jack查询参数匹配Cookie- CookiesessionId, abc123Cookie匹配2.3 过滤器(Filter)过滤器可以在请求转发前后执行逻辑分为两种GatewayFilter作用于单个路由AddRequestHeader添加请求头AddRequestParameter添加查询参数RewritePath重写路径Retry失败重试GlobalFilter全局生效如认证、日志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); } }3. 实战配置指南3.1 基础环境搭建创建Spring Boot项目添加依赖dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-gateway/artifactId /dependency dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-netflix-eureka-client/artifactId /dependency启用服务发现application.ymlspring: cloud: gateway: discovery: locator: enabled: true # 开启通过服务名自动路由 eureka: client: service-url: defaultZone: http://localhost:8761/eureka3.2 典型路由配置示例场景1路径重写routes: - id: legacy-api uri: http://old-service predicates: - Path/old-api/** filters: - RewritePath/old-api/(?segment.*), /new-api/$\{segment}场景2限流配置routes: - id: rate-limited uri: lb://order-service predicates: - Path/orders/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 # 每秒10个请求 redis-rate-limiter.burstCapacity: 20 # 峰值20个 key-resolver: #{ipKeyResolver} # 按IP限流场景3熔断降级routes: - id: fallback-route uri: lb://inventory-service predicates: - Path/inventory/** filters: - name: CircuitBreaker args: name: inventoryCircuit fallbackUri: forward:/fallback/inventory3.3 动态路由实现生产环境通常需要动态更新路由可通过以下方式实现数据库存储自定义RouteDefinitionRepositoryComponent public class JdbcRouteRepository implements RouteDefinitionRepository { Autowired private RouteMapper routeMapper; Override public FluxRouteDefinition getRouteDefinitions() { return Flux.fromIterable(routeMapper.findAll()); } }配置中心与Nacos/Consul集成spring: cloud: gateway: routes: - id: dynamic-route uri: lb://${service.name} predicates: - Path${service.path}4. 生产环境最佳实践4.1 性能调优线程池配置spring: cloud: gateway: httpclient: pool: max-connections: 1000 # 最大连接数 max-idle-time: 60s # 空闲超时响应式编程优化避免在Filter中阻塞操作如JDBC调用使用WebClient替代RestTemplate4.2 安全防护JWT验证public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { String token extractToken(exchange.getRequest()); return reactiveJwtDecoder.decode(token) .flatMap(chain::filter) .onErrorResume(e - { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); }); }CORS配置spring: cloud: gateway: globalcors: cors-configurations: [/**]: allowedOrigins: * allowedMethods: - GET - POST4.3 监控与排错Actuator端点management: endpoints: web: exposure: include: health,gateway/actuator/gateway/routes查看所有路由/actuator/gateway/refresh强制刷新路由分布式追踪dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-sleuth/artifactId /dependency dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-zipkin/artifactId /dependency5. 常见问题解决方案5.1 路由匹配失效现象配置的路由规则不生效排查步骤检查spring.cloud.gateway.enabledtrue默认true验证predicates条件是否过于严格查看/actuator/gateway/routes确认路由已加载检查过滤器是否修改了请求路径5.2 服务发现异常现象lb://service-name无法解析解决方案确认服务已在注册中心注册检查依赖是否正确dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-loadbalancer/artifactId /dependency测试直接使用http://service-instance-ip:port能否访问5.3 文件上传问题现象文件上传请求被截断原因默认配置限制了请求体大小修复方案spring: cloud: gateway: httpclient: max-content-length: 10MB在实际项目中我发现将网关与Swagger集成时需要特别注意路径处理。一个实用的技巧是添加专门的路由处理API文档routes: - id: swagger uri: http://localhost:${server.port} predicates: - Path/v3/api-docs/** filters: - RewritePath/v3/api-docs/(?path.*), /$\{path}/v3/api-docs