Microservicios en C#: arquitectura y práctica de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a los microservicios en C#

\n

La 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.

\n

En 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\n

1. Fundamentos de la arquitectura de microservicios

\n

Principios y antipatrones

\n

Antes 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
\n

Antipatrones que se deben evitar: servicios demasiado pequeños (nanoservices), base de datos compartida, cadenas de llamadas síncronas (chattiness).

\n\n

Comunicación entre servicios

\n

Para 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
\n\n

2. Implementación práctica de un microservicio en C#

\n

Ejemplo: Servicio de gestión de pedidos

\n

Crearemos un microservicio simple en ASP.NET Core 8. Usaremos Clean Architecture para separar las capas.

\n\n

Paso 1: Proyecto y estructura

\n
dotnet new webapi -n OrderService\ncd OrderService
\n

Crear carpetas: Controllers, Models, Services, Data.

\n\n

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\n

Paso 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\n

Paso 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\n

Paso 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\                

Blogs

Book Recommendations