文章目录
引言:APISIX 概述
APISIX(Apache APISIX)是一个高性能、可扩展的云原生 API 网关,基于 Nginx 和 etcd 构建。
作为微服务架构的流量入口,它提供了动态路由、负载均衡、服务发现、认证授权、可观测性等核心能力。
其设计遵循"云原生"和"可扩展"理念,支持热加载、动态配置和插件化架构,已成为 Apache 顶级项目,被广泛应用于金融、电商、互联网等领域的关键业务场景。
Apisix 基于 Nginx 和 etcd 构建,主要有以下原因:
基于Nginx构建的原因
- 高性能:Nginx 是一款基于 C 语言开发的高性能服务器软件,其底层开发经过了深度优化,在处理高并发连接时表现出色,能够同时处理超过十万个并发连接的请求,性能达到极致,并且在大规模应用中得到了充分有效的验证。Apisix 基于 Nginx 的网络层,可以利用 Nginx 的高性能优势,轻松应对高流量的 API 请求。
- 事件驱动模型:Nginx 采用事件驱动的异步非阻塞模型,这种模型使得 Nginx 在处理大量并发请求时,能够避免线程切换带来的开销,提高资源利用率和响应速度。Apisix 基于 Nginx 内核的事件驱动模型,单进程即可支持 10 万+并发连接,能够高效地处理各种 API 流量。
- 可扩展性:通过 Lua 和 LuaJIT 技术,Apisix 可以在 Nginx 的基础上进行灵活扩展。Lua 语言具有简洁高效、易于学习和扩展的特点,开发人员可以方便地编写 Lua 脚本,实现各种自定义的功能,如流量控制、日志记录、安全检测、故障注入等插件,同时支持用户编写自定义插件来对数据面进行扩充。
基于etcd构建的原因
- 分布式配置管理:etcd 是一个高可用的分布式键值(key - value)存储系统,内部采用 raft 协议作为一致性算法,能够保证数据在分布式环境下的一致性和可靠性。Apisix 利用 etcd 来存储和同步网关的配置数据,管理员通过 admin API 或者 dashboard 对配置进行修改后,etcd 可以在毫秒级别内将配置变更通知到所有的数据面节点,确保整个集群的配置能够及时、一致地更新。
- 服务发现与注册:由于 Apisix 使用 etcd 作为配置中心,在与其他组件配合时非常方便,可以直接将 etcd 当作服务注册发现中心来使用,支持服务的注册和发现功能。当然,Apisix 同时也支持 Consul、Eureka、Nacos 等其他服务注册中心,以满足不同用户的需求。
- 配置灵活性与动态性:etcd 的 watch 机制允许客户端监控特定 key 的变化。在 Apisix 中,通过 etcd 的 watch 功能,各个节点可以实时感知配置的变化,并及时更新自身的配置,实现动态路由、动态插件配置等功能,无需手动重启或重新加载配置,大大提高了网关的灵活性和可管理性。
架构图示
架构分层解析
管理层:人机交互与配置入口
-
Dashboard(可视化界面)
- 提供图形化操作面板,支持路由、服务、插件的可视化配置
- 集成监控看板,展示流量指标、错误率、插件运行状态等数据
- 支持多租户权限管理和操作审计
-
Admin API(管理接口)
- 基于RESTful设计的API接口,支持配置的增删改查
- 具备灰度发布能力,可按版本、权重控制配置发布范围
- 支持Webhook回调,可与CI/CD流程集成实现自动化部署
控制层:配置管理与集群协调
- etcd集群(分布式配置中心)
- 采用Raft共识算法保证配置强一致性,支持多节点高可用
- 存储三类核心数据:
- 路由规则(URI匹配规则、负载均衡策略)
- 插件配置(限流策略、认证方式、日志格式)
- 服务节点信息(上游服务IP:Port、健康检查状态)
- 通过Watch机制实现配置变更的毫秒级推送,无需重启节点
数据面:请求处理与流量转发
-
APISIX Core(请求处理引擎)
- 基于OpenResty构建,采用多worker进程模型(每个worker独立处理请求)
- 核心流程:
- 接收客户端请求并解析URI
- 根据etcd配置执行路由匹配
- 按顺序调用插件链处理请求
- 转发请求到上游服务并处理响应
- 性能优势:单节点可支撑10万+并发连接,CPU多核利用率达90%以上
-
Plugin System(插件系统)
- 模块化设计,100+官方插件覆盖三大场景:
- 流量治理(限流、熔断、重试、负载均衡)
- 安全防护(JWT认证、IP黑白名单、SQL注入防护)
- 可观测性(Prometheus监控、Skywalking追踪、Access Log记录)
- 支持自定义插件开发,通过Lua脚本扩展功能,无需修改核心代码
- 模块化设计,100+官方插件覆盖三大场景:
说明:关于OpenRestry
(1)基于 Nginx 的事件驱动模型
- 多进程架构:
- Master-Worker 模型:
- Master 进程:负责读取配置、管理 Worker 进程(如启动、重启、优雅退出)。
- Worker 进程:处理实际请求,多个 Worker 进程通过共享内存实现数据交换。
- 异步非阻塞 I/O:
- 每个 Worker 进程采用 epoll/kqueue 等事件驱动机制,单进程可处理数万并发连接。
- 请求处理过程中不阻塞线程,而是通过回调函数处理响应。
- Master-Worker 模型:
(2)请求处理阶段:
Nginx 将请求处理分为多个阶段(Phase),OpenResty 可在这些阶段中插入 Lua 代码:
- post-read:读取请求头后
- server-rewrite:服务器级别重写
- find-config:查找匹配的 location
- rewrite:location 级别重写
- access:访问控制(如权限验证)
- content:内容生成(核心处理阶段)
- log:日志记录
(3)LuaJIT 与 Nginx 的深度集成
-
LuaJIT 引擎:
- 即时编译(JIT):将 Lua 代码编译为机器码,性能接近 C 语言。
- 协程支持:Lua 协程(coroutine)实现轻量级线程,避免阻塞 Worker 进程。
-
ngx_lua 模块:
OpenResty 通过 ngx_lua 模块将 Lua 环境嵌入 Nginx,提供以下核心功能:- 请求上下文:通过
ngx
全局对象访问请求信息(如ngx.var
、ngx.req
)。 - 非阻塞 I/O:支持异步访问数据库、缓存(如 Redis、MySQL)。
- 共享内存:通过
ngx.shared.DICT
实现 Worker 间数据共享。 - 定时器:支持异步定时任务(如
ngx.timer.at
)。
- 请求上下文:通过