微服务架构中,服务被拆成了几十甚至上百个独立的小应用。前端要调用这些服务,总不能记住每一个服务的地址吧?用户请求进来,谁来负责转发?谁来验证用户有没有登录?谁来统计每个接口被调用了多少次?
这些问题,都需要一个"守门人"来解决。
这个守门人就是网关。它是所有外部请求进入系统的第一道关卡,也是微服务架构中不可或缺的核心组件。
这篇文章用最通俗的方式,讲清楚网关是什么、解决了什么问题,以及 SpringCloud Gateway 的核心工作流程。
一、一个商场的比喻
想象你走进一个大型购物中心。
没有网关
商场没有总服务台,你想买东西,得自己记住每家店的位置:优衣库在3楼左拐第5家,海底捞在4楼右拐第2家,电影院在5楼直走到底......想买三样东西,你得跑三个地方,自己认路、自己找门。
而且,每家店门口都有保安,你要进去先得掏身份证验证身份,每家店都验证一遍。
这就是没有网关的微服务------客户端直接调用各个服务,每个服务都要自己做认证、限流、日志,而且客户端要记住所有服务的地址。
有了网关
商场门口有了一个总服务台。你进来只去服务台,说"我要买衣服、吃饭、看电影"。服务台的工作人员帮你查好:优衣库在哪、海底捞在哪、电影院在哪,甚至帮你指路。
更重要的是,服务台还帮你做了统一安检:进门时验一次身份证就行,不用每家店都掏证件。服务台还会统计今天来了多少人,哪家店人多需要疏导。
这个总服务台,就是网关。
二、网关的核心职责
网关处在所有请求的必经之路上,天然适合做以下几件事:
| 职责 | 说明 |
|---|---|
| 路由转发 | 根据请求路径,转发给对应的后端服务 |
| 统一认证 | 在这里校验 Token,不用每个服务都做一遍 |
| 限流熔断 | 防止某个接口被刷爆,保护后端服务 |
| 日志监控 | 记录每个请求的耗时、状态码、来源 IP |
| 跨域处理 | 统一配置跨域,不用每个服务单独配 |
| 协议转换 | 比如外部是 HTTP,内部是 gRPC |
你可以把网关想象成一个"智能路由器 + 保安 + 统计员"的三合一角色。
三、网关在架构中的位置
一个典型的微服务架构中,网关处在最前端:
客户端(App/浏览器)
↓
[网关] ← 统一入口,做认证、限流、路由
↓
[服务实例] ← 被拆分的多个服务
↓
[注册中心] ← 网关从这里知道每个服务在哪台机器上
网关本身不处理业务逻辑,它只做"转发"和"拦截"。真正的业务处理,交给后面的订单服务、用户服务、商品服务等。
四、SpringCloud Gateway 的核心概念
SpringCloud Gateway 是目前 Spring 生态中最主流的网关方案。理解它,只需要搞懂三个概念:路由、断言、过滤器。
4.1 路由(Route)
路由就是"转发规则"。它定义了:什么样的请求,应该转发到哪个服务。
比如:/api/order/** 开头的请求 → 转发到订单服务,/api/user/** → 转发到用户服务。
路由就像一个交通指示牌,告诉请求该往哪走。
4.2 断言(Predicate)
断言就是"匹配条件"。路由规则不是光看路径,还可以组合很多条件:
-
请求路径是
/api/order/**吗? -
请求方法是 POST 吗?
-
请求参数里有
token吗? -
请求头里的
User-Agent包含Mobile吗?
所有条件都满足,这个请求才会走这条路由。断言就像一道道的安检门,符合条件的才能通过。
4.3 过滤器(Filter)
过滤器就是"拦截处理"。请求在到达后端服务之前,或者响应在返回客户端之前,可以经过一系列过滤器:
-
请求进来时:验证 Token、记录开始时间、添加请求头
-
响应返回时:记录耗时、添加响应头、压缩内容
过滤器就像流水线上的加工站,每个站做一件事,可以串联起来。
网关内置了很多常用过滤器,比如添加请求头、添加响应头、重试、熔断等。你也可以自定义过滤器,实现自己的业务逻辑。
五、网关的工作流程
一个请求从进入网关到拿到响应,大致经历以下步骤:
第一步:请求到达网关
客户端发起的请求,首先到达网关。
第二步:断言匹配
网关根据配置的路由规则,逐一检查请求是否匹配某个路由的断言条件。匹配到第一个符合的路由后,就确定要去哪个服务。
第三步:前置过滤器执行
在转发请求之前,先执行一组前置过滤器。比如验证 Token、检查限流、记录开始时间、添加统一的请求头等。如果某个过滤器抛出异常,请求会被拦截,直接返回错误,不会继续往下走。
第四步:转发请求
网关根据注册中心提供的服务地址,把请求转发给真正的后端服务。这一步对客户端是透明的,客户端只知道它在跟网关通信,不知道后端有几台机器、分别在哪。
第五步:后端处理
后端服务处理业务逻辑,返回响应给网关。
第六步:后置过滤器执行
网关拿到后端服务的响应后,执行后置过滤器。比如计算请求耗时、添加统一的响应头、压缩响应内容等。
第七步:返回客户端
网关把最终响应返回给客户端,一次请求结束。
六、网关解决了哪些实际问题
6.1 服务地址对外隐藏
没有网关时,客户端需要知道订单服务的 IP 和端口。一旦订单服务扩容、迁移,客户端就得跟着改。有了网关,客户端只知道网关的地址,后端服务怎么变,客户端完全无感知。
6.2 统一认证鉴权
没有网关时,每个服务都要自己写代码验证 Token、检查权限。有了网关,认证逻辑只写一次,所有请求进来时统一处理。通过认证的请求,网关可以在转发时把用户信息(比如用户 ID)塞进请求头,后端服务直接拿过来用就行。
6.3 统一限流熔断
某个热门接口突然被大量刷请求,没有限流的话,后端服务很容易被打垮。网关可以在入口处做限流,超过阈值的请求直接返回"请稍后重试",保护后面的服务。
6.4 统一日志监控
所有请求都经过网关,网关天然就是一个日志采集点。你可以在这里记录每个请求的路径、耗时、状态码、来源 IP,方便做监控和问题排查。
6.5 跨域统一处理
前后端分离项目中,跨域问题很常见。如果没有网关,每个服务都要单独配置跨域。有了网关,只在网关配置一次就行。
七、网关的高可用
网关这么重要,如果它挂了怎么办?所有请求都进不来。
所以网关本身也需要做高可用。通常的做法是:部署多个网关实例,前面再放一个负载均衡器(比如 Nginx)。这样,单个网关实例出问题,流量会自动切换到其他实例。
另外,网关本身不应该有状态------比如不要在网关里存用户 Session。这样任何一个网关实例都能处理任何请求,方便水平扩展。
八、网关不是什么
理解网关的边界也很重要:
-
网关不处理业务逻辑:它只做转发和拦截,真正算价格、存订单是后端服务的事
-
网关不是数据库:不要试图在网关里缓存大量业务数据
-
网关不是万能的:复杂的业务路由规则会让网关变得难以维护
九、什么时候应该用网关
适合使用网关的场景:
-
微服务数量超过 3-5 个,客户端调用开始变得混乱
-
需要统一的认证、限流、日志能力
-
后端服务经常扩缩容、变更地址
不太需要网关的场景:
-
只有一两个服务,直接调用也简单
-
系统是内部使用,调用方可控
十、总结
网关是微服务架构的"总服务台",所有请求都经过它,再由它转发给真正的后端服务。
它的核心价值可以概括为三句话:
-
路由转发:把请求送到正确的地方
-
统一拦截:认证、限流、日志只做一次
-
对外隐藏:客户端只知道网关,不知道后端细节
用商场的比喻来总结:网关就是购物中心的总服务台。你不需要记住每家店的位置,服务台帮你指路;你不需要每家店都过安检,服务台帮你统一验证;服务台还会统计客流量、疏导拥堵。
在微服务架构中,网关不是可选项,而是必选项。它让几十个分散的服务,在客户端看来仍然像"一个系统"。