简介
什么是 API 网关?
API 网关是位于客户端和后端服务之间的服务器,负责处理 API 请求、执行安全策略并高效管理流量。它简化了 API 管理,并提高了性能、安全性和可观测性。
为什么要使用 API 网关?
随着微服务和云原生应用的兴起,API 网关可以帮助开发者:
- 高效地路由和负载均衡 API 流量。
- 通过身份验证和授权保护 API 安全。
- 执行限流并防止滥用。
- 监控 API 的使用情况和性能。
- 转换 API 请求和响应。
搭建 API 网关(实战指南)
在本指南中,我们将使用 Apache APISIX 搭建一个 API 网关,并将其配置为将请求路由到后端服务。
准备工作
确保你已安装以下工具:
- Docker(用于快速部署)
- cURL(用于 API 测试)
- 一个后端服务(简单的 HTTP 服务器,如 NGINX 或示例 API)
第 1 步:安装 Apache APISIX
我们将使用 Docker 部署 Apache APISIX。
克隆 Apache APISIX 仓库并进入目录:
1git clone https://github.com/apache/apisix-docker.git 2cd apisix-docker/example使用 Docker Compose 启动 APISIX:
1docker-compose up -d验证 APISIX 网关是否正在运行:
1curl http://127.0.0.1:9080/apisix/admin/routes -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'如果成功,这将返回一个空的路由列表。
第 2 步:添加后端 API
在此示例中,我们将使用一个带有 httpbin 的简单后端 API:
运行 httpbin 容器:
1docker run -d --name httpbin -p 8080:80 kennethreitz/httpbin测试后端 API:
1curl http://127.0.0.1:8080/get
第 3 步:配置 API 网关路由
现在,让我们配置 APISIX 以将请求路由到我们的后端。
在 APISIX 中添加一条路由,以将请求代理到 httpbin:
1curl http://127.0.0.1:9080/apisix/admin/routes/1 \ 2 -X PUT \ 3 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ 4 -d '{ 5 "uri": "/get", 6 "upstream": { 7 "type": "roundrobin", 8 "nodes": { 9 "127.0.0.1:8080": 1 10 } 11 } 12 }'测试 API 网关路由:
1curl http://127.0.0.1:9080/get你应该会看到来自 httpbin 的响应。
第 4 步:添加限流
为了保护后端服务,让我们启用限流(Rate Limiting)。
将限流插件应用到我们的路由:
1curl http://127.0.0.1:9080/apisix/admin/routes/1 \ 2 -X PUT \ 3 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ 4 -d '{ 5 "uri": "/get", 6 "plugins": { 7 "limit-count": { 8 "count": 5, 9 "time_window": 60, 10 "rejected_code": 429, 11 "key": "remote_addr" 12 } 13 }, 14 "upstream": { 15 "type": "roundrobin", 16 "nodes": { 17 "127.0.0.1:8080": 1 18 } 19 } 20 }'测试限流功能:
1for i in {1..6}; do curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9080/get ; done第 6 次请求应返回
429 (Too Many Requests)。
第 5 步:启用 API 身份验证
为了保护 API 的安全,我们将添加 API Key 身份验证。
创建一个带有 API Key 的消费者(Consumer):
1curl http://127.0.0.1:9080/apisix/admin/consumers \ 2 -X PUT \ 3 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ 4 -d '{ 5 "username": "test-user", 6 "plugins": { 7 "key-auth": { 8 "key": "my-secure-key" 9 } 10 } 11 }'更新路由以要求身份验证:
1curl http://127.0.0.1:9080/apisix/admin/routes/1 \ 2 -X PUT \ 3 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' \ 4 -d '{ 5 "uri": "/get", 6 "plugins": { 7 "key-auth": {} 8 }, 9 "upstream": { 10 "type": "roundrobin", 11 "nodes": { 12 "127.0.0.1:8080": 1 13 } 14 } 15 }'测试身份验证:
1curl -H "apikey: my-secure-key" http://127.0.0.1:9080/get如果没有提供该密钥,请求将被拒绝。
总结
恭喜你!你已经成功搭建了一个正常运行的 API 网关,其中包含:
- 基本的请求路由。
- 用于保护后端服务的限流。
- 用于提高安全性的 API 身份验证。
