我们公司有产品用的是这个组件,之前一直没有接触过,补一下
参考文档:https://apisix.apache.org/zh/docs/
API网关产品横向对比
| 产品 |
底层 |
配置存储 |
特点 |
适合谁 |
| Kong |
OpenResty |
PostgreSQL |
老牌霸主,生态最大,企业版功能强 |
大公司、要商业支持 |
| Traefik |
Go |
文件/Consul/K8s |
云原生、自动发现、配置简单 |
中小团队、快速上手 |
| Spring Cloud Gateway |
Java/Netty |
配置文件 |
Java 生态亲和,和 Spring 无缝 |
Java 微服务项目 |
| Tyk |
Go |
Redis/文件 |
轻量、自带 API 管理面板 |
轻量级需求 |
| APISIX |
OpenResty |
etcd |
性能最强、插件全开源、动态 |
要性能+全功能的团队 |
text1 2 3 4 5 6 7 8 9 10 11 12 13
| APISIX 部署包含 3 个核心组件:
┌─────────────┐ │ etcd │ ← 配置中心(存路由/插件/证书) └──────┬──────┘ │ watch ┌──────▼──────┐ │ APISIX │ ← 数据面(NGINX+Lua,处理实际流量) └──────┬──────┘ │ 转发 ┌──────▼──────┐ │ 后端服务 │ ← 你的微服务 └─────────────┘
|
docker部署与基础概念
1 2 3 4 5 6 7 8 9
| curl -sL https://run.api7.ai/apisix/quickstart | sh ✔ APISIX is ready!
docker ps |grep min d1d11a5c53f9 apache/apisix:3.18.0-ubuntu "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:9080->9080/tcp, [::]:9080->9080/tcp, 0.0.0.0:9091->9091/tcp, [::]:9091->9091/tcp, 0.0.0.0:9100->9100/tcp, [::]:9100->9100/tcp, 0.0.0.0:9180->9180/tcp, [::]:9180->9180/tcp, 0.0.0.0:9443->9443/tcp, [::]:9443->9443/tcp, 0.0.0.0:9443->9443/udp, [::]:9443->9443/udp, 0.0.0.0:9090->9092/tcp, [::]:9090->9092/tcp apisix-quickstart 1099c75a5a3c bitnamilegacy/etcd:3.5.7 "/opt/bitnami/script…" 2 minutes ago Up 2 minutes 2379-2380/tcp etcd-quickstart
curl "http://127.0.0.1:9080" --head | grep Server Server: APISIX/3.18.0
|
基础路由功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| docker run -d --name httpbin -p 8889:80 kennethreitz/httpbin
ss -tunlp | grep 8889 tcp LISTEN 0 4096 0.0.0.0:8889 0.0.0.0:* users:(("docker-proxy",pid=966230,fd=7)) tcp LISTEN 0 4096 [::]:8889 [::]:* users:(("docker-proxy",pid=966236,fd=7))
Upstream(上游)配置 1.type 负载均衡算法 roundrobin(默认) chash ewma least_conn
2.nodes 后端节点 "IP:端口": 权重,权重 1 = 默认 "nodes": { "192.168.1.10:8889": 1, "192.168.1.11:8889": 2 } 节点 2 的权重是 1 的两倍,接收更多流量 "nodes": [ {"host": "192.168.1.10", "port": 8889, "weight": 1}, {"host": "192.168.1.11", "port": 8889, "weight": 2} ]
|
使用api创建路由
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
docker exec apisix-quickstart cat /usr/local/apisix/conf/config.yaml | grep -A5 "admin_key" ... UPwHgOoXJHYulFNlyHixJinOMzGfRKzV
curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d ' { "id": "getting-started-ip", "uri": "/ip", "upstream": { "type": "roundrobin", "nodes": { "192.168.10.100:8889": 1 } } }'
curl http://127.0.0.1:9080/ip { "origin": "172.25.0.1" }
|
插件-限速功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d ' { "id": "getting-started-ip", "uri": "/ip", "plugins": { "limit-req": { "rate": 2, "burst": 1, "rejected_code": 429, "key": "remote_addr" } }, "upstream": { "type": "roundrobin", "nodes": { "192.168.10.100:8889": 1 } } }'
"limit-req" — 插件名,基于漏桶算法的限流 "rate": 2 — 每秒允许 2 个请求通过 "burst": 1 — 允许突发 1 个(瞬时最多 3 个,2+1) "rejected_code": 429 — 超出限制返回 HTTP 429(Too Many Requests) "key": remote_addr 按客户端IP限流 最常用,每个IP独立计数 http_user_agent 按UA限流 按浏览器/客户端类型 http_x_forwarded_for 按真实IP(经过代理) 有 Nginx/LB 在前面时用 consumer_name 按认证用户限流配合认证插件,按用户限流
seq 1 5 | xargs -P5 -I{} curl -s -o /dev/null -w "请求{}: HTTP %{http_code}\n" http://127.0.0.1:9080/ip 请求1: HTTP 200 请求2: HTTP 429 请求4: HTTP 429 请求5: HTTP 429 请求3: HTTP 200
|
插件-密钥验证key-auth、消费者插件Consumer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| 1.创建消费者插件Consumer(定义谁能访问) curl -i "http://127.0.0.1:9180/apisix/admin/consumers" -X PUT -d ' { "username": "wangsheng", "plugins": { "key-auth": { "key": "wangsheng-secret-key" } } }'
2.路由开启认证 curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d ' { "id": "getting-started-ip", "uri": "/ip", "plugins": { "key-auth": {} }, "upstream": { "type": "roundrobin", "nodes": { "192.168.10.100:8889": 1 } } }'
3.普通访问 curl -i http://127.0.0.1:9080/ip HTTP/1.1 401 Unauthorized
4.带apikey访问 curl -i -H "apikey: wangsheng-secret-key" http://127.0.0.1:9080/ip HTTP/1.1 200 OK Content-Type: application/json Content-Length: 29 Connection: keep-alive Date: Thu, 27 Aug 2026 10:32:35 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Server: APISIX/3.18.0
{ "origin": "172.25.0.1" }
|
其他类型功能插件
| # |
插件 |
类型 |
用途 |
| 1 |
cors |
请求/响应改写 |
跨域资源共享配置 |
| 2 |
redirect |
请求/响应改写 |
HTTP 重定向(301/302/307) |
| 3 |
proxy-rewrite |
请求/响应改写 |
改写上游请求的 URI/Header/Host/Args |
| 4 |
response-rewrite |
请求/响应改写 |
改写返回给客户端的 Header/Body |
| 5 |
request-id |
请求/响应改写 |
给每个请求加唯一 ID |
| 6 |
basic-auth |
认证鉴权 |
用户名+密码认证 |
| 7 |
jwt-auth |
认证鉴权 |
JWT Token 认证 |
| 8 |
consumer-restriction |
认证鉴权 |
限制路由只给特定消费者 |
| 9 |
ip-restriction |
认证鉴权 |
IP 黑白名单 |
| 10 |
ua-restriction |
认证鉴权 |
按 User-Agent 封禁 |
| 11 |
limit-count |
限流熔断 |
固定窗口/滑动窗口计数限流 |
| 12 |
limit-conn |
限流熔断 |
并发连接数限制 |
| 13 |
fault-injection |
限流熔断 |
故障注入(模拟延迟/错误) |
| 14 |
traffic-split |
流量控制 |
灰度发布、按权重/条件分流 |
| 15 |
proxy-cache |
缓存与性能 |
响应缓存(本地磁盘) |
| 16 |
gzip |
缓存与性能 |
响应压缩 |
| 17 |
prometheus |
监控可观测 |
暴露 metrics 指标 |
| 18 |
echo |
调试与 Mock |
直接返回内容(调试用) |
| 19 |
mocking |
调试与 Mock |
Mock 响应(不依赖后端) |
| 20 |
grpc-transcode |
gRPC |
gRPC ↔ HTTP 双向转码 |
| 21 |
limit-count |
Redis 模式 |
分布式限流 |
| 22 |
limit-req |
Redis 模式 |
分布式漏桶 |
| 23 |
limit-conn |
Redis 模式 |
分布式连接限制 |
| 24 |
proxy-cache |
Redis 模式 |
分布式缓存 |