API Gateway
Propósito
Agregar llamadas a los microservicios en un mismo lugar, la puerta de enlace API (API Gateway). El usuario
hace una llamada simple a la API Gateway, y la API Gateway hace la llamada a cada microservicio relevante.
Explicación
Con el patrón de microservicios, el cliente puede necesitar datos de múltiples microservicios. Si el
cliente llamara a cada microservicio de forma directe, podría ocasionar tiempos de carga largos, ya que
el cliente tendría que hacer una solicitud de red para cada microservicio llamado. Además, tener
la llamada del cliente a cada microservicio vincula directamente al cliente con ese microservicio - si la
implementacion interna del cambio de microservicios (por ejemplo, si dos microservicios se combinan en
algún momento en el futuro) o si la ubicación (host y puerto) de un microservicio cambia, entonces cada
cliente que hace uso de esos microservicios debe ser actualizado.
La intención del patrón API Gateway es aliviar algunos de estos problemas. En el patrón API Gateway,
se coloca una entidad adicional (la API Gateway) entre el cliente y los microservicios.
El trabajo de API Gateway es agregar las llamadas a los microservicios. En lugar de que el cliente
llame a cada microservicio individualmente, el cliente llama a la API Gateway una sola vez. La API
Gateway luego llama a cada uno de los microservicios que necesita el cliente.
Ejemplo real
Estamos implementando un sistema de microservicios y API Gateway para un sitio e-commerce. En este
sistema API Gateway realiza llamadas a los microservicios Image y Price. (Imagen y Precio)
En otras palabras
Para un sistema implementado utilizando una arquitectura de microservicios, API Gateway es el único
punto de entrada que agrega las llamadas a los microservicios individuales.
Wikipedia dice
API Gateway es un servidor que actúa como un front-end de API, recibe solicitudes de API, aplica la
limitación y políticas de seguridad, pasa las solicitudes al servicio back-end y luego devuelve la
respuesta al solicitante. Una puerta de enlace a menudo incluye un motor de transformación para
orquestar y modificar las solicitudes y respuestas sobre la marcha. Una puerta de enlace también
puede proporcionar funciones como recopilar análisis de datos y almacenamiento en caché. La puerta
de enlace puede proporcionar funcionalidad para soportar autenticación, autorización, seguridad,
auditoría y cumplimiento normativo.
Código de ejemplo
Esta implementación muestra cómo podría verse el patrón API Gateway para un sitio de e-commerce. ElApiGateway
hace llamadas a los microservicios Image y Price usando ImageClientImpl
yPriceClientImpl
respectivamente. Los clientes que ven el sitio en un dispositivo de escritorio pueden ver la información
de precio y una imagen de un producto, entonces ApiGateway
llama a los microservicios y
agrega los datos en el modelo DesktopProduct
. Sin embargo, los usuarios de dispositivos móviles solo
ven información de precios, no ven una imagen del producto. Para usuarios móviles, ApiGateway
solo
recupera el precio información, que utiliza para completar el MobileProduct
.
Aquí está la implementación del microservicio de imagen (Image).
public interface ImageClient {
String getImagePath();
}
public class ImageClientImpl implements ImageClient {
@Override
public String getImagePath() {
var httpClient = HttpClient.newHttpClient();
var httpGet = HttpRequest.newBuilder()
.GET()
.uri(URI.create("http://localhost:50005/image-path"))
.build();
try {
var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString());
return httpResponse.body();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
Aquí está la implementación del microservicio de precio (Price).
public interface PriceClient {
String getPrice();
}
public class PriceClientImpl implements PriceClient {
@Override
public String getPrice() {
var httpClient = HttpClient.newHttpClient();
var httpGet = HttpRequest.newBuilder()
.GET()
.uri(URI.create("http://localhost:50006/price"))
.build();
try {
var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString());
return httpResponse.body();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
Aquí podemos ver cómo API Gateway asigna las solicitudes a los microservicios.
public class ApiGateway {
@Resource
private ImageClient imageClient;
@Resource
private PriceClient priceClient;
@RequestMapping(path = "/desktop", method = RequestMethod.GET)
public DesktopProduct getProductDesktop() {
var desktopProduct = new DesktopProduct();
desktopProduct.setImagePath(imageClient.getImagePath());
desktopProduct.setPrice(priceClient.getPrice());
return desktopProduct;
}
@RequestMapping(path = "/mobile", method = RequestMethod.GET)
public MobileProduct getProductMobile() {
var mobileProduct = new MobileProduct();
mobileProduct.setPrice(priceClient.getPrice());
return mobileProduct;
}
}
Diagrama de clase
Aplicaciones
Usa el patrón de API Gateway cuando
- Estás usando una arquitectura de microservicios y necesites un único punto de agregación para las llamadas de microservicios.
Tutoriales
- Exploring the New Spring Cloud Gateway
- Spring Cloud - Gateway
- Getting Started With Spring Cloud Gateway