搜 索

APISIX 从入门到放弃

  • 3阅读
  • 2025年11月22日
  • 0评论
首页 / 编程 / 正文

一、APISIX 是个什么东西?

1.1 一句话介绍

APISIX 是 Apache 基金会顶级项目,基于 OpenResty(Nginx + LuaJIT) 构建的云原生 API 网关,专注于高性能、全动态、可扩展。

1.2 它的身世

timeline title APISIX 发展史 2019-06 : 支流科技开源 APISIX : 温铭 & 王院生创建 2019-10 : 捐赠 Apache 孵化器 2020 : 国内技术圈开始关注 : 各大技术大会露脸 2021-07 : 毕业成为 Apache TLP : 真正被大众熟知 2022 : 腾讯/爱奇艺/NASA 等采用 : API7.ai 完成融资 2023-至今 : 云原生 API 网关第二极 : 全球社区快速增长

是的你没看错,NASA 也在用。不知道是不是拿来管理火星探测器的 API(大概不是)。

1.3 核心架构

先来看看 APISIX 的整体架构,理解这张图是理解后面所有内容的基础:

graph TB subgraph Client["🌐 客户端"] APP["Mobile App"] WEB["Web Browser"] SVC["Microservice"] end subgraph APISIX["🚀 APISIX 数据面"] direction TB ROUTER["路由匹配
radixtree 算法"] PLUGIN["插件链执行"] LB["负载均衡"] HEALTH["健康检查"] ROUTER --> PLUGIN PLUGIN --> LB LB --> HEALTH end subgraph Control["⚙️ 控制面"] ETCD["etcd 集群
配置中心"] ADMIN["Admin API"] DASHBOARD["Dashboard"] ADMIN --> ETCD DASHBOARD --> ADMIN end subgraph Upstream["🎯 上游服务"] US1["Service A"] US2["Service B"] US3["Service C"] end APP --> APISIX WEB --> APISIX SVC --> APISIX ETCD -.->|Watch 机制
毫秒级同步| APISIX HEALTH --> US1 HEALTH --> US2 HEALTH --> US3 style APISIX fill:#e8f4f8,stroke:#2196F3,stroke-width:2px style Control fill:#fff3e0,stroke:#FF9800,stroke-width:2px style Upstream fill:#e8f5e9,stroke:#4CAF50,stroke-width:2px

关键点:

  • 数据面(Data Plane):就是 APISIX 本体,负责处理所有流量,基于 OpenResty
  • 控制面(Control Plane):etcd 存储所有配置,通过 Watch 机制实时推送变更
  • 没有传统数据库:不需要 PostgreSQL,不需要 Cassandra,只要 etcd

这个架构设计是 APISIX 和 Kong 最本质的区别,后面会详细说。


二、入门:快速上手

2.1 安装(Docker 一把梭)

最快的入门方式,没有之一:

# 克隆 APISIX Docker 仓库
git clone https://github.com/apache/apisix-docker.git
cd apisix-docker/example

# 一键启动
docker-compose -p docker-apisix up -d

启动后你会得到:

组件地址说明
APISIX Gatewayhttp://localhost:9080数据面,处理流量
Admin APIhttp://localhost:9180管理接口
etcdhttp://localhost:2379配置存储
APISIX Dashboardhttp://localhost:9000Web 管理界面

2.2 第一个路由

让我们创建一个最简单的路由,把 /hello 的请求代理到 httpbin.org:

curl -i http://127.0.0.1:9180/apisix/admin/routes/1 \
  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \
  -X PUT -d '{
    "uri": "/hello",
    "upstream": {
        "type": "roundrobin",
        "nodes": {
            "httpbin.org:80": 1
        }
    }
}'

测试一下:

curl -i http://127.0.0.1:9080/hello

如果你看到了 httpbin 的响应,恭喜你,你已经完成了"入门"部分。

用时:5 分钟。

接下来开始漫长的"放弃之路"。

2.3 核心概念速览

在继续之前,先理清 APISIX 的几个核心概念,它们的关系如下:

erDiagram Route ||--o| Service : "可以绑定" Route ||--o| Upstream : "直接指定或通过 Service" Route ||--o{ Plugin : "挂载" Service ||--o| Upstream : "绑定" Service ||--o{ Plugin : "挂载" Consumer ||--o{ Plugin : "绑定认证插件" Consumer ||--o| ConsumerGroup : "属于" ConsumerGroup ||--o{ Plugin : "共享插件配置" Upstream ||--|{ Node : "包含多个节点" GlobalRule ||--o{ Plugin : "全局生效" Route { string uri string method string host int priority } Service { string name string desc } Upstream { string type string hash_on object checks } Plugin { string name object config } Consumer { string username object plugins } ConsumerGroup { string id object plugins } GlobalRule { string id object plugins } Node { string host int port int weight }

简单翻译一下:

  • Route(路由):流量入口的规则定义,告诉 APISIX "什么样的请求应该去哪里"
  • Upstream(上游):后端服务的地址和负载均衡配置
  • Service(服务):Route 和 Upstream 之间的抽象层,方便复用
  • Plugin(插件):在请求生命周期中执行的逻辑,可以挂在 Route、Service、Consumer 上
  • Consumer(消费者):API 的调用方身份,通常配合认证插件使用
  • Global Rule(全局规则):对所有路由生效的插件配置

三、进阶:APISIX 的核心能力

3.1 插件系统

APISIX 的灵魂就是它的插件系统。目前内置了 80+ 插件,覆盖以下几大类:

mindmap root((APISIX 插件生态)) 认证鉴权 key-auth jwt-auth basic-auth openid-connect hmac-auth casbin ldap-auth 流量控制 limit-req limit-count limit-conn traffic-split api-breaker request-validation 可观测性 prometheus zipkin skywalking opentelemetry datadog elasticsearch-logger kafka-logger 协议转换 grpc-transcode grpc-web dubbo-proxy mqtt-proxy Serverless serverless-pre-function serverless-post-function azure-functions aws-lambda openfunction 安全防护 cors uri-blocker ip-restriction ua-restriction csrf referer-restriction

3.2 插件执行顺序

这是很多人踩坑的地方。APISIX 的插件不是"先配先执行",而是有严格的执行顺序:

sequenceDiagram participant C as 客户端 participant A as APISIX participant U as 上游服务 C->>A: HTTP Request Note over A: Phase 1: rewrite Note over A: 🔑 认证插件 (priority: 2599-2500) Note over A: key-auth / jwt-auth / basic-auth Note over A: Phase 2: access Note over A: 🚦 流量控制 (priority: 1003-901) Note over A: limit-count / limit-req / ip-restriction Note over A: Phase 3: before_proxy Note over A: 🔄 协议转换 / 请求改写 Note over A: proxy-rewrite / grpc-transcode A->>U: Proxy Request U->>A: Response Note over A: Phase 4: header_filter Note over A: 📝 响应头修改 Note over A: response-rewrite Note over A: Phase 5: body_filter Note over A: 📝 响应体修改 Note over A: Phase 6: log Note over A: 📊 日志/监控 Note over A: prometheus / kafka-logger A->>C: HTTP Response

关键知识点:每个插件都有一个 priority 值,数字越大越先执行。你可以在 conf/config-default.yaml 里找到完整的优先级列表。

3.3 多语言插件开发

APISIX 不仅支持 Lua 插件,还支持多种语言:

graph LR subgraph APISIX["APISIX Core (Lua)"] direction TB CORE["核心引擎"] RPC["Plugin Runner RPC"] end subgraph Runners["多语言 Plugin Runner"] JAVA["☕ Java Runner
apisix-java-plugin-runner"] GO["🔵 Go Runner
apisix-go-plugin-runner"] PYTHON["🐍 Python Runner
apisix-python-plugin-runner"] WASM["🟣 Wasm Plugin
Proxy-Wasm SDK"] end CORE --> RPC RPC <-->|Unix Socket| JAVA RPC <-->|Unix Socket| GO RPC <-->|Unix Socket| PYTHON CORE <-->|内嵌执行| WASM style APISIX fill:#e3f2fd,stroke:#1565C0 style Runners fill:#f3e5f5,stroke:#7B1FA2

坦白说,性能最好的还是原生 Lua 插件。多语言 Runner 会引入额外的进程间通信开销(Unix Socket),在高并发场景下可能成为瓶颈。但如果你团队没人会写 Lua,用 Java/Go 写插件总比不用强。


四、APISIX vs Kong:一场正面对决

这可能是你最关心的部分。来,上硬货。

4.1 架构对比

graph TB subgraph APISIX_ARCH["APISIX 架构"] direction TB A_DP1["APISIX Node 1"] A_DP2["APISIX Node 2"] A_DP3["APISIX Node 3"] A_ETCD["etcd 集群"] A_ETCD -->|Watch 推送
毫秒级| A_DP1 A_ETCD -->|Watch 推送
毫秒级| A_DP2 A_ETCD -->|Watch 推送
毫秒级| A_DP3 end subgraph KONG_ARCH["Kong 架构"] direction TB K_DP1["Kong Node 1"] K_DP2["Kong Node 2"] K_DP3["Kong Node 3"] K_DB["PostgreSQL / Cassandra"] K_DB -->|轮询拉取
秒级延迟| K_DP1 K_DB -->|轮询拉取
秒级延迟| K_DP2 K_DB -->|轮询拉取
秒级延迟| K_DP3 end style APISIX_ARCH fill:#e8f5e9,stroke:#2E7D32,stroke-width:2px style KONG_ARCH fill:#fff3e0,stroke:#E65100,stroke-width:2px style A_ETCD fill:#a5d6a7,stroke:#2E7D32 style K_DB fill:#ffcc80,stroke:#E65100

这张图说明了一切。APISIX 用 etcd 的 Watch 机制,配置变更毫秒级生效;Kong 传统模式依赖数据库轮询,存在秒级延迟

4.2 全面对比表

对比维度APISIXKong
首次开源2019 年2015 年
技术底座OpenRestyOpenResty
配置中心etcdPostgreSQL / Cassandra
配置同步Watch 推送(毫秒级)轮询拉取(秒级)
路由算法radixtree(IP-based + URI)遍历匹配
热更新全动态,不需要 reload部分需要 reload
插件数量80+ 全开源社区版约 40+,企业版 100+
多语言插件Lua / Java / Go / Python / WasmLua / Go(PDK)
Dashboard开源免费企业版功能
开源协议Apache 2.0(无功能限制)Apache 2.0(企业功能收费)
K8s 集成Ingress Controller(免费)Ingress Controller(免费)
社区规模⭐ 增长快但相对较小⭐ 更大更成熟
企业支持API7.aiKong Inc.
生产案例腾讯、爱奇艺、NASA 等Nasdaq、Honeywell、Samsung 等

4.3 性能对比

根据多个第三方 benchmark 数据(注意:任何 benchmark 都有其局限性):

xychart-beta title "QPS 对比(越高越好)" x-axis ["1 路由", "10 路由", "100 路由", "1000 路由"] y-axis "QPS (万)" 0 --> 3 bar [2.8, 2.7, 2.5, 2.3] bar [2.3, 2.0, 1.5, 0.9]
⚠️ 以上数据仅为趋势示意,实际数值取决于硬件环境、测试方法和具体配置。APISIX 在路由数量增加时性能衰减更小,这主要归功于 radixtree 的 O(k) 匹配复杂度(k 为 URI 长度),而 Kong 的遍历匹配接近 O(n)。

4.4 选型决策树

flowchart TD START["我需要一个 API 网关"] --> Q1{"团队技术栈?"} Q1 -->|"OpenResty / Lua 熟悉"| Q2{"需要全开源?"} Q1 -->|"纯 Java / Go 团队"| Q3{"预算充足?"} Q1 -->|"都不熟悉"| Q4{"运维复杂度敏感?"} Q2 -->|"是,不想被 vendor lock-in"| APISIX["✅ 选 APISIX"] Q2 -->|"企业版功能可以付费"| Q5{"社区生态重要?"} Q3 -->|"有预算"| KONG_ENT["✅ 选 Kong Enterprise"] Q3 -->|"预算有限"| APISIX Q4 -->|"希望运维简单"| APISIX Q4 -->|"可以接受复杂度"| Q5 Q5 -->|"需要大量第三方集成"| KONG["✅ 选 Kong OSS"] Q5 -->|"自研为主"| APISIX style APISIX fill:#c8e6c9,stroke:#2E7D32 style KONG fill:#ffe0b2,stroke:#E65100 style KONG_ENT fill:#ffcc80,stroke:#E65100

五、生产实践:踩坑记录

5.1 etcd:成也萧何,败也萧何

APISIX 选择 etcd 作为配置中心是一把双刃剑。

好处:轻量、快速、Watch 机制完美。

:etcd 本身的运维不是省油的灯。以下是常见问题:

  • etcd 磁盘空间暴涨:etcd 默认的 compaction 策略可能导致历史版本堆积。必须配置自动压缩:

    # etcd 配置
    auto-compaction-mode: periodic
    auto-compaction-retention: "1h"
  • etcd 集群脑裂:3 节点挂了 2 个?APISIX 直接不可用。建议生产环境至少 3 节点,有条件上 5 节点
  • etcd 版本兼容性:APISIX 对 etcd 版本有要求,升级前务必查看兼容性矩阵

5.2 自定义插件的坑

如果你打算写自定义 Lua 插件,以下是血泪教训:

-- ❌ 错误示范:在热路径中创建 table
function _M.access(conf, ctx)
    local data = {}  -- 每次请求都创建新 table,GC 压力山大
    for i = 1, 100 do
        data[i] = i
    end
end

-- ✅ 正确做法:使用 table pool
local tab_new = require("table.new")
local tab_clear = require("table.clear")

local _M = {}
local data = tab_new(100, 0)  -- 预分配,复用

function _M.access(conf, ctx)
    tab_clear(data)
    for i = 1, 100 do
        data[i] = i
    end
end

5.3 监控三件套

生产环境必须配好的监控组合:

graph LR APISIX["APISIX"] -->|"/apisix/prometheus/metrics"| PROM["Prometheus"] PROM --> GRAFANA["Grafana Dashboard"] APISIX -->|"error.log"| FILEBEAT["Filebeat"] FILEBEAT --> ES["Elasticsearch"] ES --> KIBANA["Kibana"] APISIX -->|"zipkin plugin"| JAEGER["Jaeger / Zipkin"] style APISIX fill:#e3f2fd,stroke:#1565C0 style PROM fill:#fff3e0,stroke:#FF9800 style GRAFANA fill:#fff3e0,stroke:#FF9800 style ES fill:#f3e5f5,stroke:#7B1FA2 style KIBANA fill:#f3e5f5,stroke:#7B1FA2 style JAEGER fill:#e8f5e9,stroke:#4CAF50

重点关注的指标:

  • apisix_http_status:按状态码统计请求量,5xx 突增要报警
  • apisix_http_latency:请求延迟分布,P99 是关键
  • apisix_bandwidth:带宽使用,防止被打满
  • apisix_upstream_status:上游健康状态,及时发现后端故障

六、APISIX 在支付系统中的应用思考

作为一个天天和支付系统打交道的人,聊聊 APISIX 在金融/支付场景下的适用性。

graph TB subgraph Gateway["APISIX API Gateway"] AUTH["🔐 mTLS + JWT 双重认证"] RATE["🚦 精细化限流
按商户/渠道/接口"] ENCRYPT["🔒 请求加解密插件"] AUDIT["📋 审计日志
kafka-logger"] CIRCUIT["⚡ 熔断降级
api-breaker"] end subgraph Services["支付服务集群"] NPSS["NPSS
Aani 即时支付"] CARD["Cards Service"] ESCROW["Escrow Service"] RTP["RTP Service"] end CLIENT["商户/合作方"] --> Gateway Gateway --> Services style Gateway fill:#fce4ec,stroke:#c62828,stroke-width:2px style Services fill:#e8f5e9,stroke:#2E7D32

优势

  • 全开源无 vendor lock-in:金融系统对自主可控要求高,APISIX 的 Apache 2.0 协议没有功能阉割
  • 毫秒级配置生效:支付系统路由变更(比如灰度切流、紧急熔断)需要快速生效
  • 精细化限流:可以按商户 ID、渠道、接口维度做独立限流,用 limit-count 插件的 group 功能实现
  • 审计友好:kafka-logger 可以把所有请求/响应记录到 Kafka,满足金融审计要求

顾虑

  • etcd 的高可用保障需要额外投入
  • Lua 插件的开发和调试体验不如 Java/Go,金融团队通常以 Java 为主
  • 缺少开箱即用的 API 版本管理和 Developer Portal(Kong Enterprise 在这方面更成熟)

七、写在最后:到底要不要放弃?

来做个总结。

不要放弃 APISIX 的理由

  1. 性能真的很强,路由匹配效率在同类产品中数一数二
  2. 全动态配置体验丝滑,不用半夜起来 reload Nginx
  3. 完全开源不割韭菜,所有功能一视同仁
  4. 云原生友好,K8s 部署体验好
  5. 中文社区活跃,遇到问题有人答

可以考虑放弃 APISIX 的理由

  1. 你团队完全不想碰 Lua,也不打算学
  2. 你需要开箱即用的 Developer Portal 和 API Marketplace
  3. 你已经深度绑定了 Kong 生态
  4. 你的场景对网关性能没那么敏感,稳定和生态更重要
  5. 你觉得运维 etcd 集群是一种折磨
pie title "放弃 APISIX 的常见原因" "Lua 学习曲线" : 30 "etcd 运维复杂" : 25 "企业功能不如 Kong Enterprise" : 20 "社区/文档不够丰富" : 15 "其他" : 10

我的建议:如果你是从零开始选型,且团队对新技术接受度高,APISIX 是目前性价比最高的选择。如果你已经在用 Kong 且用得挺好,那就没必要为了追新而迁移。

毕竟,最好的技术选型不是选"最好的",而是选"最适合的"。


📌 参考资料

评论区
暂无评论
avatar