Creditos de la imagen: https://dapr.io/

Como es habitual: los antencedentes

Aproximadamente 1 año hace que publiqué una Trilogía de Modernización de Microservicios, que suman más de 150 páginas para tu autoformación y si sumas la del Proyecto Tye casi nos acercamos a las 200 páginas (en GitHub los correspondientes ejemplos):

Donde hablaba desde Dapr hasta el proyecto Tye. Incluso una charla pude dar de Introducción al Project Tye.

Las cosas parece que tienen recurrencia y hace poco he vuelto a un proyecto donde se hace uso de Dapr, y esta es la razón del artículo.

Si quieres rizar el rizo, tambien recomiendo que leas mi libro de Monitorización moderna de aplicaciones.

Así tendrás una nada despreciable cantidad de 300 páginas para leer en estas vacaciones.

Problema

Queremos tener cuidado con nuestra api ante un posible problema de ataque de DoS o DDoS.

Solución

Una posible solución es usar un Rate Limit.

Planteamiento

Supongamos que no tenemos Azure API Management o un Rate Limit desarrollado en nuestra aplicación y necesitamos algo para ya, que nos permita boquear las llamadas a nuestro API a 1 por segundo por poner un ejemplo.

Si tenemos que optar por soluciones tradicionales o en Azure, el tiempo que tardamos en poner esto no son 15 minutos, pero con Dapr son excasamente 5 minutos, lo que tardes en leer este artículo.

¿Qué es un Middleware de Dapr?

O grosso modo es una pieza que se coloca entre los sidecards que nos permite realizar acciones en forma de caja negra.

Ejemplo

En este repositorio de GitHub: https://github.com/jmfloreszazo/DaprMiddlewareRateLimitWithNet6

He creado una minimal API del tiempo en un proyecto standar.

Y como novedad he añadido 2 ficheros nuevos un componente que es el middleware y una configuración para que use el middleware:

LLamada de apitwo a apione

Ahora lo que hacemos es arrancar el proyecto con este comando (esta en el readme):

dapr run --app-id apione --config config.yaml --components-path ./components --app-port 5000 
--dapr-http-port 3500 -- dotnet run --project apione/apione.csproj

Podrás ver que se arranca el middleware:

LLamada de apitwo a apione

Una vez cargado este API, podrás hacer un test de tu API y usamos JMeter. Lanzaremos muchas llamadas a ese enpoint.

Para ello solo tienes que importar el fichero de asserts que tiene el ejemplo y quizá tendrás que modificar el puerto.

Contenedores de Dapr y APIS

Y como no podré tumbar la API lo que he realizado es un pequeño ejemplo con muchas llamadas para que se pueda observar que usando el middleware y sin usarlo, se ven tiempo de respuesta diferentes ya que lo que estamos haciendo es que pueda procesar x request por segundo.

Con esta comparativa podrás ver la diferencia:

Minimal API de apitwo

Y como podeis observar, ya hemos metido un Rate Limit con un fichero de componente en menos de 5 minutos.