Distrib es un proyecto Open Source creado para mostrar el funcionamiento y uso de los sistemas distribuidos con las implementaciones en .NET Core.
La aplicación va a ser "vendor free" lo que quiere decir que no va a estar enlazada directamente a ningún proveedor específico. Obviamente vamos a utilizar X o Y servicio (ya que no vamos a reinventar la rueda), pero lo haremos a través de abstracciones.
Es importante saber estos conceptos ya que cada día las empresas están migrando sus aplicaciones monolíticas a microservicios o incluso serverless, y para poder aplicar un correcto funcionamiento, debemos aprender sobre sistemas distribuidos.
Vamos a ver un sistema distribuido con múltiples características, como pueden ser patrón consumer/publiser, sagas, service discovery, Eventual consistency, etc.
La arquitectura que vamos a ver es la siguiente:
- Nota: las etiquetas amarillas representan el código ya implementado.
Puedes encontrar el proceso de creación del sistema en mi curso de YouTube.
Alternativamente, si lo prefieres, puedes seguir los post con el código detallado y los razonamientos sobre por qué se ha elegido cada tecnología en mi web NetMentor - Cruso Distribt
Si estás siguiendo el curso vídeo a vídeo tienes diferentes branches en este repositorio con el código de cada vídeo (de forma incremental) aquí: https://github.com/ElectNewt/Distribt/branches/all
Hasta ahora hemos visto las siguientes funcionalidades:
- API Rest microservicios creados con .NET
- Patrón API Gateway con YARP.
- Producers/Consumers para la comunicación asíncrona implementado con RabbitMQ.
- Acceso y almacenamiento seuguro de la informción secreta con Vault.
- Registro de servicios con Consul (service discovery / Service registry).
- Sistema de logs con GrayLog y SeriLog.
- CQRS para separar lecturas de escrituras.
- Event Sourcing junto a MongoDb para almacenar los eventos.
- Eventual Consistency usando comunicación asíncrona para sincronizar los diferentes microservicios.
- Unificación de las API para tener una respuesta consistente con Rop.
- Patrón SAGA para las transacciones distribuidas.
- Health checks Para la visibilidad de la salud de nuestros microservicios.
- Observabilidad De nuestro sistema e infraestructura (metricas y traces) con OpenTelemetry, Prometheus, Grafana y Zipkin
- API Key Para las llamadas desde clientes.
- Rate Limiting Para limitar el uso de recursos.
- Aspire Para ejecución local de las applicaiones. nota, está solo en un branch ya que aspire sigue en preview.
Puedes encontrar documentación de cada projecto dentro de Shared
en la carpeta docs
.
Todo el contenido se encuentra en este mismo repositorio esto es así para una mayor facilidad a la hora de ver cómo funcionan las diferentes herramientas.
Puedes encontrar el código dentro de la carpeta src
. Donde encontrarás múltiples carpetas.
Nota: Técnicamente cada carpeta representa un dominio y puede ser su propio repositorio independiente, pero para una mayor facilidad del desarrollo y del seguimiento en los vídeos y posts está todo en un único repo.
- Api: capa de abstracción de una API Gateway.
- Services: Carpeta que contiene los microservicios del sistema.
- Shared: código común de las abstracciones.
Para ejecutar la aplicación correctamente debes tener Docker instalado en tu máquina y entender cómo funciona docker-compose.
He creado un fichero docker-compose.yaml
que ya contiene toda la configuración necesaria para que una vez ejecutes la solución, esta funcione sin problemas.
Eventualmente lo veremos toda la configuración en kubernetes (con project tye).
Para poder ejecutar la aplicación correctamente en local, necestiaras ejecutar tanto el fichero docker-compose
como la configuración para los diferentes servicios utilizados.
Para ahorrar tiempo he creado un fichero bash
que ejectua todo ./tools/local-development/up.sh
Y luego simplemente ejecuta cada aplicacion de forma individual o en un compound para poder testearlas.
Si te gusta el proyecto no dudes en darle una estrella, hacer un fork junto a una PR o incluso apoyar económicamente el proyecto donando un café.