API7 网关 AI Agent Skill:多租户方案
概览
API7 企业版中的多租户由三层组成:
- 使用网关组实现运行时隔离。
- 用于租户身份的消费者和凭证。
- 使用基于服务的路由承载租户 API。
对于路由流量,请使用当前版本的 a7 服务关联路由模型:
- 创建包含上游节点的服务。
- 使用
paths和service_id创建路由。 - 分别创建消费者和凭证。
适用场景
- 分离
dev、staging和prod网关配置。 - 为 SaaS 租户提供不同的限制或身份认证策略。
- 通过网关组隔离受监管或高优先级租户。
- 由平台团队维护共享路由,由应用团队维护服务目标。
方案 A:使用网关组隔离
网关组是主要隔离边界。
a7 gateway-group create premium-tier --desc "High-performance tier for paid customers"
a7 gateway-group create standard-tier --desc "Standard tier for free and trial users"
a7 gateway-group create platform --desc "Shared platform gateway group for tenant consumers and routes"
每个网关组都可以拥有自己的全局策略:
a7 global-rule create -g standard-tier -f - <<'EOF'
{
"plugins": {
"limit-count": {
"count": 5000,
"time_window": 3600,
"rejected_code": 429
}
}
}
EOF
方案 B:使用消费者和凭证
当前 API7 企业版不通过 Admin API 暴露消费者组管理能力。请将租户建模为消费者,在需要时为每个消费者关联插件,并使用 a7 credential create 创建凭证。
a7 consumer create -g platform -f - <<'EOF'
{
"username": "startup-xyz",
"desc": "Free tier tenants",
"plugins": {
"limit-count": {
"count": 100,
"time_window": 86400,
"key_type": "var",
"key": "consumer_name",
"rejected_code": 429,
"rejected_msg": "Free tier quota exceeded"
}
}
}
EOF
a7 credential create -g platform --consumer startup-xyz --plugins-json '{"key-auth":{"key":"startup-xyz-key"}}'
a7 consumer create -g platform -f - <<'EOF'
{
"username": "acme-corp",
"desc": "Pro tier tenants",
"plugins": {
"limit-count": {
"count": 10000,
"time_window": 86400,
"key_type": "var",
"key": "consumer_name",
"rejected_code": 429,
"rejected_msg": "Pro tier quota exceeded"
}
}
}
EOF
a7 credential create -g platform --consumer acme-corp --plugins-json '{"key-auth":{"key":"acme-secret-key"}}'
方案 C:租户感知的服务路由
先创建后端服务:
a7 service create -g platform -f - <<'EOF'
{
"id": "tenant-api-service",
"name": "tenant-api-service",
"upstream": {
"type": "roundrobin",
"nodes": [
{"host": "internal-service", "port": 8080, "weight": 1}
]
}
}
EOF
使用 paths 和 service_id 创建租户路由:
a7 route create -g platform -f - <<'EOF'
{
"id": "multi-tenant-api",
"name": "multi-tenant-api",
"paths": ["/service/*"],
"service_id": "tenant-api-service",
"plugins": {
"key-auth": {},
"proxy-rewrite": {
"headers": {
"set": {
"X-Tenant-ID": "$consumer_name",
"X-User-ID": "$consumer_name",
"X-Gateway-Group": "platform"
}
}
}
}
}
EOF
按网关组进行声明式管理
每个网关组使用一个声明式文件,并通过 -g 应用。这与当前 a7 config sync 工作流一致。
version: "1"
services:
- id: tenant-api-service
name: tenant-api-service
upstream:
type: roundrobin
nodes:
- host: internal-service
port: 8080
weight: 1
routes:
- id: multi-tenant-api
name: multi-tenant-api
paths:
- /service/*
service_id: tenant-api-service
plugins:
key-auth: {}
proxy-rewrite:
headers:
set:
X-Tenant-ID: "$consumer_name"
X-User-ID: "$consumer_name"
X-Gateway-Group: platform
应用配置:
a7 config sync -g platform -f platform-tenants.yaml
使用 a7 consumer create -f 和 a7 credential create 管理租户身份和密钥材料。
验证
a7 consumer list -g platform
a7 credential list -g platform --consumer startup-xyz
a7 service get tenant-api-service -g platform -o json
a7 route get multi-tenant-api -g platform -o json
流量验证需要已部署的网关:
curl -i -H "apikey: startup-xyz-key" https://gateway.example.com/service/resource
curl -i -H "apikey: acme-secret-key" https://gateway.example.com/service/resource
身份认证成功后,后端应收到 X-Tenant-ID、X-User-ID 和 X-Gateway-Group
请求头。
重要注意事项
- 使用不同网关组实现严格运行时隔离。
- 在同一网关组内使用消费者级插件实现租户特定策略。
- 将凭证放在
a7 credential中,不要直接嵌入消费者中。 a7 config sync -g每次管理一个网关组。- 对于没有专用 CLI 参数的字段,请使用原始消费者请求体。
本页面由 api7/a7 仓库中的 a7-recipe-multi-tenant/SKILL.md 生成。你可以在 AI Agent Skills 页面查看所有技能。