跳到主要内容
版本:3.10.x

API7 网关 AI Agent Skill:多租户方案

概览

API7 企业版中的多租户由三层组成:

  1. 使用网关组实现运行时隔离。
  2. 用于租户身份的消费者和凭证。
  3. 使用基于服务的路由承载租户 API。

对于路由流量,请使用当前版本的 a7 服务关联路由模型:

  1. 创建包含上游节点的服务。
  2. 使用 pathsservice_id 创建路由。
  3. 分别创建消费者和凭证。

适用场景

  • 分离 devstagingprod 网关配置。
  • 为 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

使用 pathsservice_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 -fa7 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-IDX-User-IDX-Gateway-Group 请求头。

重要注意事项

  • 使用不同网关组实现严格运行时隔离。
  • 在同一网关组内使用消费者级插件实现租户特定策略。
  • 将凭证放在 a7 credential 中,不要直接嵌入消费者中。
  • a7 config sync -g 每次管理一个网关组。
  • 对于没有一等 CLI 标志的字段,请使用原始消费者请求体。

本页面由 api7/a7 仓库中的 a7-recipe-multi-tenant/SKILL.md 生成。你可以在 AI Agent Skills 页面查看所有技能。