0%

微服务架构下的 API 网关选型实践

启动一个新的微服务项目时,API 网关的选型是早期需要做出的关键决策之一。网关作为流量入口,承担了路由、认证、限流、监控等职责,直接影响后续系统的可维护性。

背景与需求

我们团队的技术背景:

  • 主力语言:Java
  • 技术框架:Spring Boot, Spring Cloud
  • 部署环境:初期 Docker Compose,生产环境规划 Kubernetes
  • 服务注册中心:Nacos
  • 认证协议:OAuth2/OIDC(认证中心基于 Spring Authorization Server)

基于这个背景,我们梳理了三个核心需求:

  1. 动态性:与 Nacos 深度集成,支持服务自动发现和配置热更新
  2. 安全对接:无缝对接 OAuth2/OIDC 认证体系,处理 Token 验证
  3. 可扩展性:支持自定义插件,能够实现业务特定的准入控制和权限验证逻辑

候选方案

我们筛选了四个主流开源网关进行评估:

方案 底层技术 主要特点
Kong Nginx + Lua 插件生态丰富,成熟度高
Spring Cloud Gateway Netty + Reactor Spring 官方出品,与 Spring 生态深度集成
Higress Envoy 阿里开源,拥抱 Wasm,适合服务网格场景
Apache APISIX Nginx 云原生架构(etcd 存储),动态化设计,插件生态完善

对比分析

维度一:性能与架构

  • Kong / APISIX:基于 Nginx,网络 I/O 性能优异,延迟低
  • Higress:基于 Envoy,性能同样出色,与云原生生态结合紧密
  • Spring Cloud Gateway:基于 Netty,性能良好,但在极限 QPS 场景下与 C++ 编写的 Nginx/Envoy 存在一定差距

结论:对性能要求较高的场景,Nginx 或 Envoy 方案更有优势。

维度二:服务发现与配置管理

  • Spring Cloud Gateway / APISIX / Higress:与 Nacos 集成良好,支持动态发现配置热更新
  • Kong:DB-less 模式下,服务发现和配置更新依赖第三方插件,动态性相对弱

结论:动态性是我们的刚需,Kong 在这个维度不占优。

维度三:插件开发与团队匹配度

这是最关键的维度,直接关系到开发效率和维护成本。

Spring Cloud Gateway

  • 对 Java 团队最自然的选择
  • 使用 Spring Filter 模式编写插件,可以复用 Java 生态的所有工具
  • 权衡:为了开发便利性,需要接受相对 Nginx/Envoy 的性能差距

Kong / APISIX

  • 插件使用 Lua 开发
  • 对纯 Java 团队意味着引入新的语言栈,存在学习成本
  • 但在 AI 辅助编程工具(如 GitHub Copilot、Cursor 等)的加持下,语言学习成本已大幅降低
  • 关键是理解插件的生命周期和 API,具体语法实现可以借助 AI 快速完成

Higress

  • 插件模型基于 Wasm
  • 技术前景好(多语言、安全沙箱),但工具链和生态还在发展,落地存在不确定性

决策

我们最终选择了 Apache APISIX

理由:

  1. 满足性能要求(Nginx 内核)
  2. 与 Nacos 集成成熟,支持动态配置
  3. 插件生态完善,社区活跃
  4. 在 AI 辅助编程的加持下,Lua 开发成本可接受,不必因此放弃 Nginx 的高性能优势

总结

这次选型的几点体会:

  1. 先明确需求再比较:定义好自己的”标尺”,避免被技术热度左右
  2. 团队技能栈是重要考量,但不是绝对约束:在 AI 辅助编程工具普及的今天,跨语言开发的学习成本已大幅降低
  3. 关注”折衷”方案:像 APISIX 这样兼顾高性能底层和良好扩展性的方案,在特定场景下很实用

API 网关选型本质上是在多个维度之间做权衡:

  • 性能 vs 开发效率:纯 Java 方案(SC Gateway)开发体验好但性能受限;Nginx 方案(Kong/APISIX)性能优异但需要学习 Lua,不过 AI 工具可以显著降低语言学习门槛
  • 稳定性 vs 先进性:传统方案经过生产验证,新方案(Higress 的 Wasm)可能带来技术红利但也伴随不确定性
  • 团队现状 vs 技术趋势:在 AI 辅助编程的加持下,不必过度纠结于技术栈的语言差异,更重要的是选择社区成熟、生态完善的方案

每个项目的需求和团队背景不同,选型没有标准答案。以上是我们的实际决策路径,供参考。

参考