Contenido

Introducción

Acerca de esta guía

Versión

Lo que no se cubre en esta guía

Quién debería usar esta guía

Cómo debe usar esta guía

Aplicación de referencia basada en microservicios y contenedores: eShopOnContainers

Envíenos sus comentarios

Introducción a los Contenedores y a Docker

¿Qué es Docker?

Comparando contenedores Docker con máquinas virtuales

Terminología Docker

Contenedores Docker, imágenes y registros

Escogiendo entre .NET Core y .NET Framework para contenedores Docker

Orientación general

Cuándo usar .NET Core para contenedores Docker

Desarrollo y despliegue para múltiples plataformas

Utilizando contenedores para proyectos nuevos (“green-field”)

Creando y desplegando microservicios en contenedores

Despliegues de alta densidad en sistemas escalables

Cuando usar .NET Framework para contenedores Docker

Migrando aplicaciones existentes directamente en un contenedor Windows Server

Usando librerías .NET de terceros o paquetes NuGet que no estén disponibles en .NET Core

Usando tecnologías .NET no disponibles en .NET Core

Usando una plataforma o API que no soporta .NET Core

Tabla de decisiones: Cuál versión de .NET usar con Docker

A qué sistema operativo apuntar con contenedores .NET

Imágenes oficiales Docker para.NET

Optimizaciones de imágenes .NET Core y Docker para desarrollo versus producción

Definiendo la arquitectura de aplicaciones basadas en Contenedores y Microservicios

Visión

Principios de diseño de los contenedores

Contenerizando aplicaciones monolíticas

Desplegando una aplicación monolítica en un contenedor

Publicando una aplicación basada en un contenedor único a un Azure App Service

La data y el estado en las aplicaciones Docker

Arquitectura orientada a servicios

Arquitectura de microservicios

Soberanía de datos por microservicio

La relación entre los microservicios y el patrón Bounded Context

Arquitectura lógica versus arquitectura física

Retos y soluciones para la gestión de datos distribuidos

Identificar los límites del modelo de dominio para cada microservicio

Comunicación directa de cliente a microservicio frente al patrón API Gateway

Las comunicaciones en una arquitectura de microservicios

Creando, versionando y evolucionando APIs y contratos de microservicios

Direccionabilidad de los microservicios y el registro de servicios

Creando una interfaz de usuario compuesta basada en microservicios

Resiliencia alta disponibilidad en microservicios

Gestión del funcionamiento y diagnósticos en microservicios

Orquestando microservicios y aplicaciones multi-contenedores, para alta escalabilidad y disponibilidad

Usando orquestadores de contenedores en Microsoft Azure

Usando el Azure Container Service

Usando Azure Service Fabric

Microservicios sin estado (stateless) versus microservicios con estado (stateful)

Proceso de desarrollo de aplicaciones basadas en Docker

Visión

Entorno de desarrollo para aplicaciones Docker

Opciones de la herramienta de desarrollo: IDE o editor

Lenguajes y frameworks .NET para contenedores Docker

Flujo de trabajo para el desarrollo de aplicaciones Docker

Flujo de trabajo para el desarrollo de aplicaciones basadas en contenedores Docker

Flujo de trabajo simplificado para desarrollar contenedores con Visual Studio

Usando comandos PowerShell en un fichero Dockerfile para configurar Contenedores de Windows

Diseñando y Desarrollando Aplicaciones .NET Multi-Contenedor y Basadas en Microservicios

Visión

Diseñando una aplicación orientada a microservicios

Especificaciones de la aplicación

Contexto del equipo de desarrollo

Seleccionando una arquitectura

Beneficios de una solución basada en microservicios

Inconvenientes de una solución basada en microservicios

Arquitectura externa versus arquitectura interna y patrones de diseño

El nuevo mundo: múltiples patrones arquitectónicos y servicios políglotas

Creando un microservicio CRUD simple para datos

Diseñando un microservicio CRUD simple

Implementando un microservicio CRUD simple con ASP.NET Core

Generando metadata de descripción de Swagger para su API Web ASP.NET Core

Definiendo su aplicación multi-contenedor con docker-compose.yml

Usando una base de datos corriendo en un contenedor

Implementando comunicación entre microservicios basada en eventos (eventos de integración)

Usando brokers de mensajes y buses de servicios para sistemas de producción

Eventos de integración

El bus de eventos

Probando servicios y aplicaciones web ASP.NET Core

Implementando tareas en segundo plano en microservicios con IHostedService y la clase BackgroundService

Registrando hosted services en un Host o WebHost

La interfaz IHostedService

Implementando IHostedService con un hosted service derivado de la clase BackgroundService

Manejando la Complejidad del Negocio con los patrones DDD y CQRS

Visión

Aplicando patrones simplificados de CQRS y DDD en un microservicio

Aplicando los patrones CQRS y CQS en un microservicio DDD en eShopOnContainers

CQRS y los patrones DDD no son arquitecturas de alto nivel

Implementando consultas en un microservicio CQRS

Usando ViewModels hechos específicamente para las aplicaciones cliente, independientes de las restricciones del modelo de dominio

Usando Dapper como micro ORM para realizar las consultas

ViewModels dinámicos versus estáticos

Diseñando un microservicio orientado a DDD

Mantener los límites del contexto del microservicio relativamente pequeños

Las capas en los microservicios DDD

Diseñando un modelo de dominio como un microservicio

El patrón Entidad del Dominio

Implementando un microservicio del modelo de dominio con .NET Core

Estructura del modelo de dominio en una librería particular de .NET Standard Library

Estructurando los agregados en una librería personalizada de .NET Standard

Implementando entidades del dominio como clases POCO

Encapsulando data en las Entidades del Dominio

SeedWork (clases base e interfaces reutilizables para el modelo de dominio)

Contratos de repositorio (interfaces) en la capa del modelo de dominio

Implementando objetos de valor (value objects)

Usando clases de Enumeración en vez de los enums de C#

Diseñando las validaciones en la capa de dominio

Implementado validaciones en la capa del modelo de dominio

Validación en el lado del cliente (en las capas de presentación)

Eventos del dominio: diseño e implementación

¿Qué es un evento de dominio?

Eventos de dominio versus eventos de integración

Implementando eventos de dominio

Disparando eventos de dominio

Transacciones únicas entre agregados versus consistencia eventual entre agregados

El dispatcher de eventos de dominio: mapeando eventos a manejadores

Cómo suscribirse a eventos de dominio

Cómo manejar eventos de dominio

Conclusiones sobre los eventos de dominio

Diseñando la capa de infraestructura de persistencia

El patrón de Repositorio

El patrón de Especificación

Implementando la persistencia en la capa de infraestructura con Entity Framework Core

Introducción a Entity Framework Core

La infraestructura en Entity Framework Core desde la perspectiva DDD

Implementando repositorios personalizados con Entity Framework Core

El ciclo de vida del DbContext y la IUnitOfWork en el contenedor de IoC

El ciclo de vida de la instancia del repositorio en el contenedor IoC

Mapeo de tablas

Implementando el patrón de Especificación

Usando bases de datos NoSQL como infraestructura de persistencia

Introducción a Azure Cosmos DB la API nativa de Cosmos DB

Implementando código .NET apuntando a MongoDB y Azure Cosmos DB

Diseñando el microservicio de la capa de aplicación con API Web

Usando los principios SOLID y la Inyección de Dependencias

Implementando el microservicio de la capa de aplicación usando API Web

Usando Inyección de Dependencias para usar objetos de infraestructura en la capa de la aplicación

Implementando los patrones Comando y Manejador de Comandos

La línea de procesamiento de comandos: como activar un manejador de comandos

Implementando la línea de procesamiento de comandos con el patrón mediador (MediatR)

Atendiendo intereses transversales al procesar comandos con los Behaviors de MediatR

Implementando Aplicaciones Resilientes

Visión

Manejando fallas parciales

Estrategias para manejar fallas parciales

Implementando reintentos con retroceso exponencial

Implementando el patrón de Interruptor Automático

Usando la clase utilitaria ResilientHttpClient desde eShopOnContainers

Probando los reintentos en eShopOnContainers

Probando el Interruptor Automático en eShopOnContainers

Añadiendo una estrategia de fluctuación (jitter) a la política de reintento

Monitorización de la salud

Implementando controles de salud en servicios ASP.NET Core

Usando guardianes (watchdogs)

Controles de salud cuando se usan orquestadores

Monitorización avanzada: visualización, análisis y alertas

Securizando Aplicaciones Web y Microservicios .NET

Implementando la autenticación en aplicaciones web y microservicios .NET

Autenticando con ASP.NET Core Identity

Autenticando con proveedores externos

Autenticando con tokens del portador (bearer tokens)

Acerca de la autorización en aplicaciones web y microservicios .NET

Implementando autorización basada en roles

Implementando autorización basada en políticas

Guardando de forma segura los secretos de la aplicación durante el desarrollo

Guardando secretos en variables de entorno

Guardando secretos con el ASP.NET Core Secret Manager

Usando el Azure Key Vault para proteger los secretos en producción

Aprendizajes clave