Gestiona eficientemente tu API GraphQL con API Gateway
March 21, 2023
GraphQL es un potente lenguaje de consulta para APIs que permite a los desarrolladores definir la estructura de los datos que necesitan del servidor, y el servidor responde solo con esos datos. Esto lo hace mucho más eficiente y flexible que las tradicionales APIs REST, que a menudo requieren múltiples solicitudes para recuperar los mismos datos. Sin embargo, gestionar APIs GraphQL puede ser complejo y consumir mucho tiempo, especialmente a gran escala. Aquí es donde entra en juego una API Gateway.
Una de las características clave de las API Gateways modernas, como Apache APISIX, es su soporte para APIs GraphQL. APISIX facilita la gestión y escalabilidad de las APIs GraphQL utilizando su sistema de configuración flexible y potentes plugins. Uno de estos plugins es el degraphql, que nos permite convertir una API GraphQL en una API REST. En este post, exploraremos esta característica con un ejemplo.
Objetivos de aprendizaje
A lo largo del artículo, aprenderás y encontrarás respuestas a las siguientes preguntas:
- ¿Qué es el plugin DeGraphQL?
- ¿Cuáles son los casos de uso y características del plugin DeGraphQL?
- ¿Cómo usar el plugin DeGraphQL?
- ¿Cómo transformar REST a GraphQL?
- ¿Cómo gestionar el tráfico de una API GraphQL?
¿Por qué usar el plugin DeGraphQL?
Este plugin es capaz de transformar APIs expuestas por un upstream GraphQL (servicio backend) en un endpoint REST tradicional mapeando URIs en consultas GraphQL. Llamar a APIs REST desde un cliente típico abre los beneficios de GraphQL para más personas, considera los siguientes casos de uso:
Caso de uso 1: Tus clientes existentes están acostumbrados a consumir APIs REST y no están muy familiarizados con cómo escribir consultas GraphQL. Para mantener las cosas simples para ellos, puedes usar Apache APISIX API Gateway para convertir una API GraphQL en una API REST.
Caso de uso 2: Estás en un equipo de desarrollo front-end que quiere probar las funcionalidades existentes de una API GraphQL sin pedirle al equipo back-end que implemente un nuevo servidor GraphQL.
Caso de uso 3: No tienes acceso para cambiar el backend porque es un conjunto existente de APIs GraphQL, potencialmente gestionado por un tercero.
Caso de uso 4: Tienes una infraestructura de API REST existente, pero estás evaluando si GraphQL puede funcionar para tus necesidades.
Caso de uso 5: Tienes una gran base de código, y la migración a GraphQL está ocurriendo en el backend, pero quieres usar GraphQL ahora sin esperar.
Caso de uso 6: Tienes múltiples microservicios y usan una combinación de ambos enfoques. Quieres habilitar una comunicación fluida entre ellos.
¿Cuáles son las características del plugin DeGraphQL?
El plugin DeGraphQL proporciona una serie de características útiles que facilitan la configuración y gestión de tu API GraphQL, incluyendo:
Validación de solicitudes: Puede validar las solicitudes GraphQL entrantes para asegurarse de que cumplen ciertos criterios. Esto puede incluir verificar la estructura de la consulta, imponer restricciones de tipo de entrada y más. Al validar las solicitudes, puedes asegurarte de que tu API siempre recibe solicitudes válidas y bien formadas.
Análisis de consultas: También puede analizar consultas GraphQL, permitiéndote extraer información específica de la consulta y usarla para informar el comportamiento de tu API. Esto puede incluir cosas como seleccionar el servicio backend apropiado basado en los datos solicitados, o modificar la respuesta basada en ciertos parámetros de la consulta.
Transformación de respuestas: Finalmente, puede transformar las respuestas GraphQL antes de que se devuelvan al cliente. Esto puede ser útil para cosas como normalizar estructuras de datos, eliminar información sensible o agregar datos adicionales a la respuesta.
Con esta capacidad, Apache APISIX no solo facilita el uso conjunto de REST y GraphQL, sino que también puedes definir límites de tasa, imponer autenticación y autorización, bloquear clientes que intenten hacer un mal uso de una API, y asegurar que las APIs funcionen sin problemas a medida que se actualizan con la ayuda de otros plugins integrados.
Cómo usar el plugin DeGraphQL (Demo)
Con suficiente conocimiento teórico en mente, ahora podemos saltar a una demostración práctica del plugin DeGraphQL. DeGraphQL necesita un endpoint GraphQL para consultar. Como ejemplo, vamos a usar una de las APIs GraphQL públicas gratuitas que recuperan información sobre países, continentes y idiomas https://countries.trevorblades.com/
.
Si navegas al enlace anterior de la API de Países, se abrirá un playground donde puedes escribir algunas consultas contra la API GraphQL en la interfaz de usuario.
También puedes construir tu propia API GraphQL usando StepZen o ApollographQL proporcionados por estudios GraphQL que te ayudan a construir y desplegar tu propia API GraphQL combinando APIs preconstruidas como Accuweather, Airtable, GitHub, Twitter, Trello y más. Por ejemplo, puedes componer dos APIs de Accuteweather y Países juntas para recopilar la información meteorológica proporcionada por un nombre de país/ciudad y poner APISIX al frente para consultar la API desde REST.
Ahora nuestra tarea es transformar la definición de consulta anterior en una simple llamada REST y enviarla como datos JSON. Como resultado, el API Gateway de Apache APISIX expone el endpoint REST y debería ser capaz de enrutar todas las solicitudes a la API GraphQL.
Por ejemplo, todas las solicitudes REST al API Gateway en la ruta URI /country-info
con una consulta subyacente por un código de país deberían ser convertidas y pasadas a la API GraphQL de países https://countries.trevorblades.com/graphql
.
Un ejemplo de comando curl que se vería algo así:
curl -i http://127.0.0.1:9080/country-info -X POST -d \
'{
"code": "EE"
}'
Y deberíamos obtener una respuesta de la API como sigue:
{
"data": {
"country": {
"code": "EE",
"capital": "Tallinn",
"currency": "EUR",
"languages": [
{
"name": "Estonian"
}
]
}
}
}
En las siguientes secciones, aprenderemos cómo lograr esto paso a paso.
Pongamos Apache APISIX en marcha
Antes de poder usar el plugin degrapghql, necesitarás instalar Apache APISIX. Puedes seguir las instrucciones de instalación en el sitio web de Apache APISIX para comenzar.
Prerrequisitos
- Docker se utiliza para instalar etcd y APISIX en contenedores.
- curl se utiliza para enviar solicitudes a APISIX para su validación. También puedes usar herramientas fáciles como Postman para interactuar con la API.
APISIX se puede instalar y arrancar fácilmente con el siguiente script de inicio rápido:
curl -sL https://run.api7.ai/apisix/quickstart | sh
Esto creará dos contenedores Docker: un etcd para almacenar la configuración y el propio APISIX Gateway. Una vez que veas el mensaje “✔ APISIX is ready!”, podemos configurar un upstream, un plugin y una ruta a través de la API de Administración de APISIX que proxy las solicitudes a la API GraphQL.
Crear un Upstream
A continuación, crearemos un objeto Upstream para registrar nuestra API GraphQL de Países en el API Gateway:
curl "http://127.0.0.1:9180/apisix/admin/upstreams/1" -X PUT -d '
{
"name": "GraphQL API upstream",
"desc": "Register Countries GraphQL API as the upstream",
"type": "roundrobin",
"scheme": "https",
"nodes": {
"countries.trevorblades.com": 1
}
}'
Crear una Configuración de Plugin
A continuación, configuraremos un nuevo objeto de configuración de plugin. Usaremos dos plugins de transformación: proxy-rewrite y degraphql para reescribir el host y la URI de la solicitud y hacer una consulta a la API GraphQL respectivamente.
curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 -X PUT -d '
{
"plugins":{
"proxy-rewrite":{
"uri":"/graphql",
"host":"countries.trevorblades.com"
},
"degraphql":{
"query":"query Country($code: ID!) {
country(code: $code) {
code
capital
currency
languages {
name
}
}
}",
"variables":[
"code"
]
}
}
}'
En la configuración anterior del plugin DeGraphQL, establecemos dos atributos como query
y variables
. Las variables de consulta GraphQL se pueden definir en el cuerpo de la solicitud POST o en las URIs en una llamada REST.
La consulta que estamos ejecutando, en este caso, se ve así y puedes reemplazarla con la tuya:
query ($code: ID!) {
country(code: $code) {
code
capital
currency
languages {
name
}
}
}
Crear una Ruta con el Plugin DeGraphQL
Este paso implica configurar una nueva ruta que use la configuración del plugin, y configurar la ruta para que funcione con el upstream (referenciando sus IDs) que creamos en los pasos anteriores:
curl -i http://127.0.0.1:9180/apisix/admin/routes/1 -X PUT -d '
{
"name":"GraphQL API route",
"desc":"Create a new route in APISIX for the Countries GraphQL API",
"uri":"/country-info",
"upstream_id":"1",
"plugin_config_id":1
}'
Probar la Activación del Plugin DeGraphQL
Ahora probemos esta nueva configuración con el siguiente comando curl.
curl -i http://127.0.0.1:9080/country-info -X POST -d \
'{
"code": "EE"
}'
Obtendremos una respuesta de APISIX:
{
"data": {
"country": {
"code": "EE",
"capital": "Tallinn",
"currency": "EUR",
"languages": [
{
"name": "Estonian"
}
]
}
}
}
La misma variable code
también se puede proporcionar como argumentos GET:
curl -i http://127.0.0.1:9080/country-info?code=EE
Transformación de Respuesta
Con la ayuda del plugin response-rewrite de Apisix, es posible transformar las respuestas GraphQL antes de que se devuelvan al cliente. Usemos este plugin para eliminar la clave y el valor de currency
de la respuesta JSON para mostrar solo todo lo demás. Para hacerlo, necesitamos agregar el plugin response-rewrite
a la configuración del plugin existente.
curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1 -X PATCH -d '
{
"plugins":{
"response-rewrite": {
"filters":[
{
"regex":"(?:\"currency\":\")(.*?)(?:\")",
"scope":"once",
"replace":""
}
],
"vars":[
[
"status",
"==",
200
]
]
}
}
}'
Después de instalar este plugin, puedes hacer una solicitud a /country-info
una vez más y ver la respuesta transformada:
{
"data": {
"country": {
"code": "EE",
"capital": "Tallinn",
"languages": [
{
"name": "Estonian"
}
]
}
}
}
Resumen
En general, el plugin DeGraphQL es una herramienta esencial para cualquier desarrollador que construya una API GraphQL con APISIX. Sus potentes características y su configuración fácil de usar hacen que sea muy sencillo integrarlo en tu API gateway existente, mientras que su soporte para funcionalidades específicas de GraphQL asegura que tu API sea performante, confiable y escalable.