|
| 1 | +--- |
| 2 | +title: API Gateway |
| 3 | +category: Architectural |
| 4 | +language: es |
| 5 | +tag: |
| 6 | + - Cloud distributed |
| 7 | + - Decoupling |
| 8 | + - Microservices |
| 9 | +--- |
| 10 | + |
| 11 | +## Motivo |
| 12 | + |
| 13 | +Agregar llamadas a los microservicios en un mismo lugar, la puerta de enlace API (API Gateway). El usuario |
| 14 | +hace un llamada simple al API Gateway, y la API Gateway hace la llamada a cada microservicio relevante. |
| 15 | + |
| 16 | +## Explicaición |
| 17 | + |
| 18 | +Con el patrón de microservicios, el cliente puede necesitar datos de múltiples microservicios. Si el |
| 19 | +cliente llamara a cada microservicio de forma directe, podría ocasionar tiempos de carga largos, ya que |
| 20 | +el cliente tendría que hacer una solicitud de red para cada microservicio llamado. Además, tener la |
| 21 | +la llamada del cliente a cada microservicio vincula directamente al cliente con ese microservicio - si la |
| 22 | +implementacion interna del cambio de microservicios (por ejemplo, si dos microservicios se combinan en |
| 23 | +algún momento en el futuro) o si la ubicación (host y puerto) de un microservicio cambia, entonces cada |
| 24 | +cliente que hace uso de esos microservicios debe ser actualizado. |
| 25 | + |
| 26 | +La intención del patrón API Gateway es aliviar algunos de estos problemas. En el patrón API Gateway, |
| 27 | +se coloca una entidad adicional (la API Gateway) entre el cliente y los microservicios. |
| 28 | +El trabajo de API Gateway es agregar las llamadas a los microservicios. En lugar de que el cliente |
| 29 | +llame a cada microservicio individualmente, el cliente llama al API Gateway una sola vez. la API |
| 30 | +Gateway luego llama a cada uno de los microservicios que necesita el cliente. |
| 31 | + |
| 32 | +Ejemplo real |
| 33 | + |
| 34 | +> Estamos implementando un sistema de microservicios y API Gateway para un sitio e-commerce. En este |
| 35 | +> sistema API Gateway realiza llamadas a los microservicios Image y Price. (Imagen y Precio) |
| 36 | +
|
| 37 | +En otras palabras |
| 38 | + |
| 39 | +> Para un sistema implementado utilizando una arquitectura de microservicios, API Gateway es el único |
| 40 | +> punto de entrada que agrega las llamadas a los microservicios individuales. |
| 41 | +
|
| 42 | +Wikipedia dice |
| 43 | + |
| 44 | +> API Gateway es un servidor que actúa como un front-end de API, recibe solicitudes de API, aplica la |
| 45 | +> limitación y políticas de seguridad, pasa las solicitudes al servicio back-end y luego devuelve la |
| 46 | +> respuesta al solicitante. Una puerta de enlace a menudo incluye un motor de transformación para |
| 47 | +> orquestar y modificar las solicitudes y respuestas sobre la marcha. Una puerta de enlace también |
| 48 | +> puede proporcionar funciones como recopilar análisis de datos y almacenamiento en caché. La puerta |
| 49 | +> de enlace puede proporcionar funcionalidad para soportar autenticación, autorización, seguridad, |
| 50 | +> auditoría y cumplimiento normativo. |
| 51 | +
|
| 52 | +**Código de ejemplo** |
| 53 | + |
| 54 | +Esta implementación muestra cómo podría verse el patrón API Gateway para un sitio de e-commerce. El |
| 55 | +`ApiGateway` hace llamadas a los microservicios Image y Price usando `ImageClientImpl` y`PriceClientImpl` |
| 56 | +respectivamente. Los clientes que ven el sitio en un dispositivo de escritorio pueden ver la información |
| 57 | +de precio y una imagen de un producto, entonces `ApiGateway` llama a los microservicios y |
| 58 | +agrega los datos en el modelo `DesktopProduct`. Sin embargo, los usuarios de dispositivos móviles solo |
| 59 | +ven información de precios, no ven una imagen del producto. Para usuarios móviles, `ApiGateway` solo |
| 60 | +recupera el precio información, que utiliza para completar el `MobileProduct`. |
| 61 | + |
| 62 | +Aquí está la implementación del microservicio de imagen (Image). |
| 63 | + |
| 64 | +```java |
| 65 | +public interface ImageClient { |
| 66 | + String getImagePath(); |
| 67 | +} |
| 68 | + |
| 69 | +public class ImageClientImpl implements ImageClient { |
| 70 | + @Override |
| 71 | + public String getImagePath() { |
| 72 | + var httpClient = HttpClient.newHttpClient(); |
| 73 | + var httpGet = HttpRequest.newBuilder() |
| 74 | + .GET() |
| 75 | + .uri(URI.create("http://localhost:50005/image-path")) |
| 76 | + .build(); |
| 77 | + |
| 78 | + try { |
| 79 | + var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString()); |
| 80 | + return httpResponse.body(); |
| 81 | + } catch (IOException | InterruptedException e) { |
| 82 | + e.printStackTrace(); |
| 83 | + } |
| 84 | + |
| 85 | + return null; |
| 86 | + } |
| 87 | +} |
| 88 | +``` |
| 89 | + |
| 90 | +Aquí está la implementación del microservicio de precio (Price). |
| 91 | + |
| 92 | +```java |
| 93 | +public interface PriceClient { |
| 94 | + String getPrice(); |
| 95 | +} |
| 96 | + |
| 97 | +public class PriceClientImpl implements PriceClient { |
| 98 | + |
| 99 | + @Override |
| 100 | + public String getPrice() { |
| 101 | + var httpClient = HttpClient.newHttpClient(); |
| 102 | + var httpGet = HttpRequest.newBuilder() |
| 103 | + .GET() |
| 104 | + .uri(URI.create("http://localhost:50006/price")) |
| 105 | + .build(); |
| 106 | + |
| 107 | + try { |
| 108 | + var httpResponse = httpClient.send(httpGet, BodyHandlers.ofString()); |
| 109 | + return httpResponse.body(); |
| 110 | + } catch (IOException | InterruptedException e) { |
| 111 | + e.printStackTrace(); |
| 112 | + } |
| 113 | + |
| 114 | + return null; |
| 115 | + } |
| 116 | +} |
| 117 | +``` |
| 118 | + |
| 119 | +Aquí podemos ver cómo API Gateway asigna las solicitudes a los microservicios. |
| 120 | + |
| 121 | +```java |
| 122 | +public class ApiGateway { |
| 123 | + |
| 124 | + @Resource |
| 125 | + private ImageClient imageClient; |
| 126 | + |
| 127 | + @Resource |
| 128 | + private PriceClient priceClient; |
| 129 | + |
| 130 | + @RequestMapping(path = "/desktop", method = RequestMethod.GET) |
| 131 | + public DesktopProduct getProductDesktop() { |
| 132 | + var desktopProduct = new DesktopProduct(); |
| 133 | + desktopProduct.setImagePath(imageClient.getImagePath()); |
| 134 | + desktopProduct.setPrice(priceClient.getPrice()); |
| 135 | + return desktopProduct; |
| 136 | + } |
| 137 | + |
| 138 | + @RequestMapping(path = "/mobile", method = RequestMethod.GET) |
| 139 | + public MobileProduct getProductMobile() { |
| 140 | + var mobileProduct = new MobileProduct(); |
| 141 | + mobileProduct.setPrice(priceClient.getPrice()); |
| 142 | + return mobileProduct; |
| 143 | + } |
| 144 | +} |
| 145 | +``` |
| 146 | + |
| 147 | +## Diagrama de clase |
| 148 | + |
| 149 | + |
| 150 | + |
| 151 | +## Aplicaciones |
| 152 | + |
| 153 | +Usa el patrón de API Gateway cuando |
| 154 | + |
| 155 | +* Estés usando una arquitectura de microservicios y necesites un único punto de agregación para las llamadas de microservicios. |
| 156 | + |
| 157 | +## Tutoriales |
| 158 | + |
| 159 | +* [Exploring the New Spring Cloud Gateway](https://www.baeldung.com/spring-cloud-gateway) |
| 160 | +* [Spring Cloud - Gateway](https://www.tutorialspoint.com/spring_cloud/spring_cloud_gateway.htm) |
| 161 | +* [Getting Started With Spring Cloud Gateway](https://dzone.com/articles/getting-started-with-spring-cloud-gateway) |
| 162 | + |
| 163 | +## Créditos |
| 164 | + |
| 165 | +* [microservices.io - API Gateway](http://microservices.io/patterns/apigateway.html) |
| 166 | +* [NGINX - Building Microservices: Using an API Gateway](https://www.nginx.com/blog/building-microservices-using-an-api-gateway/) |
| 167 | +* [Microservices Patterns: With examples in Java](https://www.amazon.com/gp/product/1617294543/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1617294543&linkId=ac7b6a57f866ac006a309d9086e8cfbd) |
| 168 | +* [Building Microservices: Designing Fine-Grained Systems](https://www.amazon.com/gp/product/1491950358/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=1491950358&linkId=4c95ca9831e05e3f0dadb08841d77bf1) |
0 commit comments