Contenido
Lo que no se cubre en esta guía
Aplicación de referencia basada en microservicios y contenedores: eShopOnContainers
Introducción a los Contenedores y a Docker
Comparando contenedores Docker con máquinas virtuales
Contenedores Docker, imágenes y registros
Escogiendo entre .NET Core y .NET Framework para contenedores Docker
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
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
Usando orquestadores de contenedores en Microsoft Azure
Usando el Azure Container Service
Microservicios sin estado (stateless) versus microservicios con estado (stateful)
Proceso de desarrollo de aplicaciones basadas en Docker
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
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
Probando servicios y aplicaciones web ASP.NET Core
Registrando hosted services en un Host o WebHost
Implementando IHostedService con un hosted service derivado de la clase BackgroundService
Manejando la Complejidad del Negocio con los patrones DDD y CQRS
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 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
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
Eventos de dominio versus eventos de integración
Implementando 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
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
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
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
Implementando controles de salud en servicios ASP.NET Core
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