在微服务架构中,API 网关是系统的统一入口。而 Spring Cloud Gateway 凭借高性能和灵活配置,成为主流选择。 本文通过 真实可运行的配置 + 明确的请求/转发路径对照,帮你快速掌握 Gateway 路由核心用法。
一、前置准备:一个简单的用户服务 假设我们有一个 user-service,提供如下接口: sql 体验AI代码助手 代码解读复制代码GET /user-api/users/1001
后端地址:http://172.18.230.52:8889 已注册到 Nacos,服务名为 user-service
目标:通过网关访问该接口。
二、5 大路由模式详解(含完整路径对照) 模式 1️⃣:服务发现路由(推荐生产使用) 特点:通过服务名从 Nacos 动态获取实例,自动负载均衡。 ✅ 配置: ini 体验AI代码助手 代码解读复制代码- id: user-service-route uri: lb://user-service predicates: - Path=/api/shop/** filters: - StripPrefix=2
🔁 路径对照:
客户端请求路径网关转发路径/api/shop/user-api/users/1001/user-api/users/1001 📌 最终转发地址: arduino 体验AI代码助手 代码解读复制代码http://<Nacos注册的IP>:8889/user-api/users/1001
✅ 适用:标准微服务调用 ⚠️ 需引入 spring-cloud-starter-loadbalancer
模式 2️⃣:静态 URI 路由(调试 & 外部服务)
特点:直接写死后端地址,不依赖注册中心。
✅ 配置(调试用):
ruby 体验AI代码助手 代码解读复制代码- id: debug-user-route
uri: http://172.18.230.52:8889
predicates:
- Path=/debug/user-api/*
filters:
- RewritePath=/debug/user-api/(?
🔁 路径对照:
客户端请求路径网关转发路径/debug/user-api/users/1001/user-api/users/1001 📌 最终转发地址: arduino 体验AI代码助手 代码解读复制代码http://172.18.230.52:8889/user-api/users/1001
✅ 适用:本地调试、代理第三方 API
模式 3️⃣:自动服务路由(仅开发用) 特点:开启后自动生成 /服务名/** 路由。 ✅ 配置: yaml 体验AI代码助手 代码解读复制代码spring: cloud: gateway: discovery: locator: enabled: true
🔁 路径对照:
客户端请求路径网关转发路径/user-service/user-api/users/1001/user-api/users/1001 📌 最终转发地址: ruby 体验AI代码助手 代码解读复制代码lb://user-service/user-api/users/1001 → 实际 IP:Port
⚠️ 生产环境建议关闭(暴露服务名不安全)
模式 4️⃣:Header 路由(灰度发布)
特点:根据 Header 值分流到不同后端。
✅ 配置:
ini 体验AI代码助手 代码解读复制代码- id: user-v1
uri: http://172.18.230.52:8889
predicates:
- Path=/api/user/*
- Header=X-Version, v1
filters:
- RewritePath=/api/user/(?
- id: user-v2
uri: http://172.18.230.53:8890
predicates:
- Path=/api/user/**
- Header=X-Version, v2 filters:
- RewritePath=/api/user/(?
.*), /user-api/${path}
🔁 路径对照:
客户端请求(带 Header)网关转发路径目标地址GET /api/user/users/1001 X-Version: v1/user-api/users/1001172.18.230.52:8889GET /api/user/users/1001 X-Version: v2/user-api/users/1001172.18.230.53:8890
✅ 适用:灰度发布、AB 测试
模式 5️⃣:组合谓词路由(精细化控制) 特点:多个条件同时满足才匹配。 ✅ 配置: ini 体验AI代码助手 代码解读复制代码predicates:
- Path=/admin/**
- Method=POST
- Header=X-Token, secret-\d{4}
- Query=role, admin|superadmin
🔁 示例:
客户端请求是否匹配POST /admin/delete X-Token: secret-1234 ?role=admin✅ 匹配GET /admin/list❌ 不匹配(Method 错)POST /admin/delete X-Token: abc❌ 不匹配(Header 值不符)
✅ 适用:高安全接口、管理后台
三、路径重写:两种方式对比(输入 vs 输出)
重写方式客户端请求路径配置转发路径StripPrefix=2/api/v1/user/profile- StripPrefix=2/user/profileRewritePath/old/user-api/1001- RewritePath=/old/user-api/(?
🔑 关键规则:
StripPrefix=N:按 / 分段,去掉前 N 段 RewritePath 左边必须匹配客户端路径 YAML 中 $ 必须写成 ${path}(否则报错!)
四、调试技巧 开启日志,查看实际转发地址: yaml 体验AI代码助手 代码解读复制代码logging: level: org.springframework.cloud.gateway: DEBUG reactor.netty.http.client: DEBUG
你会看到: vbnet 体验AI代码助手 代码解读复制代码REQUEST: GET /user-api/users/1001 Connecting to /172.18.230.52:8889
五、总结:如何选择?
场景推荐方案微服务生产调用lb://服务名 + StripPrefix本地调试静态 URI + RewritePath第三方 API静态 URI灰度发布Header 路由快速验证自动路由(仅开发)
💡 最佳实践:生产环境关闭自动路由,所有规则显式声明。
✅ 所有配置均已实测可用,复制即跑! ✅ 欢迎点赞收藏,关注我获取更多 Spring Cloud 实战干货!
https://infogram.com/9862pdf-1h984wv1dykxd2p https://infogram.com/9862pdf-1hnp27eqy97yy4g https://infogram.com/9862pdf-1hnq41opzgdnk23 https://infogram.com/9862pdf-1h984wv1dymnd2p https://infogram.com/9862pdf-1h0n25opl7njl4p https://infogram.com/9862pdf-1hnp27eqy9l7y4g https://infogram.com/9862pdf-1h984wv1dymez2p https://infogram.com/9862pdf-1hmr6g8jz55dz2n https://infogram.com/9862pdf-1h984wv1dyy8d2p https://infogram.com/9862pdf-1h9j6q75kzz9v4g
