API Gateway para PHP: unifica microservicios sin complicaciones

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: Por qué tu proyecto PHP necesita un API Gateway

\n\n

Imagina que estás construyendo una aplicación web moderna. Tienes un servicio de usuarios en Laravel, un servicio de pedidos en Symfony, un servicio de pagos en PHP puro, y además integraciones externas con un CRM y un bot de Telegram. Los clientes (app móvil, SPA en React y el clásico sitio en jQuery) golpean diferentes endpoints, se confunden con los tokens, y tú terminas arreglando CORS cada semana.

\n\n

¿Te suena familiar? Si es así, necesitas un API Gateway — un punto de entrada único para todos tus servicios. No es solo un proxy, sino un verdadero orquestador que se encarga del enrutamiento, la autenticación, el caché y la agregación de datos.

\n\n

En este artículo, veremos cómo escribir un API Gateway en PHP simple pero funcional, que puedas desplegar en cualquier hosting. Sin magia, solo código limpio y mejores prácticas para una arquitectura de microservicios en PHP.

\n\n

¿Qué es un API Gateway y por qué lo necesita un desarrollador PHP?

\n\n

Un API Gateway (puerta de enlace de API) es un servidor que recibe todas las solicitudes entrantes de los clientes y las redirige a los microservicios correspondientes. El cliente no sabe nada sobre la estructura interna: simplemente envía una solicitud a /api/users, y el Gateway decide a dónde enviarla.

\n\n

Funciones principales del Gateway:

\n
    \n
  • Enrutamiento — redirigir solicitudes a diferentes servicios según la URL o los encabezados.
  • \n
  • Autenticación y autorización — validar tokens JWT, claves de API, y controlar el acceso.
  • \n
  • Agregación — combinar datos de varios servicios en una sola respuesta (por ejemplo, perfil de usuario + sus últimos pedidos).
  • \n
  • Caché — reducir la carga en el backend almacenando en caché los datos solicitados con frecuencia.
  • \n
  • Límite de tasa (Rate limiting) — proteger contra DDoS y sobrecarga de servicios.
  • \n
  • Transformación de respuestas — unificar el formato de datos para diferentes clientes.
  • \n
\n\n

Las ventajas son claras: simplificación del lado del cliente, gestión centralizada de la seguridad, y la posibilidad de cambiar el backend sin notificar a los clientes. La desventaja es un punto adicional de fallo, pero esto se soluciona replicando el Gateway.

\n\n

Diseñando un API Gateway simple en PHP

\n\n

Escribiremos un Gateway en PHP puro, sin frameworks, para que entiendas la esencia. Pero puedes adaptar fácilmente el código a Laravel, Symfony o Slim.

\n\n

Nuestro Gateway hará lo siguiente:

\n
    \n
  • Recibir solicitudes en /api/users/* y redirigirlas al servicio Users (puerto 8081)
  • \n
  • Recibir solicitudes en /api/orders/* y redirigirlas al servicio Orders (puerto 8082)
  • \n
  • Validar el token JWT antes de permitir el paso
  • \n
  • Almacenar en caché las solicitudes GET durante 60 segundos
  • \n
  • Agregar datos: /api/profile recopilará información de Users y Orders
  • \n
\n\n

Paso 1: Configuración de rutas

\n\n

Crearemos un archivo config.php donde definiremos qué URL llevan a dónde:

\n\n
<?php\n// config.php\nreturn [\n    'routes' => [\n        '/api/users' => [\n            'target' => 'http://127.0.0.1:8081',\n            'auth' => true,        // requiere JWT\n            'cache' => false       // no almacenar en caché (datos personales)\n        ],\n        '/api/orders' => [\n            'target' => 'http://127.0.0.1:8082',\n            'auth' => true,\n            'cache' => 60          // caché de 60 segundos\n        ],\n        '/api/public' => [\n            'target' => 'http://127.0.0.1:8083',\n            'auth' => false,\n            'cache' => 120\n        ],\n        '/api/profile' => [        // endpoint agregado\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'                

Blogs

Book Recommendations