Zuul、Gateway 和 Nginx 有什么区别?

一则或许对你有用的小广告

欢迎 加入小哈的星球 ,你将获得: 专属的项目实战(已更新的所有项目都能学习) / 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/

面试考察点

  1. 技术选型能力:面试官不仅仅是想知道你能背出三者的区别,更是想知道你在实际项目中能否根据场景选择合适的网关方案,而不是 "领导说用啥就用啥"。
  2. 架构分层理解:考察你是否理解这三者并不是互斥的竞争关系,而是可以分层次配合使用的——Nginx 在外层做流量入口,Gateway 在内层做微服务网关。
  3. 底层原理认知:能否从 I/O 模型、编程模型、性能瓶颈等维度分析差异,而不是只停留在 "功能对比" 层面。

核心答案

这三者的定位完全不同,不存在 "谁替代谁" 的关系,而是分属不同层次:

维度NginxZuulSpring Cloud Gateway
定位通用反向代理 / Web 服务器微服务网关(第一代)微服务网关(第二代)
开发语言CJavaJava
I/O 模型epoll(异步非阻塞)Zuul 1.x:同步阻塞;Zuul 2.x:异步非阻塞Netty + Reactor(异步非阻塞)
性能极高(C 语言 + epoll)一般
微服务集成❌ 无✅ 内置服务发现✅ 内置服务发现
动态路由需修改配置并 reload✅ 支持✅ 支持
过滤器扩展Lua(OpenResty)JavaJava
维护状态活跃❌ 已停更✅ Spring 官方主推
适用层次最外层流量入口微服务网关层微服务网关层

一句话总结:Nginx 是 "大门保安",负责流量分发和静态资源;Gateway 是 "楼层前台",负责微服务路由和业务鉴权;Zuul 是 "退休的前台",已经没人用了。

深度解析

一、三者在架构中的定位

上图展示了三者在一个典型生产环境中的分层架构:

  • Nginx 在最外层:作为整个系统的流量入口,处理 SSL、静态资源、跨域等通用逻辑,通过 upstream 将请求分发到多个 Gateway 实例
  • Gateway 在中间层:作为微服务网关,从注册中心获取服务列表,动态路由到各个微服务,同时处理鉴权、限流等业务相关逻辑
  • Zuul 已经出局:不再出现在新架构中

关键点在于,Nginx 和 Gateway 不是 "二选一" 的关系,而是 Nginx 在外、Gateway 在内的分层协作。各司其职,不要让 Gateway 去扛 Nginx 该干的活。

二、Zuul 1.x vs Zuul 2.x vs Gateway 底层对比

这三个的 I/O 模型差异是面试重点:

上图对比了同步阻塞与异步非阻塞两种 I/O 模型的核心差异:

  • Zuul 1.x:基于 Servlet 模型,每个请求占用一个线程,线程在等待后端响应时被阻塞,无法处理其他请求。当并发量上来后,线程池打满,新请求只能排队,吞吐量受限
  • Gateway / Zuul 2.x:基于 Netty + Reactor 模型,少量 Event Loop 线程通过事件驱动处理大量并发。发起请求后不等待,注册一个回调就释放线程,响应回来时再触发回调。同样的硬件配置下,吞吐量远超同步模型

关键区别:同步模型是 "一个请求占一个线程等到底",异步模型是 "一个线程处理多个请求,谁响应了就处理谁"。后者的资源利用率远远更高。

三、全维度对比表

对比维度NginxZuul 1.xZuul 2.xSpring Cloud Gateway
语言CJavaJavaJava
I/O 模型epoll 异步非阻塞Servlet 同步阻塞Netty 异步非阻塞Netty + Reactor 异步非阻塞
并发模型多进程 + 事件驱动线程池(Tomcat)Event LoopEvent Loop(Reactor)
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
服务发现集成✅ Eureka✅ Eureka✅ Nacos / Eureka
动态路由需 reload
负载均衡upstream 配置✅ Ribbon✅ Ribbon✅ LoadBalancer
限流limit_req 模块✅ 内置 + Sentinel
熔断降级✅ Hystrix✅ Hystrix✅ Sentinel
鉴权过滤Lua(OpenResty)Java FilterJava FilterJava GlobalFilter
监控简单✅ Actuator + Prometheus
维护状态✅ 活跃❌ 停更❌ 停更✅ Spring 官方主推
学习成本中(Nginx + Lua)
部署形态独立进程Spring Boot 应用独立进程Spring Boot 应用

四、常见误区

误区 1:"有了 Gateway 就不需要 Nginx 了"

错。生产环境中 Nginx 和 Gateway 各司其职:

  • Nginx 负责 SSL 终止、静态资源、流量分发、防 DDoS
  • Gateway 负责微服务路由、业务鉴权、限流熔断

误区 2:"Gateway 性能比 Nginx 好"

错。Gateway 是 Java 应用,Nginx 是 C 语言写的,单纯比 I/O 吞吐量 Nginx 碾压 Gateway。但 Gateway 胜在微服务集成能力强,用 Java 写过滤器团队维护成本低。

误区 3:"Zuul 2.x 和 Gateway 差不多"

原理上确实都用了异步非阻塞,但 Zuul 2.x 已不在 Spring Cloud 官方路线图内,社区生态和维护支持远不如 Gateway。新项目没有理由选 Zuul。

五、生产环境推荐架构

  • 外层:Nginx 多实例 + Keepalived 实现高可用,负责 SSL、静态资源、流量分发
  • 内层:Gateway 多实例部署,Nginx 通过 upstream 做负载均衡分发到各 Gateway 实例
  • 服务层:各微服务多实例部署,Gateway 从 Nacos 获取服务列表做动态路由

面试高频追问

  1. Nginx 和 Gateway 可以只用一个吗?
    • 小项目可以只用 Gateway,但生产环境建议 Nginx + Gateway 分层。Nginx 扛得住更大的并发,且 Gateway 挂了不影响 Nginx 层的静态资源和 SSL
  2. Zuul 为什么被淘汰了?
    • Zuul 1.x 同步阻塞性能差;Zuul 2.x 虽然改为异步但跳票太久(从 2016 到 2018),Spring 官方等不及自己开发了 Gateway;加之 Netflix 大量组件停更,社区转向了 Spring Cloud Alibaba 体系
  3. Gateway 如何实现高可用?
    • Gateway 本身无状态,通过多实例部署 + Nginx 负载均衡实现高可用。某个 Gateway 实例挂了,Nginx 自动将流量转发到其他实例
  4. Nginx 怎么和 Gateway 配合?
    • Nginx 配置 upstream 指向多个 Gateway 实例,请求先经过 Nginx 的 SSL 终止和流量分发,再转发到 Gateway 进行业务路由

常见面试变体

  • "生产环境中 Nginx 和 Spring Cloud Gateway 怎么配合使用?"
  • "为什么不用 Nginx 直接做微服务网关?"
  • "Gateway 和 Zuul 的底层 I/O 模型有什么区别?"
  • "网关层如何设计高可用方案?"

记忆口诀

三者定位Nginx 是大门,Gateway 是前台,Zuul 已退休

Nginx 扛流量(C 语言 + epoll),Gateway 管路由(Java + 微服务生态),Zuul 别再提(已停更)。

生产环境分层用:外面 Nginx 挡,里面 Gateway 转。

总结

Nginx、Gateway、Zuul 三者定位不同:Nginx 是通用反向代理(C 语言,性能极高),Gateway 是微服务网关(Java,深度集成 Spring Cloud),Zuul 是已淘汰的第一代微服务网关。生产环境推荐 Nginx(外层流量入口)+ Gateway(内层微服务网关) 的分层架构,各司其职,不要混用。