Nombre de dominio IP del microservicio
El núcleo de la arquitectura de aplicaciones moderna es la API HTTP. HTTP permite crear aplicaciones rápidamente y mantenerlas fácilmente. Independientemente del tamaño de la aplicación, la API HTTP proporciona una interfaz común, desde microservicios de propósito único hasta monolitos que lo abarcan todo. Al utilizar HTTP, los avances en la entrega de aplicaciones web que respaldan la naturaleza de hiperescala de Internet también se pueden utilizar para proporcionar una entrega de API confiable y eficaz.
Para obtener una excelente introducción a la importancia de las puertas de enlace API para aplicaciones de microservicios, consulte Creación de microservicios: uso de puertas de enlace API en nuestro blog.
Como balanceador de carga y proxy inverso liviano y de alto rendimiento, NGINX Plus tiene las capacidades avanzadas de procesamiento HTTP necesarias para manejar el tráfico API. Esto convierte a NGINX Plus en una plataforma ideal para crear puertas de enlace API. En esta publicación de blog, describimos una serie de casos de uso comunes de API Gateway y mostramos cómo configurar NGINX Plus para manejarlos de una manera eficiente, escalable y fácil de mantener. Describimos una configuración completa que puede formar la base para una implementación de producción.
Nota: A menos que se indique lo contrario, toda la información de este artículo se aplica a NGINX Plus y NGINX Open Source.
La función principal de una puerta de enlace API es proporcionar un punto de entrada único y consistente para múltiples API, independientemente de cómo se implementen o implementen en el backend. No todas las API son aplicaciones de microservicios. Nuestra puerta de enlace API necesita gestionar las API existentes, tanto de forma integral como parcialmente en transición a microservicios.
En esta publicación de blog, nos referimos a una API hipotética de administración de inventario, la "API de almacén". Usamos código de configuración de muestra para ilustrar diferentes casos de uso. Warehouse API es una API RESTful que utiliza solicitudes JSON y genera respuestas JSON. Sin embargo, el uso de JSON no es una limitación ni un requisito de NGINX Plus cuando se implementa como una puerta de enlace API; NGINX Plus es independiente del estilo arquitectónico y del formato de datos utilizados por la propia API.
La API del almacén se implementa como una colección de microservicios discretos y se publica como una única API. Los recursos de inventario y precios se implementan como servicios separados y se implementan en diferentes backends. Entonces, la estructura de ruta de la API es:
Por ejemplo, para consultar el inventario actual del almacén, la aplicación cliente enviará una solicitud HTTP GET a /api/warehouse/inventory.
Una ventaja de utilizar NGINX Plus como puerta de enlace API es que puede realizar esta función y actuar como proxy inverso, equilibrador de carga y servidor web para el tráfico HTTP existente. Si NGINX Plus ya forma parte de la pila de entrega de aplicaciones, normalmente no es necesario implementar una puerta de enlace API independiente. Sin embargo, algunos de los comportamientos predeterminados esperados por API Gateway son diferentes de los esperados para el tráfico basado en navegador. Por lo tanto, mantenemos la configuración de API Gateway separada de cualquier configuración de tráfico basada en navegador existente (o futura).
Para lograr esta separación, creamos un diseño de configuración que admite instancias NGINX Plus multipropósito y proporciona una estructura conveniente para la configuración e implementación automatizadas a través de canales de CI/CD. La estructura de directorios resultante en /etc/nginx es la siguiente.
Todos los nombres de directorios y archivos configurados por la puerta de enlace API tienen el prefijo api_. Cada uno de estos archivos y directorios admite diferentes características y funcionalidades de API Gateway, que se describen en detalle a continuación.
Todas las configuraciones de NGINX comienzan desde el archivo de configuración principal nginx.conf. Para leer la configuración de la puerta de enlace API, todas las API publicadas por / (línea 13) de nginx.conf se ven afectadas por las líneas 16 a 21. TLS configurado. protección. Tenga en cuenta que esta configuración es HTTPS pura, sin escucha HTTP de texto sin formato.
Queremos que el cliente API conozca el punto de entrada correcto y se conecte con HTTPS de forma predeterminada.
Esta configuración es estática: los detalles de cada API y su servicio backend se especifican en el archivo al que hace referencia la directiva de inclusión en la línea 24. Las líneas 27 a 30 tratan sobre los valores predeterminados del registro y el manejo de errores, y analizan la parte de error de la respuesta a continuación.
Algunas API se pueden implementar en un único backend, pero normalmente queremos tener varias API por motivos de flexibilidad o equilibrio de carga. Con una API de microservicios, definimos un backend separado para cada servicio y juntos forman una API completa. Aquí, nuestra API de almacén se implementa como dos servicios separados, cada uno con múltiples backends.
Todos los servicios API backend para todas las API publicadas por api gateway se definen en api_backends.conf. Aquí usamos múltiples pares de dirección IP-puerto en cada bloque para representar dónde se implementa el código API, pero también podemos usar nombre de host. Los usuarios de NGINX Plus también pueden aprovechar el equilibrio de carga dinámico de DNS para agregar automáticamente nuevos backends a la configuración del tiempo de ejecución.
Esta parte de la configuración primero define el URI efectivo de la API del almacén y luego define la estrategia pública * * * para manejar las solicitudes de la API del almacén.
La API del almacén define muchos bloques. NGINX Plus tiene un sistema eficiente y flexible que puede hacer coincidir los URI de solicitud con parte de la configuración. Normalmente, las solicitudes coinciden con el prefijo de ruta más específico y el orden de las directivas de ubicación no importa. Aquí, en las líneas 3 y 8, definimos dos prefijos de ruta. En cada caso, la variable $upstream se establece en el nombre del bloque ascendente, que representa el servicio API backend para los servicios de inventario y precios, respectivamente.
El objetivo de esta configuración es separar la definición de API de las políticas que controlan la entrega de la API. Para ello, hemos minimizado la configuración que se muestra en la sección de definición de API. Después de determinar el grupo ascendente apropiado para cada ubicación, detenemos el procesamiento y usamos una directiva para encontrar la política de la API (línea 10).
Utilice directivas de reescritura para mover el procesamiento a la sección de políticas de API.
El resultado de la directiva reescrita es que NGINX Plus busca bloques de ubicación que comiencen con /_warehouse y que coincidan con los URI. El bloque de posición en la línea 15 usa el modificador = para realizar una coincidencia exacta, lo que acelera el procesamiento.
En esta etapa, nuestra parte política es muy simple. El bloque de ubicación en sí está marcado como línea 16, lo que significa que los clientes no pueden realizarle solicitudes directamente. Redefina la variable $api_name para que coincida con el nombre de la API para que se muestre correctamente en el archivo de registro. Finalmente, envíe la solicitud al grupo ascendente especificado en la sección de definición de API utilizando la variable $request_URI; esta variable contiene el URI de solicitud original sin modificar.
Hay dos formas de definir una API: amplia y precisa. El enfoque más apropiado para cada API depende de las necesidades de seguridad de la API y de si el servicio backend necesita manejar URI no válidos.
En warehouse_api_simple.conf, utilizamos los métodos de extensión de la API de Warehouse definiendo el prefijo URI en las líneas 3 y 8. Esto significa que cualquier URI que comience con cualquier prefijo se envía mediante proxy al servicio de backend correspondiente. Al utilizar la coincidencia de ubicación basada en prefijos, las solicitudes de API para los siguientes URI son válidas:
Si la única consideración es enviar cada solicitud al servicio backend correcto, entonces un enfoque amplio proporciona el procesamiento más rápido y la configuración más compacta. . El enfoque preciso, por otro lado, permite que la puerta de enlace API comprenda el espacio URI completo de la API definiendo explícitamente la ruta URI para cada recurso API disponible. Utilizando el método exacto, la siguiente configuración de la API del almacén utiliza coincidencias exactas (=) y expresiones regulares (?) para definir cada URI.
Esta configuración es más detallada, pero describe con mayor precisión los recursos implementados por el servicio backend.
El beneficio de esto es proteger el servicio backend de solicitudes de clientes con formato incorrecto a costa de una pequeña sobrecarga de coincidencia de expresiones normales. Con esta configuración, NGINX Plus acepta algunos URI y rechaza otros que no son válidos:
Con definiciones API precisas, el formato del documento API existente puede impulsar la configuración de la puerta de enlace API. Las definiciones de API de NGINX Plus se pueden generar automáticamente a partir de la especificación OpenAPI (anteriormente Swagger). En la esencia de esta publicación de blog se proporciona un script de muestra para este propósito.
A medida que la API evoluciona, a veces se producen cambios importantes que requieren actualizaciones del cliente. Un ejemplo de ello es cambiar el nombre o mover recursos API. A diferencia de los navegadores web, las puertas de enlace API no pueden enviar redirecciones (código 301) a sus clientes nombrando una nueva ubicación. Afortunadamente, podemos reescribir dinámicamente las solicitudes de los clientes cuando modificar el cliente API no es práctico.
En el siguiente ejemplo, podemos ver en la línea 3 que el servicio de fijación de precios se implementó previamente como parte del servicio de inventario: la directiva de reescritura convierte las solicitudes del antiguo recurso de fijación de precios en el nuevo servicio de fijación de precios.
Reescribir dinámicamente el URI significa que cuando terminamos enviando la solicitud en la línea 26, ya no podemos usar la variable request_uri (como lo hicimos en la línea 21 de warehouse_api_simple.conf). Esto significa que debemos usar directivas de reescritura ligeramente diferentes en las líneas 9 y 14 de la sección de definición de API para preservar el URI al procesar cambios a la sección de políticas.
Una de las principales diferencias entre la API HTTP y el tráfico basado en navegador es cómo se entregan los errores al cliente. Cuando NGINX Plus se implementa como puerta de enlace API, lo configuramos para devolver errores de la manera que mejor se adapte al cliente API.
La configuración de la puerta de enlace API de nivel superior incluye una sección que define cómo manejar las respuestas de error.
La directiva en la línea 27 especifica que NGINX Plus devolverá un error en lugar del error predeterminado cuando la solicitud no coincida con ninguna definición de API. Este comportamiento (opcional) requiere que los clientes de API realicen solicitudes solo a URI válidos contenidos en el documento de API y evita que clientes no autorizados descubran la estructura de URI de las API publicadas a través de API Gateway.
La línea 28 hace referencia a un error generado por el propio servicio backend. Las excepciones no controladas pueden contener seguimientos de pila u otros datos confidenciales que no queremos enviar al cliente. Esta configuración proporciona mayor protección al enviar errores estandarizados a los clientes.
La lista completa de respuestas de error se define en un archivo de configuración separado al que hace referencia la directiva de inclusión en la línea 29, y las primeras líneas son las siguientes. Puede modificar este archivo si prefiere un formato de error diferente y cambiar el valor default_type en la línea 30 para que coincida. También puede utilizar directivas de inclusión independientes en la sección de políticas de cada API para definir un conjunto de respuestas de error que anulan los valores predeterminados.
Con esta configuración, la solicitud de un cliente de un URI no válido recibirá la siguiente respuesta.
No es común publicar API para protegerlas sin algún tipo de autenticación. NGINX Plus proporciona varias formas de proteger las API y autenticar clientes de API. Consulte la documentación para obtener información sobre las listas de control de acceso (ACL) basadas en direcciones IP, la autenticación de certificados digitales y la autenticación básica HTTP. Aquí nos centramos en los métodos de autenticación específicos de API.
Autenticación de clave API
Una clave API es un * secreto compartido conocido por el cliente y la puerta de enlace API. Básicamente son contraseñas largas y complejas emitidas a clientes API como credenciales a largo plazo. Crear una clave API es fácil: simplemente codifique un número aleatorio, como se muestra en este ejemplo.
En la línea 6 del archivo de configuración de la puerta de enlace de API de nivel superior api_gateway.conf, incluimos un archivo llamado api_keys.conf que contiene las claves de API para cada cliente de API, representado por el nombre del cliente u otra descripción para identificar.
Las claves API se definen en bloques. La directiva del mapa toma dos parámetros. En este ejemplo, la primera ubicación donde se define la clave API es $/articles/deploying-nginx-plus-as-an-API-gateway-part-1-ngin.
Este artículo: /deploying-nginx-plus-API-gateway-part-1-nginx
Discusión: únase al Círculo de arquitectos jefe de Knowledge Planet o al Pequeño círculo rojo.