Arquitectura de Microservicios con Kong API Gateway y Konga

Kong-API-Gateway

Kong-API-Gateway


En este nuevo artículo sobre Arquitectura de Microservicios con Kong Api Gateway y Konga nos vamos a centrar, en el funcionamiento y gestión de Kong haciendo uso de Konga como interfaz. Además mostraremos un ejemplo de funcionamiento con un servicio Mock securizado en Kong. Todos los pasos y herramientas necesarias serán mostradas en este tutorial.

¿Qué es un API Gateway?

Podríamos definir un API Gateway como una herramienta de gestión que actúa como un API entre el cliente y una serie de servicios que funcionan como backend.

Un API Gateway funciona con un proxy inverso que interceptará todas las llamadas que se le hagan, las redireccionará al servicio específicado y devolverá un resultado.

¿Por qué usar un API Gateway?

Cuando creas una arquitectura de microservicios, hay que tener en cuenta muchos factores, por ejemplo:

  • Querrás proteger tu infraestructura, a través de autenticación o autorización.
  • Poner tasas de acceso y limitar peticiones.
  • Monetizar tus API’s.
  • Sistemas de monitorización y analíticas
  • Añadir más servicios a tu arquitectura etc….

Los puntos de arriba son solo alguno de los casos a tener en cuenta en nuestra arquitectura, y obviamente queremos intentar hacer lo más sencilla posible nuestra arquitectura teniendo en cuenta que lo arriba comentado tendrá muchos servicios de backend. Es en estos momentos cuando entra en juego un API Gateway como una manera de desacoplar la arquitectura de backend a nuestro cliente. Un API Gateway podrá «romper» estas llamadas en múltiples llamadas y respuestas, manteniendo una trazabilidad, control y gestión de todas las peticiones.

¿Qué es Kong?

Kong es un API Gateway open source escrito en Lua. Se ha creado sobre Nginx, y expone un API Rest que puede ser usada para gestionar nuestra infraestructura de una manera dinámica.

Kong nos va a permitir securizar nuestra Arquitectura, siendo la primera barrera, delegando así la securización en Kong en lugar de bajarlo a los microservicios; obtener logs y métricas, tener un punto único para nuestras APIs etc….

Arquitectura de Kong

Uno de los puntos fuertes de Kong es la posibilidad de añadir nuevas funcionalidades gracias a la posibilidad de añadir plugins incluso si quieres podrás crear uno desde 0 programandolo en LUA.

Kong expone un API REST de manera que nos va a permitir gestionarlo, así como modificar servicios o añadir Plugins. Por lo que para poder realizar la administración de este API de una manera más sencilla podemos utilizar Konga, la cual nos proporciona una interfaz gráfica con la que podemos interactuar.

Ejemplo de Kong y Konga con un servicio Mock

Desplegar Kong y Konga con Docker

Vamos a mostrar como usar Kong y Konga con un servicio Mock, pero para ello el primer paso es levantar una instancia de cada uno. Para ello vamos a construir un docker-compose en el que tendremos una base de datos PostgreSql a la que kong se conectará y un servicio de Konga que interactuará con Kong.

version: '3'

services:

  kong-db:
    image: postgres:11-alpine
    volumes:
      - db-data-kong-postgres:/var/lib/postgresql/data
    networks:
      - kong-net
    ports:
      - "15432:5432"
    environment:
      POSTGRES_DB: postgres
      POSTGRES_USER: kong
      POSTGRES_PASSWORD: kong

  kong-migration:
    image: kong
    depends_on:
      - kong-db
    container_name: kong-migration
    networks:
      - kong-net
    restart: on-failure
    environment:
      - KONG_DATABASE=postgres
      - KONG_PG_HOST=kong-db
      - KONG_PG_DATABASE=kong
    command: kong migrations bootstrap
    
  kong:
    image: kong
    container_name: kong
    environment:
      - LC_CTYPE=en_US.UTF-8
      - LC_ALL=en_US.UTF-8
      - KONG_DATABASE=postgres
      - KONG_PG_HOST=kong-db
      - KONG_PG_USER=kong
      - KONG_PG_PASSWORD=kong
      - KONG_CASSANDRA_CONTACT_POINTS=kong-db
      - KONG_PROXY_ACCESS_LOG=/dev/stdout
      - KONG_ADMIN_ACCESS_LOG=/dev/stdout
      - KONG_PROXY_ERROR_LOG=/dev/stderr
      - KONG_ADMIN_ERROR_LOG=/dev/stderr
      - KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl
    restart: on-failure
    ports:
      - 8000:8000
      - 8443:8443
      - 8001:8001
      - 8444:8444
    links:
      - kong-db:kong-db
    networks:
      - kong-net
    depends_on:
      - kong-migration

  konga:
    image: pantsel/konga
    ports:
      - 1337:1337
    links:
      - kong:kong
    container_name: konga
    networks:
      - kong-net
    environment:
      - NODE_ENV=production

volumes:
  db-data-kong-postgres:

networks:
  kong-net:
    external: false

El fichero anterior es un docker-compose, en el que añadimos los servicios que vamos a necesitar para levantar kong y konga:

  • Kong-db: Una base de datos de tipo postgresql a la que kong se conectará para persistir la información.
  • kong-migration: Servicio de migración e inicialización de kong en la base de datos.
  • Kong: Inicialización del servicio de kong, en la base de datos específicada.
  • Konga: Interfaz de kong que se conecta por el puerto 1337.

Configuración de Kong a través de Konga

Una vez tenemos todos los servicios anteriores funcionando tenemos que configurar la comunicación de konga con Kong para ello vamos a la url:

http://localhost:1337

Y aparecerá una ventana en la que habrá que añadir un usuario admin.

Una vez nos hemos logado, tendremos que añadir la comunicación con kong, añadiendo http://kong:8001

Configuración de Kong
Configuración de Kong

Por lo que si ahora vamos a connection podremos ver que se encuentra conectado con Kong.

Conexiones de Kong y Konga | Arquitectura de Microservicios con Kong API Gateway y Konga
Conexiones de Kong

En el caso en el que no se encuentre activa la conexión habría que pulsar sobre activate.

Crear un Servicio y Rutas en Kong

A continuación vamos a crear un servicio y una ruta en kong haciendo uso de Mockbin, un servicio que genera endpoints HTTP y respuestas.

Para ello pulsamos sobre services y add new service:

Creación de un servicio en Kong y Konga | Arquitectura de Microservicios con Kong API Gateway y Konga
Creación de un Servicio

En el servicio tenemos que rellenar el host o url y puerto, además si queremos tener un path cuando se invoque el servicio. Una vez hemos rellenado el servicio hay que añadir las rutas. En este punto definiremos los verbos y si tendremos algún path.

En nuestro caso y a modo de ejemplo vamos a añadir el path /mock de manera que para acceder a este servicio a través de kong se hará con la url http://localhost:8000/mock.

Creación de una ruta con Kong  y Konga | Arquitectura de Microservicios con Kong API Gateway y Konga
Creación de una ruta con Kong
Creación de una ruta con Kong y Konga
Creación de una ruta con Kong
Creación de una ruta con Kong y Konga
Creación de una ruta con Kong

Una vez hemos terminado de definir la ruta ya podríamos acceder a través del endpoint http://localhost:8000/mock.

Hay que tener en cuenta que en la parte de rutas es en donde hemos creado los tipos de los verbos. GET, PUT, etc…

Securizando recursos en Kong

Como comentamos al principio, una de las funcionalidades de tener un API Gateway es la posibilidad de securizar nuestra infraestructura.

Kong através de sus plugins permite y facilita diferentes maneras para poder añadir seguridad a tu infraestructura, como por ejemplo añadir un plugin de OIDC y conectar kong con Keycloak. Pero para nuestro ejemplo vamos únicamente a añadir el plugin de authentication a nuestro servicio.Para ello vamos a nuestro servicio y en la pestaña de plugin pulsamos sobre add plugin.

Añadir plugin en Kong | Arquitectura de Microservicios con Kong API Gateway y Konga
Añadir plugin en Kong

Y añadimos el plugin de key auth con los valores por defecto. Si ahora hacemos la siguiente petición:

curl -i http://localhost:8000/mock

Obtendremos un 401.

Es normal obtener un Unauthorized, ya que no hemos configurado el API Key del plugin para nuestro servicio, por lo que vamos a configurarlo.

Por lo que lo siguiente que vamos a realizar es crear un consumer para obtener sus credenciales, para ello vamos a la sección de consumers y pulsamos en create consumer y añadimos un nombre.

Y después sobre credentials y create API KEY:

Crear API KEY en Konga
Crear API KEY en Konga

Si ahora ejecutamos la petición anterior ya debería funcionar:

curl -i -H "apikey:{{tu-api-key}}" http://localhost:8000/mock

Estas son algunas de las posibilidades que da Kong, puedes seguir investigando y mirando, por ejemplo con el plugin de OIDC, o añadiendo seguridad a grupos con el plugin ACL, para permitir que solo un grupo de consumidores ejecuten alguna operación etc…

Conclusión de Arquitectura de Microservicios con Kong API Gateway y Konga

En toda arquitectura de microservicios debería llevar como primer filtro un API Gateway. En esta entrada Arquitectura de Microservicios con Kong API Gateway y Konga, hemos podido ver las mejoras y funcionalidades de añadir un API Gateway.

Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com y te ayudaremos encantados!


No te olvides de seguirnos en nuestras redes sociales Facebook o Twitter para estar actualizado.


Deja una respuesta

Tu dirección de correo electrónico no será publicada.