Spring Cloud Gateway 路由全攻略:5 种路由模式 + 实战场景 + 路径重写技巧

linbojue
• 阅读 1

在微服务架构中,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/(?.), /user-api/${path}

🔁 路径对照:

客户端请求路径网关转发路径/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/(?.), /user-api/${path} ​

  • 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/(?.), /user-api/${path}/user-api/1001RewritePath(外部服务)/pay/order/create- RewritePath=/pay/(?.), /v1/${path}/v1/order/create

🔑 关键规则:

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

点赞
收藏
评论区
推荐文章
Easter79 Easter79
4年前
springcloud zuul 网关 持久化 动态加载路由的思路分析
在springcloud最新的版本已经有了自己的gateway组件   目前世面上都是基于netflix出品 zuul的gateway    一般我们在生产上都希望能将路由动态化持久化 做动态管理基本设想思路 通过后台页面来管理路由  然后刷新配置  本文将探索一下如何进行zuul路由的数据库持久化 动态化 建议
Stella981 Stella981
4年前
Nacos跨服务器调用服务报错
利用gateway做springcloud微服务网关路由服务时出现报错情况,发现是和网关不在一个服务器的服务无法使用Nacos服务注册的IPNacos注册中心是:https://github.com/alibaba/nacos各个服务通过Nacos客户端将服务信息注册到Nacos上当Nacos服务注册的IP默认选择出问题时,可以通
Stella981 Stella981
4年前
Spring Cloud Gateway中的权重路由
摘要:本文主要通过运用SpringCloudGateway的WeightRoutePredicateFactory对URL进行权重路由。1.权重路由1.1权重路由使用场景在开发或者测试的时候,或者线上发布,线上服务多版本控制的时候,需要对服务提供权重路由,最常见的使用就是,一个服务有两个版本,旧版本V1,新版本
Stella981 Stella981
4年前
Nepxion Discovery Agent
前言基于SpringCloud的全链路灰度蓝绿发布功能,其中一个场景是,基于Header传递的全链路灰度路由,采用配置中心配置路由策略映射在网关或者服务上,支持根据用户自定义Header跟路由策略整合,最终转化为路由Header信息而实现,路由策略传递到全链路服务中。这是一个非常普遍的需求,但如果业务方用了服务之间异步调用的方式,会导致存储在Th
Stella981 Stella981
4年前
Spring Web Reactive Ajax 跨域的坑
吐槽一下,在使用springcloudgateway作为网关时遇到的ajax跨域一坑爹的问题。springcloudgateway使用org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping进行路由匹配;而RoutePredicateHandler
Stella981 Stella981
4年前
Spring Cloud微服务架构从入门到会用(五)—服务网关鉴权
上一篇文章我们集成了服务网关SpringCloudGateway,所有的服务请求都可以通过Gateway访问。那我们就可在服务网关这一层对用户的请求进行鉴权,判断是否可以访问路由的API接口。接下来我们开始增加鉴权,这里我们使用jwt1\.创建授权服务module按照第二篇文章创建一个module,起名为appauth。
Easter79 Easter79
4年前
SpringCloud 简介
SpringCloud是一个工具集:Spring  Cloud是在Spring   Boot的基础上构建的,用于简化分布式系统构建的工具集;使架构师在创建和发布微服务时极为便捷和有效.SpringCloud为开发人员提供了快速构建分布式系统中的一些通用模式(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布
Wesley13 Wesley13
4年前
API网关原理
1、API网关介绍 API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。 API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有
Easter79 Easter79
4年前
SpringCloud微服务(05):Zuul组件,实现路由网关控制
一、Zuul组件简介1、基础概念Zuul网关主要提供动态路由,监控,弹性,安全管控等功能。在分布式的微服务系统中,系统被拆为了多个微服务模块,通过zuul网关对用户的请求进行路由,转发到具体的后微服务模块中。2、Zuul的作用1)按照不同策略,将请求转发到不同的服务上去;
Stella981 Stella981
4年前
Soul高可用网关:配置缓存三大同步策略
前言网关是流量请求的入口,在微服务架构中承担了非常重要的角色,网关高可用的重要性不言而喻。在使用网关的过程中,为了满足业务诉求,经常需要变更配置,比如流控规则、路由规则等等。因此,网关动态配置是保障网关高可用的重要因素。那么,Soul网关又是如何支持动态配置的呢?使用过Soul的同学都知道,Soul的插件全都是热插拔的,并且