✅ 一、核心概念速记

概念 作用与示例
Route 网关基本单元:ID + 目标 URI + 断言集合 + 过滤器集合
Predicate 请求匹配条件;Path=/api/**、Header=X-Tenant, ^A$ 等
Filter 对请求/响应进行修改;StripPrefix、RewritePath、AddRequestHeader 等
lb:// 使用 Spring Cloud LoadBalancer 从注册中心取实例,例 lb://user-service

✅ 二、操作步骤(YAML 与 Java DSL 双示例)

① 创建项目并引入依赖

Spring Initializr 勾选

  • Spring Cloud Gateway
  • Spring Boot Actuator(可选,查看路由)
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

② 静态 YAML 配置(最常用)

server:
  port: 8080
spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: false          # 关闭自动根据服务名路由,便于手动精确控制
      routes:
        # ---------- Path 匹配 ----------
        - id: user-service-path
          uri: lb://user-service
          predicates:
            - Path=/api/user/**            # 多级通配
            - Method=GET,POST
          filters:
            - StripPrefix=2                # /api/user/1 -> /user/1

        # ---------- Header 匹配 ----------
        - id: admin-service-header
          uri: lb://admin-service
          predicates:
            - Path=/admin/**               # 路径前缀
            - Header=X-Role, Admin         # 精确匹配
            - Header=X-Request-Id, \d{8}   # 正则匹配8位数字

        # ---------- 组合示例 ----------
        - id: pay-service-gray
          uri: lb://pay-service-v2
          predicates:
            - Path=/pay/**
            - Header=X-Gray, true

③ Java DSL 动态路由(可热更新)

@Bean
public RouteLocator customRoute(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("java-path-route",
                    r -> r.path("/order/**")
                          .and().method(HttpMethod.GET)
                          .filters(f -> f.stripPrefix(1))
                          .uri("lb://order-service"))
            .route("java-header-route",
                    r -> r.header("X-Client", "ios")
                          .and().path("/app/**")
                          .filters(f -> f.rewritePath("/app/(?<seg>.*)", "/${seg}"))
                          .uri("lb://app-service"))
            .build();
}

✅ 三、常见错误与排查清单

现象 根因与解决方案
404 Not Found StripPrefix 写错;目标服务实际路径与转发后路径不匹配 → 使用 logging.level.org.springframework.cloud.gateway=DEBUG 查看转发日志
Header 匹配失效 正则写错或大小写敏感;用 curl -H "X-Role: admin" 测试,确保大小写一致
负载均衡失败 lb:// 前缀缺失或服务未注册 → 检查注册中心控制台
路由顺序冲突 通用规则写在前面导致提前匹配 → 将具体规则排在上方

✅ 四、注意事项

  1. 匹配优先级:配置文件中从上到下第一个命中即返回,因此精确路由置于通用路由之上
  2. 大小写:HTTP 头键名不区分大小写,但值区分大小写;正则中注意转义。
  3. StripPrefixRewritePath 都会改变最终转发路径,调试阶段可先禁用。
  4. 生产环境开启 /actuator/gateway/routes 端点需加安全保护,防止泄漏路由规则。

✅ 五、使用技巧与最佳实践

场景 配置示例
灰度发布 利用 Header 路由:- Header=X-Version, v2 将 20% 流量导到新版本
移动端适配 - Header=User-Agent, ~(iPhone|Android) 匹配移动端
统一前缀 使用 PrefixPath=/v1StripPrefix 保持内部服务无版本号
调试 curl -v -H "X-Gray:true" http://gw/pay/test 快速验证 Header 路由
多环境隔离 结合 spring.profiles.active 拆分 application-dev.yml 文件

✅ 六、性能优化建议

维度 建议
路由数量 精简规则,避免数百条正则;可改为动态路由从 DB/Nacos 加载
正则复杂度 Header 正则尽量使用 ^…$ 整行匹配,减少回溯
过滤器链 关闭无用过滤器(如 AddResponseHeader 重复设置)
连接池 使用 Reactor Netty 默认即异步非阻塞,无需额外 HTTP 客户端
超时配置 全局超时 spring.cloud.gateway.httpclient.connect-timeout=2s

✅ 七、一句话总结

Spring Cloud Gateway 路由 = 精准断言(Path/Header) + 轻量过滤器(Strip/Rewrite) + 注册中心负载均衡(lb://) + 顺序优先原则。