1. Balancador de carga (a menudo la primera parada):
* Muchos sistemas usan un equilibrador de carga como punto de entrada. Este es un servidor dedicado que distribuye solicitudes entrantes en múltiples servidores de backend (los servicios reales). El equilibrador de carga decide a qué servidor reenviar la solicitud en función de factores como la carga del servidor, las verificaciones de salud y potencialmente incluso las características de solicitud (por ejemplo, utilizando una técnica llamada enrutamiento consciente de contenido).
* El equilibrador de carga generalmente funciona en la capa de red (capa 4) o la capa de aplicación (capa 7). Los equilibradores de carga de la capa 4 analizan cosas como direcciones IP y puertos, mientras que los equilibradores de carga de la capa 7 inspeccionan la solicitud HTTP (encabezados, URL, etc.) antes de tomar una decisión de enrutamiento.
2. Proxy inverso (a menudo después del equilibrador de carga):
* Un proxy inverso se encuentra frente a uno o más servidores de backend. Recibe solicitudes del equilibrador de carga (o directamente de los clientes si no hay un equilibrador de carga) y las reenvía al servicio apropiado.
* Los proxies inversos a menudo manejan tareas como el almacenamiento en caché, la terminación SSL (descifrar el tráfico HTTPS) y la modificación de solicitud antes de pasar la solicitud al backend.
* Nginx y Apache son ejemplos populares de proxies inversos.
3. Enrutamiento del lado del servidor (dentro de la aplicación):
* Una vez que la solicitud llega al servidor (después de pasar potencialmente a través de un equilibrador de carga y proxy inverso), el servidor en sí debe determinar qué servicio o aplicación específica debe manejarlo. Esto generalmente se realiza utilizando uno de los siguientes métodos:
* ruta de url: El método más común. El servidor examina el componente de ruta de la URL (la parte después del nombre de dominio). Por ejemplo, `/usuarios/123` podría enrutarse a un servicio de usuario, mientras que`/productos/búsqueda` podría ir a un servicio de catálogo de productos. Frameworks como Express.js (Node.js), Spring Boot (Java) y Django (Python) proporcionan mecanismos para definir rutas basadas en rutas de URL.
* HostName/Domain: Se pueden implementar diferentes servicios en diferentes subdominios o nombres de host (por ejemplo, `users.example.com` vs.` productos.example.com`). El servidor puede usar el nombre de host para determinar el servicio apropiado.
* Enrutamiento basado en el encabezado: La solicitud puede incluir encabezados que contienen información sobre el servicio previsto. El servidor puede verificar estos encabezados para enrutar la solicitud en consecuencia.
* Contenido de solicitud: En algunos casos, el contenido del cuerpo de solicitud en sí podría determinar qué servicio debe manejarlo. Esto es menos común porque requiere más procesamiento y puede ser menos eficiente.
4. Discovery de servicio (para arquitecturas de microservicios):
* En las arquitecturas de microservicios, los servicios a menudo se implementan y escalan dinámicamente. Los mecanismos de descubrimiento de servicios, como cónsul, etcd o kubernetes, ayudan a localizar las instancias actuales de cada servicio. Cuando entra una solicitud, el mecanismo de enrutamiento (por ejemplo, un proxy inverso o puerta de enlace API) consulta el sistema de descubrimiento de servicios para encontrar la dirección de la instancia de servicio apropiada y reenvía la solicitud.
En resumen: El proceso es una cadena de componentes potencialmente múltiples. Una solicitud generalmente fluye como esta:
Cliente -> (Balancer de carga) -> (proxy inverso) -> servidor -> (descubrimiento de servicio, si corresponde) -> Servicio específico
La implementación exacta depende en gran medida de la complejidad del sistema y las tecnologías específicas utilizadas. Las aplicaciones simples solo pueden implicar el enrutamiento de ruta de URL en un solo servidor, mientras que los sistemas a gran escala utilizan una combinación de equilibradores de carga, proxies inversos, descubrimiento de servicios y reglas de enrutamiento sofisticadas.