Introducción a los microservicios en C#
\nLa arquitectura de microservicios se ha convertido en el estándar de facto para construir aplicaciones complejas, escalables y tolerantes a fallos. A diferencia del monolito, donde todo el código está unificado en un solo proceso, los microservicios dividen el sistema en servicios pequeños e independientemente desplegables. La plataforma .NET (C#) proporciona todas las herramientas necesarias para crear microservicios profesionales: desde ASP.NET Core para API web hasta bibliotecas para trabajar con colas, contenerización y orquestación.
\nEn este artículo, recorreremos el camino completo desde el diseño de la arquitectura hasta la implementación práctica de un microservicio en C# con ejemplos de código.
\n\n1. Fundamentos de la arquitectura de microservicios
\nPrincipios y antipatrones
\nAntes de escribir código, es importante comprender los principios clave:
\n- \n
- Responsabilidad única (SRP): Cada servicio se encarga de una función de negocio (por ejemplo, servicio de pedidos, servicio de pagos). \n
- Bajo acoplamiento: Los servicios se comunican a través de la red (HTTP, gRPC, colas) y no conocen la implementación interna de los demás. \n
- Despliegue independiente: Puede actualizar un servicio sin detener los demás. \n
- Descentralización de datos: Cada servicio posee su propia base de datos (Database per Service). \n
Antipatrones que se deben evitar: servicios demasiado pequeños (nanoservices), base de datos compartida, cadenas de llamadas síncronas (chattiness).
\n\nComunicación entre servicios
\nPara la interacción de microservicios en C# se utilizan:
\n- \n
- Síncrona: REST API (HTTP/JSON) o gRPC (protocolo binario, más rápido). \n
- Asíncrona: Colas de mensajes (RabbitMQ, Azure Service Bus, Kafka) — método preferido para bajo acoplamiento. \n
2. Implementación práctica de un microservicio en C#
\nEjemplo: Servicio de gestión de pedidos
\nCrearemos un microservicio simple en ASP.NET Core 8. Usaremos Clean Architecture para separar las capas.
\n\nPaso 1: Proyecto y estructura
\ndotnet new webapi -n OrderService\ncd OrderService\nCrear carpetas: Controllers, Models, Services, Data.
Paso 2: Modelo de datos
\n// Models/Order.cs\npublic class Order\n{\n public int Id { get; set; }\n public string CustomerName { get; set; }\n public decimal TotalAmount { get; set; }\n public DateTime CreatedAt { get; set; }\n}\n\nPaso 3: Contexto de base de datos (Entity Framework Core)
\n// Data/OrderDbContext.cs\npublic class OrderDbContext : DbContext\n{\n public OrderDbContext(DbContextOptions<OrderDbContext> options) : base(options) { }\n public DbSet<Order> Orders { get; set; }\n}\n\nPaso 4: Capa de servicios
\n// Services/IOrderService.cs\npublic interface IOrderService\n{\n Task<Order> CreateOrderAsync(Order order);\n Task<List<Order>> GetAllOrdersAsync();\n}\n\n// Services/OrderService.cs\npublic class OrderService : IOrderService\n{\n private readonly OrderDbContext _context;\n public OrderService(OrderDbContext context)\n {\n _context = context;\n }\n\n public async Task<Order> CreateOrderAsync(Order order)\n {\n _context.Orders.Add(order);\n await _context.SaveChangesAsync();\n return order;\n }\n\n public async Task<List<Order>> GetAllOrdersAsync()\n {\n return await _context.Orders.ToListAsync();\n }\n}\n\nPaso 5: Controlador
\n// Controllers/OrdersController.cs\n[ApiController]\n[Route("api/[controller]")]\npublic class OrdersController : ControllerBase\n{\n private readonly IOrderService _orderService;\n public OrdersController(IOrderService orderService)\n {\n _orderService = orderService;\n }\n\