教程:通过插件代理和管理 API 请求
本教程以快速开始为基础,带你完成一个贴近实际的 场景:通过 API7 网关代理 API 请求,并使用插件实施认证和限流。
你将学到:
- 为后端 API 创建服务和路由
- 添加
key-auth插件以要求 API Key 认证 - 创建带有凭证的消费者
- 添加
limit-count插件以实施限流 - 测试完整配置
预计用时:约 15 分钟
前提条件:已运行的 API7 网关实例。如果尚未设置,请先完成快速开始。如果要跟随 Admin API 示例,请在开始前从控制台获取令牌。
第 1 步:创建服务和路由
创建一个代理到 httpbin.org 服务的服务:
- Dashboard
- Admin API
- ADC
- 在控制台侧边栏中进入默认网关组,然后点击 Services。
- 点击 Add Service,再点击 Add Manually。
- 配置服务:
| 字段 | 值 |
|---|---|
| 名称 | demo-api |
| 服务类型 | HTTP (Layer 7 Proxy) |
| 上游协议 | HTTP |
| 如何查找上游 | Use Nodes |
- 点击 Add Node,并进行如下配置:
| 字段 | 值 |
|---|---|
| 主机 | httpbin.org |
| 端口 | 80 |
| 权重 | 100 |
- 点击 Add 创建服务。
- 点击
demo-api服务,然后点击 Add Route。 - 配置路由:
| 字段 | 值 |
|---|---|
| 名称 | get-request |
| 路径 | /get |
| 方法 | GET |
- 点击 Add。
# 创建包含上游的服务
curl -k "https://localhost:7443/apisix/admin/services/demo-api?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "demo-api",
"upstream": {
"type": "roundrobin",
"scheme": "http",
"nodes": [
{ "host": "httpbin.org", "port": 80, "weight": 100 }
]
}
}'
# 在该服务下创建路由
curl -k "https://localhost:7443/apisix/admin/routes/get-request?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "get-request",
"service_id": "demo-api",
"paths": ["/get"],
"methods": ["GET"]
}'
如果不是在本地运行,请将 localhost 替换为你的 Admin API 主机。若 Admin API 使用自签名 TLS 证书,则必须使用 -k 标志。将 {gateway_group_id} 替换为网关组 ID:对于快速开始创建的网关组,请使用 default;也可从控制台的 Gateway Groups 页面复制该 ID。
adc.yaml
services:
- name: demo-api
upstream:
name: default
scheme: http
nodes:
- host: httpbin.org
port: 80
weight: 100
routes:
- name: get-request
uris:
- /get
methods:
- GET
adc sync -f adc.yaml
第 2 步:验证代理
在添加插件前,测试路由以验证基本配置:
curl -i "http://localhost:9080/get"
你应收到包含 HTTPBin 响应正文的 200 OK 响应,这表示代理工作正常。
第 3 步:启用 key-auth 插件
key-auth 插件要求消费者提供有效的 API Key。
- Dashboard
- Admin API
- ADC
- 在默认网关组中,进入 Services 并点击
demo-api服务。 - 点击 Plugins,再点击 Enable Plugin。
- 搜索
key-auth并启用它。 - 使用默认配置并点击 Submit。
# 替换服务定义并启用 key-auth
curl -k "https://localhost:7443/apisix/admin/services/demo-api?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "demo-api",
"upstream": {
"type": "roundrobin",
"scheme": "http",
"nodes": [
{ "host": "httpbin.org", "port": 80, "weight": 100 }
]
},
"plugins": {
"key-auth": {}
}
}'
adc.yaml
services:
- name: demo-api
upstream:
name: default
scheme: http
nodes:
- host: httpbin.org
port: 80
weight: 100
routes:
- name: get-request
uris:
- /get
methods:
- GET
plugins:
key-auth: {}
adc sync 会以声明式方式替换全部资源,因此文件必须包含完整的目标状态;请保留第 1 步的上游和路由块,并添加新的 plugins 块。
adc sync -f adc.yaml
不带密钥测试
curl -i "http://localhost:9080/get"
预期响应:
HTTP/1.1 401 Unauthorized
{"message":"Missing API key in request"}