Introdução aos microsserviços em C#
\nA arquitetura de microsserviços tornou-se o padrão de facto para construir aplicações complexas, escaláveis e tolerantes a falhas. Ao contrário do monolito, onde todo o código é unificado em um único processo, os microsserviços dividem o sistema em serviços pequenos e implantados de forma independente. A plataforma .NET (C#) fornece todas as ferramentas necessárias para criar microsserviços profissionais: desde ASP.NET Core para APIs web até bibliotecas para trabalhar com filas, conteinerização e orquestração.
\nNeste artigo, abordaremos o caminho completo desde o design da arquitetura até a implementação prática de um microsserviço em C# com exemplos de código.
\n\n1. Fundamentos da arquitetura de microsserviços
\nPrincípios e antipadrões
\nAntes de escrever código, é importante entender os princípios-chave:
\n- \n
- Responsabilidade Única (SRP): Cada serviço é responsável por uma função de negócio (ex: serviço de pedidos, serviço de pagamento). \n
- Baixo acoplamento: Os serviços comunicam-se pela rede (HTTP, gRPC, filas) e não conhecem a estrutura interna uns dos outros. \n
- Implantação independente: Você pode atualizar um serviço sem parar os outros. \n
- Descentralização de dados: Cada serviço possui seu próprio banco de dados (Database per Service). \n
Antipadrões a evitar: serviços muito pequenos (nanoservices), banco de dados compartilhado, cadeias síncronas de chamadas (chattiness).
\n\nComunicação entre serviços
\nPara a interação de microsserviços em C#, são utilizados:
\n- \n
- Síncrona: REST API (HTTP/JSON) ou gRPC (protocolo binário, mais rápido). \n
- Assíncrona: Filas de mensagens (RabbitMQ, Azure Service Bus, Kafka) — método preferido para baixo acoplamento. \n
2. Implementação prática de um microsserviço em C#
\nExemplo: Serviço de gerenciamento de pedidos
\nVamos criar um microsserviço simples em ASP.NET Core 8. Usaremos Clean Architecture para separar as camadas.
\n\nPasso 1: Projeto e estrutura
\ndotnet new webapi -n OrderService\ncd OrderService\nCrie as pastas: Controllers, Models, Services, Data.
Passo 2: Modelo de dados
\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\nPasso 3: Contexto do banco de dados (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\nPasso 4: Camada de serviço
\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\nPasso 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\