APISIX 工作原理
本文介绍 APISIX 的主要组件如何协同处理请求,包括配置存储、路由器、插件引擎、请求生命周期和热更新模型。
文末的相关资源可帮助你进一步了解各主题。
概览
APISIX 是一个运行在 OpenResty 中的 Lua 应用。OpenResty 通过 lua-nginx-module 扩展 NGINX。NGINX 负责连接处理、工作进程模型和请求阶段机制;APISIX 通过挂载到各个阶段的 Lua 程序完成路由、插件执行和上游选择。
本页从请求流角度说明 APISIX。所有由 APISIX 处理的请求都会经过三个运行时组件:
- 提供路由和插件定义的配置存储。
- 将 请求匹配到路由的路由器。
- 在对应 NGINX 阶段运行匹配路由插件的插件引擎。
以下各节先介绍这些组件,再跟踪一个请求如何依次经过它们。负载均衡、服务发现和 Admin API 等其他组件会在请求流中的相关位置提及,并在各自页面中详细介绍。
下图展示默认传统部署模式中的请求流和配置流,其中 etcd 是配置来源。路由器、插件引擎、负载均衡器和内存配置均位于 APISIX 工作进程内:
独立部署模式保留相同的请求路径,但配置来源不同:磁盘上的 apisix.yaml(或 apisix.json)是配置来源,文件更改时各工作进程会重新加载配置:
配置存储
在默认部署模式中,APISIX 使用 etcd 作为路由、上游、服务、消费者、SSL 证书、插件配置和全局规则的事实来源。每个 NGINX 工作进程通过长轮询订阅 etcd,并在内存中保存一份配置副本。
通过 Admin API 创建或更新资源时,更改会写入 etcd。工作进程通过 watch 机制观察更改,并独立重建内存中的路由结构,不需要重新加载、重启或跨工作进程协调。配置更改会应用到运行中的工作进程,不会中断现有连接。
APISIX 支持两种采用不同配置来源的部署模式:
- 传统模式(默认):etcd 是配置的事实来源,每个工作进程都会 watch etcd,即上图所示模式。
- 独立部署模式:每个工作进程完全在内存中保存配 置。配置从磁盘上的
apisix.yaml(或apisix.json)加载,并在文件更改时重新加载,不使用 etcd。
本页其余部分介绍的请求处理行为在所有模式中相同,区别仅在于配置来源。有关支持的完整模式列表和配置方式,请参阅部署模式。
路由器
路由器将传入请求匹配到路由。APISIX 使用 Radix Tree(压缩前缀树)作为匹配引擎。
配置路由时,路由会被插入树中。处理请求时,URI 的匹配时间与 URI 长度相关,而不是与已配置的路由数量相关。因此,即使路由数量增加,匹配开销也大致保持不变。
APISIX 内置三种 HTTP 路由器,它们使用不同的字段作为树的主索引:
radixtree_host_uri(默认):使用host + uri作为主索引,同时匹配请求 Host 和 URI。radixtree_uri:仅使用uri作为主索引,Host 不属于索引。radixtree_uri_with_parameter:与radixtree_uri相同,同时支持/user/:id之类的路径参数。
当前使用的 HTTP 路由器通过 config.yaml 中的 apisix.router.http 配置选择。TLS 握手期间的 SSL 证书选择使用独立的 radixtree_sni 路由器,将客户端 SNI 与已配置的证书匹配。有关 HTTP 路由器的配置和功能对比,请参阅路由选项。