网关技术选型的优劣对比

常见的网关技术

在微服务架构中,API 网关通常承担统一入口、路由转发、认证鉴权、限流熔断、灰度发布、日志监控等功能。不同公司的网关技术选型往往与技术栈、业务规模、团队能力密切相关。常见网关技术主要有以下几类:

  • Java 生态

    • Apache ShenYu
    • Spring Cloud Zuul
    • Spring Cloud Gateway
  • Nginx / Lua 生态

    • Kong
    • Apache APISIX
    • Nginx + Lua(OpenResty)
  • 云原生网关

    • Envoy
    • Higress
    • Traefik
  • 自研网关

    • 基于 Netty / Servlet 自研网关
    • 基于 Nginx + Lua(OpenResty)自研网关

网关技术的优劣对比

Kong

Kong 本质上是基于 Nginx + Lua(OpenResty)实现的 API 网关。

  • 特点:
    • 运行在 Nginx 之上
    • 使用 Lua 编写网关逻辑
    • 提供丰富的插件机制
    • 支持认证、限流、日志、监控等功能
  • 优点:
    • 性能高,依托 Nginx 的高并发能力
    • 插件生态丰富,很多功能开箱即用
    • 配置和扩展比较灵活
  • 缺点:
    • Lua 技术栈在很多公司并不常见
    • 深度定制开发需要熟悉 Nginx 和 OpenResty
    • 运维复杂度相对较高
  • 适用场景:
    • 对性能要求高
    • 能接受 Lua 技术栈
    • 不希望自己开发大量网关功能

Spring Cloud Zuul

Zuul 是 Spring Cloud 技术栈中的网关组件,基于 Java + Servlet 模型实现。注意,Zuul 1.x 基于 Servlet,性能一般;Zuul 2.x 改为基于 Netty,性能大幅提升,但开源版本功能不完整。

  • 特点:
    • 与 Spring Cloud 体系深度整合
    • 可以直接通过 Java 代码扩展
    • 与微服务生态(Eureka、Ribbon 等)天然兼容
  • 优点:
    • Java 技术栈,开发和维护成本低
    • 易于二次开发
    • 与 Spring Cloud 微服务体系集成简单
  • 缺点:
    • 基于 Servlet + Tomcat
    • 并发性能相比 Nginx 较弱
    • 限流、灰度发布、动态路由等功能通常需要自己实现
  • 适用场景:
    • 中小规模业务
    • Java 技术栈团队
    • Spring Cloud 微服务体系

Spring Cloud Gateway

Spring Cloud Gateway 是 Spring Cloud 体系中的新一代网关组件,用于替代 Zuul。它基于 Spring WebFlux + Reactor + Netty 构建,采用异步非阻塞模型,在性能和扩展性方面相比 Zuul 有明显提升。

  • 特点:

    • 基于 Spring WebFlux(Reactive 编程模型)
    • 底层使用 Netty,采用非阻塞 I/O 架构
    • 与 Spring Cloud 生态(Eureka、Config、Nacos、Sentinel 等)深度整合
    • 提供 Filter(过滤器)机制,支持全局过滤器和路由过滤器
    • 支持 Predicate(断言)机制,用于灵活匹配路由规则
  • 优点:

    • 基于 Reactor + Netty,并发性能比 Zuul 1.x 更高
    • 原生支持动态路由、限流、熔断、重试、负载均衡
    • 与 Spring Cloud 生态集成非常方便
    • Java 技术栈,易于开发和扩展
    • 支持响应式编程模型(Reactive)
  • 缺点:

    • 依赖 Reactive 编程模型,学习成本较高
    • 调试难度比传统 Servlet 模型稍高
    • 对传统阻塞式组件兼容性较差
  • 适用场景:

    • Spring Cloud 微服务体系
    • Java 技术栈团队
    • 中大型微服务架构
    • 需要较高并发能力的网关系统

Nginx + Lua(OpenResty)

Nginx + Lua(OpenResty)这种方案通常是直接基于 OpenResty 开发自己的网关组件。OpenResty = Nginx + LuaJIT + Lua 模块生态 在很多技术体系中,都会涉及如何基于 Nginx + Lua 自主实现类似 Kong 的网关组件。

  • 优点:
    • 极高并发性能
    • 充分利用 Nginx 生态
    • 可完全定制网关逻辑
  • 缺点:
    • Lua 技术栈门槛较高
    • Nginx 源码复杂(基于 C 语言)
    • 深度定制开发难度较大
  • 适用场景:
    • 超高并发系统
    • 有 OpenResty 经验的团队
    • 需要深度定制网关能力

基于 Netty / Servlet 自研网关

基于 Netty / Servlet 自研网关组件,很多互联网大厂都会选择自研网关。

  • 常见实现技术:
    • Netty
    • Servlet
    • Reactor
  • 实现的核心功能:
    • 动态路由
    • 认证鉴权
    • 限流熔断
    • 灰度发布
    • 服务治理
    • 日志监控
  • 优点:
    • 完全掌控源码
    • 性能可以做到非常高
    • 可以根据业务需求深度定制
  • 缺点:
    • 研发成本高
    • 需要长期维护
    • 需要较强的基础设施团队
  • 适用场景:
    • 大型互联网公司
    • 流量规模巨大
    • 需要深度定制能力

大厂与中小公司的网关选型对比

  • 大厂
    • 常见大厂:
      • BAT(百度、阿里、腾讯)
      • 字节
      • 京东
      • 美团
      • 滴滴
    • 常见方案:
      • 基于 Netty 自研网关
      • 基于 Nginx + Lua(OpenResty)自研网关
    • 选择原因:
      • 流量规模巨大
      • 需要深度定制能力
      • 有基础设施团队支撑
      • 可以长期维护自研系统

  • 中小型公司
    • 中小型公司更倾向于成熟开源方案。
    • 常见方案:
      • Spring Cloud 技术栈
        • Spring Cloud Zuul
        • Spring Cloud Gateway
      • Dubbo 技术栈
        • Kong
        • Apache ShenYu
        • 有些公司甚至不使用网关,其架构是:用户 -> Nginx(反向代理 + 负载均衡)-> 微服务