终端里管理 APISIX:Admin API 从入门到生产的实操指南
【免费下载链接】apisixThe Cloud-Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/ap/apisix
如果你刚接手一套基于 Apache APISIX 的 API 网关,最先碰到的需求往往是这样的:业务方要改一条路由的转发目标,或者给某个接口临时加个限流。而 Apache APISIX Admin API 就是干这个的——它把网关的路由、上游、插件、证书等全部配置都开放成了 REST 接口,改完即生效,不用重启网关进程。下面这篇内容不讲大而全的字段字典,而是按"一个项目从启动到上线"的顺序,把你每天真正会敲的那几条命令讲透。
启动前的三件事:密钥、白名单、端口
Admin API 默认跑在9180 端口,路径前缀是/apisix/admin。在第一次调用之前,conf/config.yaml里有三处配置值得确认(对应 官方配置说明):
deployment: admin: admin_key: - name: admin key: edd1c9f034335f136f87ad84b625c8f1 role: admin # admin 可读写;还有只读的 viewer allow_admin: - 127.0.0.0/24 # 来源 IP 白名单 admin_listen: ip: 0.0.0.0 port: 9180用白话说就是三句话:
admin_key是你的"门禁卡",每次请求都要带;allow_admin限制哪些来源 IP 能调这个接口,不配等于全网放开,生产上一定要收敛;admin_listen决定监听地址,注意别和代理数据面的node_listen(默认 9080/9443)撞端口。
认证方式是 HTTP 头X-API-KEY,直接贴 key 值即可,建议放进环境变量:
export ADMIN_KEY="edd1c9f034335f136f87ad84b625c8f1"第一次调用:跑通"创建—查询—删除"闭环
先验证连通性,列出当前所有路由:
curl http://127.0.0.1:9180/apisix/admin/routes -H "X-API-KEY: $ADMIN_KEY"返回一个 JSON 数组就是通了。接下来创建一条路由,注意用的是PUT:
curl http://127.0.0.1:9180/apisix/admin/routes/1 \ -H "X-API-KEY: $ADMIN_KEY" -X PUT -d '{ "uri": "/api/users/*", "name": "user-api", "upstream": { "type": "roundrobin", "nodes": { "192.168.1.100:8080": 1, "192.168.1.101:8080": 2 } } }'这里有个容易忽略的点:PUT 是幂等的——同样的请求发一遍和发十遍结果一样,ID 是1就始终覆盖1这条路由。这让你的自动化脚本可以放心重试,不会重复建出两条路由。
# 查询单条 curl http://127.0.0.1:9180/apisix/admin/routes/1 -H "X-API-KEY: $ADMIN_KEY" # 删除 curl http://127.0.0.1:9180/apisix/admin/routes/1 -H "X-API-KEY: $ADMIN_KEY" -X DELETE对路由、上游、服务这些资源来说,这套 "PUT 写入 → GET 验证 → DELETE 清理" 的套路是通用的,后面所有操作都在这上面做文章。
一条请求的路径:Route、Service、Upstream、Consumer 各管什么
新人最容易困惑的是这几个资源到底谁干什么。看这张图会更直观:
拆开来看,一次请求的完整动线是这样的:
| 资源 | 职责 | 一句话类比 |
|---|---|---|
| Route | 匹配:uri、host、method、vars 等规则命中请求 | 前台分诊,决定"这单归谁管" |
| Service | 复用:把上游、插件配置从路由里抽出来共享 | 公共模板,多条路由引用同一份配置 |
| Upstream | 转发:负载均衡算法 + 节点权重 + 健康检查 | 外卖骑手调度池 |
| Consumer | 鉴权:key-auth、JWT 等认证插件挂在消费者上 | 客户档案,证明"你是谁" |
如果路由少、结构简单,upstream直接内联在 route 里最省事;等同一批路由共享相同后端和限流策略时,再抽成独立的Service和Upstream资源。比如把公共限流提到 Service 上:
curl http://127.0.0.1:9180/apisix/admin/services/user-svc \ -H "X-API-KEY: $ADMIN_KEY" -X PUT -d '{ "plugins": { "limit-count": { "count": 1000, "time_window": 3600 } } }'消费者侧则是把认证凭据挂到 Consumer 上,比如 key-auth:
curl http://127.0.0.1:9180/apisix/admin/consumers/api-client \ -H "X-API-KEY: $ADMIN_KEY" -X PUT -d '{ "username": "api-client", "plugins": { "key-auth": { "key": "auth-key-123456" } } }'匹配规则这边补充几个常用字段:uris是 uri 列表(单个用uri)、hosts支持泛域名(如*.test.com)、methods限定 HTTP 方法、vars用["变量名", "运算符", "值"]三元组做更细的匹配、priority控制命中优先级。复杂逻辑还可以写filter_func(一段 Lua 函数)做兜底匹配。
上游健康检查怎么写
Upstream 是"APISIX 上游健康检查"配置的主战场。内联写法和独立资源写法一致,独立资源的好处是支持主动探测。一个典型的写法:
curl http://127.0.0.1:9180/apisix/admin/upstreams/backend-svc \ -H "X-API-KEY: $ADMIN_KEY" -X PUT -d '{ "type": "roundrobin", "nodes": { "192.168.1.100:8080": 1, "192.168.1.101:8080": 1 }, "checks": { "active": { "type": "http", "http_path": "/health", "timeout": 5, "healthy": { "interval": 1, "successes": 2 }, "unhealthy": { "interval": 1, "http_failures": 3 } } } }'理解这段配置只需要记住两组参数:healthy决定节点"判活"要连续成功几次,unhealthy决定连续失败几次后摘除,interval是两次探测的间隔,timeout是单次探测超时。type可以是http(按状态码判断)、https或tcp。摘除的节点会在再次判活后自动回到流量池,不需要人工介入。
type字段还可以切换负载均衡算法:roundrobin(默认轮询)、least_conn(最少连接)、chash(一致性哈希,配合hash_on用变量做哈希键)、ewma(按响应耗时加权)。
三个高频插件:限流、JWT、Prometheus
APISIX 的插件配置遵循统一模式:在资源的plugins字段下,插件名对应一段 JSON 配置,同一个插件可以同时挂在路由、服务、消费者、全局规则(global_rules)不同层级上,层层叠加生效。挑三个最常被问到的场景讲。
🔒 按 IP 限流,挡住刷量的客户端
业务问题:某个接口被单机 IP 疯狂重试,想一分钟最多放行 100 次。
{ "plugins": { "limit-count": { "count": 100, "time_window": 60, "key_type": "var", "key": "remote_addr" } } }关键就在key_type: "var"+key: "remote_addr"这一对组合,它决定了计数按哪个维度累加(改成consumer就是按认证用户维度)。验证方法:连续打超过 100 次请求,第 101 次应该返回 429(limit-count默认拒绝码)。
🔐 JWT 鉴权:先签发,再验签
jwt-auth 的玩法是"先在 Consumer 里存 secret,再在路由上开启校验"。先给消费者配签发/验签密钥:
{ "plugins": { "jwt-auth": { "key": "user-key", "secret": "my-secret", "algorithm": "HS256" } } }然后在需要鉴权的路由上加:
{ "plugins": { "jwt-auth": { "secret": "my-secret" } } }之后客户端带着合法签名的Authorization: Bearer <jwt>头访问即可通过,非法 token 直接 401。验证时可以先不带 token 打一次(预期 401),再带正确 token 打一次(预期 200),两步都符合预期才说明配置正确。
📊 Prometheus 监控:让网关指标可观测
在路由上启用 prometheus 插件即可暴露指标:
{ "plugins": { "prometheus": { "prefer_name": true } } }prefer_name为 true 时指标用路由的name而不是 ID 做标签,读起来友好得多。拉一次/apisix/prometheus/metrics,能看到请求数、状态码分布、耗时直方图——接入 Grafana 之后,网关是不是"APISIX 网关动态配置"改坏了,看曲线就知道。
批量与高效查询:让配置管理不靠人肉
配置量上来之后,单条 curl 就难以为继了,v3 版 Admin API(配置里admin_api_version: v3)提供了几件趁手工具:
批量创建:对资源列表地址发 POST,body 直接传数组,一次落地多条:
curl http://127.0.0.1:9180/apisix/admin/routes \ -H "X-API-KEY: $ADMIN_KEY" -X POST -d '[ { "uri": "/api/v1/users", "upstream": { "type": "roundrobin", "nodes": { "user-svc:8080": 1 } } }, { "uri": "/api/v1/products", "upstream": { "type": "roundrobin", "nodes": { "product-svc:8080": 1 } } } ]'分页查询:路由多了之后列表请求会拖慢,page/page_size(每页 10–500 条)按需取:
curl "http://127.0.0.1:9180/apisix/admin/routes?page=2&page_size=20" -H "X-API-KEY: $ADMIN_KEY"返回结构从数组变成了{ "total": ..., "list": [...] },脚本解析时注意一下。
过滤查询:按name、label、uri筛选,多个条件之间取交集。label是资源上自建的键值对(如{"env": "prod"}),非常适合在多环境共用一个 APISIX 实例时圈定范围:
curl 'http://127.0.0.1:9180/apisix/admin/routes?name=test&label=env:prod' \ -H "X-API-KEY: $ADMIN_KEY"Schema 预校验:正式提交前可以先问一句"这份配置合不合法",不写 etcd 就能得到校验结果:
curl http://127.0.0.1:9180/apisix/admin/schema/validate/routes \ -H "X-API-KEY: $ADMIN_KEY" -X POST -d '{ "uri": "/api/*", "upstream": { "type": "roundrobin", "nodes": { "backend:8080": 1 } } }'CI 流水线里把这个调用插在部署步骤前面,能拦下相当一部分低级配置错误。
强制删除:默认情况下 Admin API 会检查资源间的引用关系,被引用的资源删不掉。确认要连带清理时给 DELETE 加force=true,慎用,因为它跳过的是保护机制。
出问题时怎么自查
报错响应体长这样,error_msg是重点,req_body会把你发的原文回显出来,方便定位:
{ "error_msg": "invalid configuration: property \"uri\" is required", "req_body": { "name": "test-route" } }按排查顺序走,基本能覆盖 90% 的问题:
- 401—— key 不对或没带
X-API-KEY头。注意确认你用的是哪一把 key(admin/viewer 两把权限不同),以及请求来源 IP 是否在allow_admin白名单内(白名单不通过时同样会被拒); - 400—— 请求体没通过 schema 校验,
error_msg里会写明具体哪个字段有问题,改完用schema/validate预检再提交; - 404—— 资源 ID 拼错,或者资源类型路径不对(是
/routes不是/route); - 409—— 资源冲突,典型场景是 PUT 写入时发现版本冲突,或 POST 批量创建时 ID 撞了已有资源。
还有一个隐蔽问题:改了不生效。先确认 etcd 是连通的(配置变更都落到 etcd),再确认数据面 worker 有没有收到配置推送,最后才怀疑自己的 JSON 写错——顺序反了会白排查半天。
生产环境上线清单
上线前过一遍下面这份清单,比事后救火便宜得多:
- 安全加固:
admin_key_required: true保持开启;allow_admin收敛到堡垒机/内网网段;admin_listen.ip能绑内网就不要绑0.0.0.0;有外部管理需求时开启https_admin走 mTLS;key 用环境变量或配置中心注入,别写死在 git 里的 yaml 中。 - 监控接入:给
/metrics相关路由挂上 prometheus 插件,把 5xx 比例、P99 耗时接进告警;插件配置本身也纳入配置中心统一管理。 - 自动化部署:配置即代码。把每条路由/上游/消费者存成 JSON 文件,脚本里封装一个幂等的部署函数,PUT 天然支持重试,失败直接重跑:
#!/bin/bash ADMIN_KEY="$ADMIN_KEY"; HOST="127.0.0.1:9180" deploy() { curl -s -H "X-API-KEY: $ADMIN_KEY" -X PUT \ "http://$HOST/apisix/admin/$1/$2" -d @"$3" } deploy routes user-api configs/user-route.json deploy routes product-api configs/product-route.json配合前文讲的label过滤(圈定环境)+schema/validate预检 + 分页批量写入,就是一条完整的发布流水线雏形。
回到开头的场景
现在把视角拉回开篇:业务方说"把 /api/users 的转发目标换掉,再加个限流"。你的操作是——PUT 一条路由(或更新 Service 上的 upstream 节点),顺手在plugins里加上 limit-count,GET 验证一下返回体,完事。全程没有重启,改动秒级生效。这正是 Admin API 存在的意义:把网关从"改配置要发布"的基础设施,变成"curl 一下就能变"的动态资源。
建议的下一步:先用 官方 Admin API 文档 把本文没展开的 SSL、stream_routes、secrets 等资源过一遍,再到 插件列表 里找业务真正需要的插件,按"业务问题 → 配置字段 → 验证生效"的路子一个个落地。网关配置管理做得好不好,不看功能多少,而看你的变更流程是不是全部收敛到了这条 API 通道上。
【免费下载链接】apisixThe Cloud-Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/ap/apisix
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考