PHP服务的API网关:如何无痛整合微服务

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么你的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\n

API网关是一个服务器,它接收所有来自客户端的传入请求,并将它们转发到相应的微服务。客户端对内部结构一无所知:它只是向/api/users发送请求,而网关自行决定将其发送到哪里。

\n\n

网关的主要任务:

\n
    \n
  • 路由——根据URL或标头将请求转发到不同的服务。
  • \n
  • 认证与授权——验证JWT令牌、API密钥,限制访问。
  • \n
  • 聚合——将来自多个服务的数据合并到一个响应中(例如,用户资料 + 其最近的订单)。
  • \n
  • 缓存——通过缓存频繁请求的数据来减轻后端负载。
  • \n
  • 速率限制——防止DDoS攻击和服务过载。
  • \n
  • 响应转换——为不同客户端将数据转换为统一格式。
  • \n
\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
\n\n

步骤1. 路由配置

\n\n

创建一个config.php文件,描述哪些URL指向哪里:

\n\n
<?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'                

博客

书籍推荐