为什么需要 Gateway 网关,它有什么作用?
一则或许对你有用的小广告
欢迎 加入小哈的星球 ,你将获得: 专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目: 《Spring AI 项目实战(问答机器人、RAG 增强检索、联网搜索)》 正在持续爆肝中,基于
Spring AI + Spring Boot3.x + JDK 21..., 点击查看; - 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot3.x + JDK 17..., 点击查看项目介绍; 演示链接: http://116.62.199.48:7070/; - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
面试考察点
- 架构设计思维:面试官不仅仅是想知道你能不能搭一个 Gateway,更是想知道你是否理解网关在微服务架构中的定位——它是整个系统的 "统一大门",是所有外部请求的必经之路。
- 功能掌握深度:考察你是否清楚网关不仅仅是个 "路由转发器",还承担着鉴权、限流、熔断、日志等职责,能否结合实际场景说明。
- 技术选型能力:能否说出 Spring Cloud Gateway 与 Zuul 的本质区别,以及为什么 Gateway 能成为主流选择。
核心答案
没有网关的微服务架构,就像一栋大楼没有大门和前台——每个来访者都可以直接敲任何一扇门,混乱且危险。
网关的核心作用就是为微服务系统提供一个 统一的入口,将所有非业务逻辑的公共功能集中到一处处理,让各个微服务专注于业务本身。
网关的五大核心作用
| 作用 | 说明 | 对应技术 |
|---|---|---|
| 路由转发 | 根据请求路径将请求转发到对应的微服务 | Predicate + Route |
| 身份认证 | 统一校验 Token、权限,不用每个服务都鉴权一遍 | GlobalFilter |
| 限流熔断 | 保护后端服务不被突发流量压垮 | Sentinel / RequestRateLimiter |
| 日志监控 | 统一记录请求日志、响应时间、状态码 | GlobalFilter |
| 协议转换 | 外部 HTTP → 内部 RPC,或反向 | 自定义 Filter |
一句话总结:网关就是微服务的 "门面 + 保安 + 流量调度员"。
深度解析
一、为什么没有网关不行?
上图对比了有无网关的架构差异。关键区别:
- 没有网关:客户端直连各个微服务,每个服务都要自己处理鉴权、跨域、限流等公共逻辑,导致大量重复代码,且服务地址暴露在外
- 有网关:所有请求先经过网关,由网关统一处理公共逻辑,再路由到对应服务。各个微服务只需关注业务,服务地址也对外隐藏
关键点在于,网关本质上是将横切关注点(鉴权、限流、日志等)从各个微服务中剥离出来,集中到一处管理。
二、Spring Cloud Gateway 核心概念
Gateway 的编程模型围绕三个核心概念构建:
上图展示了 Gateway 处理请求的完整流程:
- Route(路由):一个路由规则包含一个 ID、一个目标 URI、一组断言和一组过滤器。可以理解为 "一条转发规则"
- Predicate(断言):匹配条件,比如
Path=/order/**表示只有/order/开头的请求才会匹配这条路由。支持 Path、Method、Header、Query 等多种匹配方式 - Filter(过滤器):分为 Pre(前置)和 Post(后置)两种,在请求转发前和响应返回后执行自定义逻辑,比如鉴权、加请求头、记录日志等
完整链路:请求进来 → 遍历所有 Route → 找到 Predicate 匹配的路由 → 执行 Pre Filter → 转发请求到目标服务 → 执行 Post Filter → 返回响应。
三、路由配置实战
# application.yml — Gateway 路由配置
spring:
cloud:
gateway:
routes:
# 订单服务路由
- id: order-service
uri: lb://order-service # lb:// 表示从 Nacos 获取服务实例
predicates:
- Path=/api/order/** # 匹配路径
- Method=GET,POST # 匹配请求方法
filters:
- StripPrefix=1 # 去掉路径第一段(/api)
- AddRequestHeader=X-Source, gateway # 添加请求头
# 用户服务路由
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- StripPrefix=1
配置说明:
id:路由唯一标识,自定义名称uri:lb://前缀表示启用负载均衡,后面的order-service是注册中心的服务名predicates:匹配条件,只有Path和Method都满足才走这条路由filters:StripPrefix=1会把/api/order/xxx变成/order/xxx,去掉路径第一段
四、自定义全局鉴权过滤器
这是面试常考的代码题——如何在 Gateway 中实现统一鉴权:
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1. 从请求头中获取 Token
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
// 2. Token 为空,返回 401 未授权
if (StringUtils.isBlank(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
// 3. 校验 Token(实际项目中调用 JWT 工具类或认证服务)
try {
Claims claims = JwtUtil.parseToken(token);
// 将用户信息放入请求头,传递给下游服务
ServerHttpRequest request = exchange.getRequest().mutate()
.header("X-User-Id", claims.getSubject())
.build();
return chain.filter(exchange.mutate().request(request).build());
} catch (Exception e) {
// Token 无效或过期
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
}
@Override
public int getOrder() {
return 0; // 数字越小优先级越高
}
}
核心要点:
- 实现
GlobalFilter接口,所有路由都会经过这个过滤器 - 实现
Ordered接口控制过滤器执行顺序,数字越小优先级越高 - 鉴权通过后,把用户信息放进请求头,下游服务直接从 Header 中获取,不用再鉴权
五、Gateway vs Zuul 对比
| 对比维度 | Zuul 1.x | Spring Cloud Gateway |
|---|---|---|
| 编程模型 | 同步阻塞(Servlet) | 异步非阻塞(WebFlux + Netty) |
| 性能 | 一般,线程池模型 | 高性能,少量线程处理大量并发 |
| filter 种类 | pre / route / post / error | pre / post(更简洁) |
| 编程模型 | 基于 ZuulFilter | 基于 GlobalFilter + GatewayFilter |
| 限流支持 | 需额外集成 | 内置 RequestRateLimiter |
| Spring 官方支持 | ❌ 已弃用 | ✅ 官方推荐 |
| 社区活跃度 | 低 | 高 |
核心区别一句话:Gateway 基于响应式编程(Reactor + Netty),异步非阻塞,性能远超 Zuul 1.x 的同步阻塞模型。Zuul 已不在 Spring Cloud 官方路线图内。
面试高频追问
- Gateway 的过滤器有哪几种?
GlobalFilter:全局过滤器,所有路由生效,适合鉴权、日志等公共逻辑GatewayFilter:路由级别过滤器,只对配置了该过滤器的路由生效,适合特定业务处理
- Gateway 如何实现限流?
- 内置
RequestRateLimiter过滤器,基于 Redis 令牌桶算法;生产环境通常配合 Sentinel 使用,支持更丰富的限流策略
- 内置
- Gateway 会不会成为性能瓶颈?
- 理论上会,因为是所有请求的入口。但 Gateway 基于 Netty 异步非阻塞,单机吞吐量非常高;生产环境通过多实例部署 + Nginx 负载均衡来解决
- Gateway 和 Nginx 有什么区别?
- Nginx 是通用反向代理,性能极高但功能偏底层;Gateway 是微服务网关,内置了服务发现、动态路由等微服务能力。生产环境通常 Nginx(外层)+ Gateway(内层)配合使用
常见面试变体
- "Spring Cloud Gateway 的核心组件有哪些?"
- "Gateway 和 Zuul 的区别是什么?"
- "如何在 Gateway 中实现统一鉴权?"
- "Gateway 的路由是怎么配置的?Predicate 和 Filter 的作用?"
记忆口诀
网关五作用:路由、鉴权、限流、日志、协议转换
Gateway 三核心:Route(路由规则)、Predicate(匹配条件)、Filter(过滤器)
"路鉴限日协,路断过三关" —— 路由、鉴权、限流、日志、协议转换;Route 断言 Filter 三道关卡。
总结
网关是微服务架构的统一入口,核心作用包括路由转发、身份认证、限流熔断、日志监控和协议转换。Spring Cloud Gateway 基于 WebFlux + Netty 异步非阻塞模型,性能远超 Zuul,是当前主流选择。掌握 Route、Predicate、Filter 三大核心概念,以及自定义 GlobalFilter 实现鉴权,是面试的必考内容。