Admin API 与 control API
前面都在讲"网关怎么用配置",今天讲"配置怎么进去"——Admin API 是配置管理入口(增删改路由/上游/插件),control API 是运维接口(看健康状态、触发操作)。这是运维 APISIX 的日常。
两套管理接口
etcdctl put 一串 JSON 吧——写错格式、漏了必填字段,坏配置直接污染全站。- Admin API(
apisix/admin/):管配置——PUT/GET/DELETE /apisix/admin/routes/{id}等。写入 etcd(然后 watch 生效)。 - control API(
apisix/control/):管运行时——查健康检查状态、schema、触发 GC 等。只读/运维,不改配置。
http_init_worker 里 admin.init 和 control_api_router.init_worker——两套接口各自初始化。Admin 目录
apisix/admin/
init.lua 入口 + 鉴权 + 路由分发
resource.lua ★ 通用 CRUD 逻辑(各资源共用)
routes.lua services.lua upstreams.lua consumers.lua
plugin_configs.lua global_rules.lua ssl.lua ... 各资源
schema.lua 暴露 schema 查询
standalone.lua standalone 模式的 admin
v3_adapter.lua API 版本适配
resource.lua 的通用 CRUD——只提供自己的 schema 和特殊逻辑。这和上一站 Higress Console 的 controller 一一对应(都是每种资源一个 CRUD 端点)。resource 通用 CRUD
admin/resource.lua 抽象了所有资源共同的 CRUD 流程:GET(查)、PUT(建/改)、DELETE(删)、PATCH(部分改)。各资源文件只传入自己的"名字 + schema + 校验钩子"。
resource.lua 通用骨架,routes.lua 只填"我是 routes、我的 schema 是 route、我有这些额外校验"。加一种资源类型 = 加个薄文件传参给 resource。又是"通用核心 + 具体参数"——和 balancer/discovery 的可插拔一个思路。写入即校验
Admin API 写 etcd 前用对应 schema 校验(Day 09)——回收 Day 09 的"校验在写入端"。不合法返回 400 + 具体错误,坏配置进不了 etcd。
# 示例:建一条路由
curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: $admin_key" \
-d '{"uri":"/hello","upstream":{"nodes":{"127.0.0.1:8080":1},"type":"roundrobin"}}'
# → 校验通过 → 写 /apisix/routes/1 到 etcd → watch 秒级生效(Day 07)
👶 小白:Admin API 这么强(能改全站配置),随便谁都能调岂不是很危险?
👨🏫 老师:所以它有两道锁:① X-API-KEY 鉴权(admin/init.lua 校验,key 不对直接拒);② 通常单独监听 9180 端口、只开放给内网/运维。control API 同理走另一个端口、只读为主。管理面和数据面(9080 处理业务)从端口就隔开——这是网关安全的基本功。
X-API-KEY 是 Admin API 的鉴权(admin/init.lua 里校验)——管理接口必须保护好。standalone admin
admin/standalone.lua:standalone(config_yaml,Day 07)模式下的 Admin——配置不写 etcd 而是操作 apisix.yaml/内存。
control API
apisix/control/ + init.lua:1058 的 http_control。提供运维接口,例如:
GET /v1/healthcheck:查各上游节点的健康检查状态。GET /v1/schema:查所有资源/插件的 schema。GET /v1/routes:查当前内存里的路由(调试)。POST /v1/gc:触发 Lua GC 等。
/v1/healthcheck 看是不是被健康检查剔除了(Day 10)。它通常在单独端口、只允许内网访问。插件也能注册自己的 control 接口(如 prometheus 的 /apisix/prometheus/metrics)。curl http://127.0.0.1:9090/v1/healthcheck → 返回 [{"name":"upstream#/routes/1","nodes":[{"ip":"10.0.0.7","status":"unhealthy",...}]}]。一眼看出
10.0.0.7 被健康检查(Day 10)判成不健康、已剔除——不是配置问题,是那台后端自己挂了。control API 就是这种"看运行时真相"的窗口。Dashboard 与生态
Admin API 之上有 APISIX Dashboard(独立项目,本机 apisix-dashboard/)——一个 Web 界面,调 Admin API 让你点点点管配置(类似上一站的 Higress Console)。
今日小结 + 动手
🧠 今天你应该能回答
- Admin API 和 control API 的分工?
- resource.lua 怎么用"通用 CRUD"减少重复?
- 一条 PUT /routes 请求怎么走完"全动态"闭环?
- control API 能查什么?Dashboard 和 Admin API 的关系?
✋ 动手
cd /Users/bitmart/work/codes/github/apisix
ls apisix/admin/ apisix/control/
grep -n "function\|resource" apisix/admin/routes.lua | head
sed -n '1058,1066p' apisix/init.lua
stream_preread_phase 怎么处理 L4 流量、和 HTTP 子系统的异同。