APISIX 实战:用云原生 API 网关统一流量治理

在微服务与云原生架构里,APISIX 作为 Apache 顶级项目的云原生 API 网关,正成为统一流量治理的事实标准。它基于 etcd 做配置同步、以 Nginx 为数据面,能在不重启进程的前提下动态下发路由、限流、鉴权等规则,本文带你从零把 APISIX 落到生产可用。

一、为什么需要 API 网关

当后端服务从单体拆分出几十个微服务后,客户端直连会暴露大量内部地址、难以统一鉴权与限流。API 网关把”路由、认证、限流、可观测”收口到一层,让业务服务只关心业务逻辑。相比传统 Nginx 需要 reload 才能变更配置,APISIX 借助 etcd 实现了秒级动态生效。

举个常见的坑:客户端 App 直接调用 20 个微服务,每个服务都要各自实现登录校验、接口鉴权、跨域处理与限流,任何一处疏漏都会变成安全或稳定性隐患。更糟的是,当某个服务要升级、拆分或下线时,所有调用方都得同步改地址。API 网关把这些横切关注点收口到边缘一层,后端只暴露内网地址,外部统一走网关,运维与安全的复杂度立刻下降一个量级。

二、核心架构:etcd + Nginx + 插件

APISIX 分为控制面与数据面:控制面通过 Admin API 接收配置并写入 etcd;数据面(基于 Nginx + Lua/OpenResty)监听 etcd 变更,热加载到内存。所有能力都以插件形式存在——限流、JWT、CORS、灰度、可观测等,可对任意路由按需启用。这种”配置与转发分离”的设计,让它在高并发下依然保持亚毫秒级延迟。

数据面本质是 OpenResty(Nginx + LuaJIT),插件逻辑运行在事件驱动模型上,不会阻塞 worker,这正是它高性能的关键。配置变更经 etcd watch 推送到每个节点,无需中心转发,水平扩展几乎没有上限;即便 etcd 短暂不可用,已加载的路由仍照常转发,只是暂时无法下发新配置。

三、APISIX 与 Kong、Envoy 怎么选

市面上的 API 网关不止 APISIX。Kong 同样基于 OpenResty,生态成熟但强功能多在企业版;Envoy 更偏向 Sidecar 与 Service Mesh 数据面,学习曲线陡;Spring Cloud Gateway 则绑定 Java 技术栈。APISIX 的优势在于纯动态配置、插件热加载与活跃的中文社区。

网关配置方式动态性适用场景
APISIXetcd 动态秒级热加载云原生 / 多协议
Kong数据库 / 声明式部分动态企业插件生态
EnvoyxDS 动态强Service Mesh
SC Gateway代码 / 配置重启生效Java 单体栈

四、Docker Compose 一键拉起

本地验证最简单的方式是用 Docker Compose 同时拉起 APISIX 与 etcd。下面这份配置可直接照搬思路:

version: "3"
services:
  etcd:
    image: bitnami/etcd:3.5
    environment:
      ETCD_ENABLE_V2: "true"
      ALLOW_NONE_AUTHENTICATION: "yes"
      ETCD_ADVERTISE_CLIENT_URLS: http://etcd:2379
      ETCD_LISTEN_CLIENT_URLS: http://0.0.0.0:2379
    ports:
      - "2379:2379"
  apisix:
    image: apache/apisix:3.9-debian
    depends_on:
      - etcd
    ports:
      - "9080:9080"   # 数据面入口
      - "9180:9180"   # Admin API
    volumes:
      - ./config.yaml:/usr/local/apisix/conf/config.yaml:ro

五、配置第一条路由与上游

启动后,用 Admin API 创建一个上游(后端服务)并绑定路由。下面把 /api/hello 转发到本地 8080 服务:

# 创建上游
curl http://127.0.0.1:9180/apisix/admin/upstreams/1 \
  -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
  "type": "roundrobin",
  "nodes": { "127.0.0.1:8080": 1 }
}'

# 创建路由
curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
  "uri": "/api/hello",
  "upstream_id": 1
}'

访问 http://127.0.0.1:9080/api/hello 即可看到后端响应,全程无需重启。这与我们之前讲过的 Nomad 统一编排 思路一致——基础设施即声明。

六、插件实战:限流、JWT 与跨域

APISIX 目前内置 80+ 官方插件,覆盖认证、安全、流量与可观测。下面给路由加上”每分钟 100 次限流”与 JWT 鉴权:

curl http://127.0.0.1:9180/apisix/admin/routes/1 \
  -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PATCH -d '
{
  "plugins": {
    "limit-req": {
      "rate": 100, "burst": 50, "key": "remote_addr",
      "rejected_code": 429
    },
    "jwt-auth": { "key": "user-key", "secret": "my-secret" },
    "cors": {}
  }
}'

6.1 插件市场与自定义插件

除了内置插件,你还可用 Lua 编写自定义插件,针对业务做定制逻辑,例如按租户维度限流、注入请求头、做报文转换。插件以优先级链执行、顺序可调,这让复杂的边缘逻辑变得可组合。常见内置插件包括 key-auth、jwt-auth、openid、waf、limit-count、proxy-mirror、skywalking 等。

6.2 灰度发布与金丝雀

通过 traffic-split 插件可以把 10% 流量导向新版本上游,实现无损灰度:

{
  "plugins": {
    "traffic-split": {
      "rules": [{
        "weighted_upstreams": [
          { "upstream_id": 1, "weight": 90 },
          { "upstream_id": 2, "weight": 10 }
        ]
      }]
    }
  }
}

七、可观测性:对接 Prometheus 与 OTel

网关是流量的咽喉,可观测必不可少。启用 prometheus 插件后,APISIX 在 /apisix/prometheus/metrics 暴露指标,可直接接入你已有的 Prometheus + Grafana 监控;再叠加 opentelemetry 插件,即可把链路追踪接到 OpenTelemetry 可观测体系,一眼看清每个请求的跨服务路径。

此外 APISIX 还支持 skywalking、zipkin 等追踪后端,并可通过 error-log 插件把错误日志推送到外部日志系统。对于多集群场景,可以结合服务发现插件(nacos、consul、dns)自动维护上游节点,避免手动维护节点列表。

八、生产部署要点

维度建议
高可用APISIX 无状态,多节点 + etcd 集群(至少 3 节点)
Admin 安全Admin API 只对内网开放,轮换 X-API-KEY,禁公网 9180
TLS前置 Nginx 反向代理 做 SSL 终止与统一入口
配置管理路由用声明式文件经 GitHub Actions 审核后下发

在 Kubernetes 中,APISIX 既可独立 Deployment 部署,也可使用官方 Ingress Controller,把 Ingress 资源直接翻译成网关路由,享受声明式运维。无论哪种形态,务必保证 etcd 的高可用,因为它是整个配置一致性的基石。

九、新手常见误区

误区正确做法
把 Admin API 暴露公网仅内网 + 网络策略 + Key 轮换
etcd 单节点生产用 3/5 节点集群,避免配置丢失
插件堆砌拖慢转发按需启用,用 prometheus 指标评估开销

很多团队初期把 APISIX 当成”高级 Nginx”直接用,却忽略了它的配置中心角色。一旦 etcd 数据损坏或单点故障,新配置无法下发,虽然已加载的路由仍能转发,但失去动态能力。因此 etcd 的备份与监控和网关本身同等重要。

十、小结

APISIX 用”etcd 配置中心 + Nginx 数据面 + 插件化能力”的组合,把流量治理变得动态且可声明。落地建议:先用 Docker Compose 在测试环境跑通路由与插件,再用声明式配置接入 CI,最后在生产以多节点 + etcd 集群形态上线。循序渐进,你就能把 APISIX 真正变成团队的流量中枢,统一收口所有微服务的南北向流量。

如果你的团队已经在用 Kubernetes,直接上 APISIX Ingress Controller 会省力很多;若仍以虚拟机为主,独立部署 + 声明式配置同样能享受动态能力。无论如何,把 etcd 当”一等公民”来运维,是 APISIX 稳定运行的底线。

上一篇 Nomad 实战:用轻量级调度器统一编排容器与批处理任务
下一篇 Kafka 实战:消息队列核心原理与 Spring Boot 集成
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]