Microsserviços em C# (.NET): arquitetura e prática

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Microsserviços em C# (.NET): da teoria à prática



No desenvolvimento moderno de software, a arquitetura de microsserviços tornou-se o padrão para construir sistemas escaláveis e tolerantes a falhas. A plataforma .NET fornece todas as ferramentas necessárias para criar microsserviços confiáveis em C#. Neste artigo, exploraremos os princípios-chave da arquitetura, exemplos práticos de código e melhores práticas que ajudarão você a começar a construir microsserviços em C#.



1. Fundamentos da arquitetura de microsserviços no .NET



Microsserviços são uma abordagem de desenvolvimento onde a aplicação é dividida em serviços pequenos e independentes, cada um responsável por sua própria função de negócio. No ecossistema .NET, utiliza-se o ASP.NET Core — um framework leve e multiplataforma.



Princípios-chave dos microsserviços em C#:

  • Independência de implantação — cada serviço pode ser atualizado sem interromper os outros.
  • Baixo acoplamento — os serviços se comunicam via API (REST, gRPC) ou filas de mensagens.
  • Banco de dados próprio — cada microsserviço possui seus próprios dados (Database per Service).
  • Tolerância a falhas — a falha de um serviço não deve bloquear todo o sistema.


Vamos começar criando um microsserviço simples em C#. Usaremos o template ASP.NET Core Web API.



// Criando um novo projeto de microsserviçodotnet new webapi -n OrderServicecd OrderService

// Exemplo de um controller simples[ApiController][Route("api/[controller]")]public class OrdersController : ControllerBase{ private readonly IOrderRepository _repository;

public OrdersController(IOrderRepository repository) { _repository = repository; }

[HttpGet("{id}")] public async Task<IActionResult> GetOrder(int id) { var order = await _repository.GetByIdAsync(id); if (order == null) return NotFound(); return Ok(order); }

[HttpPost] public async Task<IActionResult> CreateOrder(OrderDto orderDto) { var order = new Order(orderDto.CustomerId, orderDto.TotalAmount); await _repository.AddAsync(order); return CreatedAtAction(nameof(GetOrder), new { id = order.Id }, order); }}


2. Comunicação entre serviços: REST, gRPC e filas



Microsserviços precisam se comunicar entre si. No .NET, existem três abordagens principais:



REST API (HTTP)

A maneira mais simples e comum. Use HttpClient com factory para gerenciar conexões corretamente.



// Exemplo de chamada a outro microsserviço via HttpClientpublic class InventoryServiceClient{    private readonly HttpClient _httpClient;

public InventoryServiceClient(HttpClient httpClient) { _httpClient = httpClient; }

public async Task<bool> CheckStockAsync(int productId, int quantity) { var response = await _httpClient.GetAsync( $"/api/inventory/check?productId={productId}&quantity={quantity}"); return response.IsSuccessStatusCode; }}

// Registro em Program.csbuilder.Services.AddHttpClient<InventoryServiceClient>(client =>{ client.BaseAddress = new Uri("http://inventory-service:5001");});


gRPC

Para comunicação síncrona de alto desempenho, use gRPC. Ele é baseado em HTTP/2 e Protocol Buffers.



// Definição do serviço no arquivo .protosyntax = "proto3";

service OrderProcessor { rpc ProcessOrder (OrderRequest) returns (OrderResponse);}

message OrderRequest { int32 order_id = 1; string customer_email = 2;}

message OrderResponse { bool success = 1; string message = 2;}

// Parte do servidor em C#public class OrderProcessorService : OrderProcessor.OrderProcessorB

Blogs

Book Recommendations