引言:为什么你的PHP项目需要API网关
\n\n想象一下,你正在构建一个现代Web应用。你有一个基于Laravel的用户服务、一个基于Symfony的订单服务、一个纯PHP的支付服务,还有与CRM和Telegram机器人的外部集成。客户端(移动应用、基于React的SPA以及老旧的jQuery网站)访问不同的端点,在令牌中迷失方向,而你每周都在修复CORS问题。
\n\n熟悉吗?如果是这样,那么你需要一个API网关——所有服务的统一入口。它不仅仅是一个代理,更是一个真正的调度器,负责处理路由、认证、缓存和数据聚合。
\n\n在本文中,我们将探讨如何编写一个简单但实用的基于PHP的API网关,它可以部署在任何主机上。没有魔法,只有纯代码和PHP微服务架构的最佳实践。
\n\n什么是API网关,为什么PHP开发者需要它
\n\nAPI网关是一个服务器,它接收所有来自客户端的传入请求,并将它们转发到相应的微服务。客户端对内部结构一无所知:它只是向/api/users发送请求,而网关自行决定将其发送到哪里。
网关的主要任务:
\n- \n
- 路由——根据URL或标头将请求转发到不同的服务。 \n
- 认证与授权——验证JWT令牌、API密钥,限制访问。 \n
- 聚合——将来自多个服务的数据合并到一个响应中(例如,用户资料 + 其最近的订单)。 \n
- 缓存——通过缓存频繁请求的数据来减轻后端负载。 \n
- 速率限制——防止DDoS攻击和服务过载。 \n
- 响应转换——为不同客户端将数据转换为统一格式。 \n
优点显而易见:简化客户端、集中安全管理、能够在无需通知客户端的情况下更改后端。缺点是一个额外的故障点,但这可以通过网关复制来解决。
\n\n设计一个简单的基于PHP的API网关
\n\n我们将使用纯PHP编写网关,无需框架,以便你理解其本质。但你可以轻松地将代码适配到Laravel、Symfony或Slim。
\n\n我们的网关将:
\n- \n
- 接收对
/api/users/*的请求,并将其转发到Users服务(端口8081) \n - 接收对
/api/orders/*的请求,并将其转发到Orders服务(端口8082) \n - 在转发请求前验证JWT令牌 \n
- 将GET请求缓存60秒 \n
- 聚合数据:
/api/profile将从Users和Orders收集信息 \n
步骤1. 路由配置
\n\n创建一个config.php文件,描述哪些URL指向哪里:
<?php\n// config.php\nreturn [\n 'routes' => [\n '/api/users' => [\n 'target' => 'http://127.0.0.1:8081',\n 'auth' => true, // 需要JWT\n 'cache' => false // 不缓存(个人数据)\n ],\n '/api/orders' => [\n 'target' => 'http://127.0.0.1:8082',\n 'auth' => true,\n 'cache' => 60 // 缓存60秒\n ],\n '/api/public' => [\n 'target' => 'http://127.0.0.1:8083',\n 'auth' => false,\n 'cache' => 120\n ],\n '/api/profile' => [ // 聚合端点\n 'aggregate' => true,\n 'auth' => true,\n 'services' => [\n 'user' => 'http://127.0.0.1:8081/api/user',\n 'orders' => 'http://127.0.0.1:8082/api/order'