Apache APISIX Admin API 实战:把新服务接进云原生网关的完整路径
【免费下载链接】apisixThe Cloud-Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/ap/apisix
Apache APISIX 是一款云原生 API 网关,负责路由转发、负载均衡、限流、认证与 SSL 终结;它的 Admin API 就是网关的管理接口,改一条路由不用重启网关。读完本文,你能独立用 curl 完成一条新服务从"建路由"到"上线可用"的全部操作,并知道出问题时往哪里查。
用一个需求把概念串起来:上线新服务,网关侧要动什么
假设你刚部署了一个 user-center 微服务,需要让api.example.com上/user/*的请求打到它的两台实例上。这件事拆开看只有三步:定义"什么样的请求算你的"(匹配条件)、定义"转给谁"(upstream 节点)、可选地"加上限流或认证"(插件)。
APISIX 分两面:数据面是转发流量的引擎,默认监听9080;控制面是 Admin API,监听9180,它本身不转发任何请求,只负责把配置写进 etcd,再由数据面各节点拉取生效。所以 Admin API 的定位相当于"网关的配置后台"——你操作的对象是配置,不是流量本身。
跑通第一条路由的最小配置
最小可用的前提是三个事实:网关在 9080 接流量;Admin API 在 9180 接管理请求;请求头里带上X-API-KEY。仓库默认的 admin key 是edd1c9f034335f136f87ad84b625c8f1(role 为 admin),开发环境直接能用,生产环境必须换掉。
一条路由的最小骨架只有两个部分:匹配条件(uri)和转发目标(upstream里至少一个节点)。把下面这段发出去,再请求 9080 端口,就应该能拿到后端响应了:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT \ -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \ -d '{ "uri": "/hello", "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:9000": 1 } } }'⚡ 注意两点:PUT是幂等的,重复执行等于更新而不是报错;创建成功后配置经 etcd 秒级同步到数据面,全程不用重启网关——这是它和"改 Nginx 配置文件再 reload"思路最大的区别。
把流量精准导到后端:按条件挑出你的请求
匹配条件的组合逻辑是"与":host、methods、vars等条件写了几条,就要全部满足才命中这条路由。想按域名和 API 版本分流,可以这样:
{ "host": "api.example.com", "methods": ["GET", "POST"], "vars": [["http_x_api_version", "==", "v2"]], "upstream": { "nodes": { "user-center-1:8080": 1 } } }这里vars的每一项都是"变量、运算符、期望值"三元组,等价于 Nginx 里写if ($http_x_api_version = "v2"),但更灵活。同一优先级下如果多条路由都能命中,APISIX 会按创建顺序取先定义的那条;需要精确控制时,用priority字段调大数值即可让它优先。
让坏节点自动下马:给上游配健康检查
upstream 不只是一个节点列表,它还承载两件事:负载均衡算法和健康检查。内置算法主要有四种:
| 算法 | 适用场景 |
|---|---|
| roundrobin(默认) | 各节点规格一致 |
| least_conn | 请求处理时间差异大 |
| chash | 需要会话粘性(同一请求特征落同一节点) |
| ewma | 按节点历史响应速度择优 |
节点权重写在 key 的端口后面,"10.0.0.2:8080": 5表示这台机器分到 5 份流量,不是"5 台机器"。
如果不想手动摘除故障节点,就给 upstream 加上checks,让 APISIX 网关自动做主动健康检查:
"checks": { "active": { "http_path": "/health", "healthy": { "interval": 10, "successes": 2 }, "unhealthy": { "interval": 10, "http_failures": 3 } } }语义很直白:每 10 秒探一次/health,连续 2 次成功判为健康并加回,连续 3 次失败判为不健康并摘除,期间流量自动落到其他节点。不配checks时网关不会主动探活,节点挂了你得自己发现——生产环境建议默认就配上。
按调用方限流和认证:把 Consumer 用起来
route 上挂的插件对所有命中的请求生效,但限流到"某个客户"就得引入 Consumer——它相当于网关里的"用户档案",把身份和专属配置绑在一起。
做法分两步。第一步建 Consumer,在它的plugins里挂key-auth声明身份:
{ "username": "app-a", "plugins": { "key-auth": { "key": "ak-app-a-2026" } } }第二步在 route 上启用key-auth({"key-auth": true}表示开启校验),再挂limit-count:
"plugins": { "key-auth": true, "limit-count": { "count": 100, "time_window": 60, "key_type": "consumer", "rejected_code": 429 } }这里的关键参数是key_type:设为consumer后,每个调用方按自己的 Consumer 独立计数,谁超限只拦谁;若设成var(比如remote_addr),则是按源 IP 计数,所有用户共享同一个池子。认证失败直接返回 401,限流触发返回rejected_code指定的状态码,默认 503,建议显式改成 429 更语义化。
常见报错与排错
- 现象:不带 X-API-KEY 也能改配置。原因:
admin_key_required默认是 false,key 根本不校验。解法:在 config.yaml 里把它设为 true 并重启,生产环境这是硬性要求。 - 现象:请求返回 403。原因:源 IP 不在
allow_admin白名单内(默认只放行 127.0.0.0/24)。解法:把运维机或跳板机的网段加进去,改完重启网关生效。 - 现象:返回 495。原因:开启了
https_admin但 admin key 生成时没带 SSL 参数,网关拒绝用明文 key 写入。解法:按文档要求重新生成带 SSL 的 admin key。 - 现象:路由建成功了,请求却 404 或没走到你的上游。原因:匹配条件是"与"关系,
host、vars、methods任何一条不满足就静默不命中。解法:先用GET /apisix/admin/routes确认路由确实存在,再逐条核对条件,别把"路由不存在"和"路由没命中"混为一谈。 - 现象:limit-count 按调用方计数不生效。原因:限流插件需要能识别"调用方是谁",而身份来自 key-auth 这类认证插件。解法:确认 route 上已启用
key-auth且请求带了合法 key,key_type才是consumer。
生产环境上线前 Checklist
admin_key_required为 true,且 admin key 已更换为自生成值allow_admin只放行运维网段,Admin API 不暴露公网- 启用
https_admin+ mTLS,Admin API 走双向认证 - route 挂上 prometheus 插件,指标接入你的监控大盘
- SSL 证书通过 Admin API 的 ssl 资源统一管理,到期时间有台账
- etcd 至少三节点,并建立定期备份(配置全在 etcd 里,备份 etcd 即备份网关)
- 健康检查已开启,并对"节点被摘除数"配了告警
下一步建议:先把上面的最小路由在你自己的测试环境里跑一遍,用 curl 把增、查、改、删走完整,再对着 Checklist 逐项补齐安全项。等流程顺了,再谈灰度和多机房部署,会省心很多。
【免费下载链接】apisixThe Cloud-Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/ap/apisix
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考