搜索中...
🔍

未找到相关结果

Akemi

APISIX网关--docker部署与基础概念

字数统计: 1.6k阅读时长: 7 min
2026/09/15

我们公司有产品用的是这个组件,之前一直没有接触过,补一下
参考文档: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 性能最强、插件全开源、动态 要性能+全功能的团队
text
1
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

# 查询apikey(生产的流程)
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 模式 分布式缓存
CATALOG
  1. 1. docker部署与基础概念
    1. 1.1. 基础路由功能
    2. 1.2. 插件-限速功能
    3. 1.3. 插件-密钥验证key-auth、消费者插件Consumer
    4. 1.4. 其他类型功能插件