Em arquiteturas modernas, especialmente com microserviços e comunicação entre sistemas distribuídos, o uso de APIs REST pode não ser o mais eficiente. É aí que entra o gRPC — um framework de RPC de alto desempenho e baixo consumo baseado em Protobuf, amplamente adotado por empresas como Google, Netflix e outros.
Neste artigo, vamos aprender como implementar gRPC com .NET 8, explorando desde conceitos até exemplos práticos e cases de uso reais.
🚀 O que é gRPC?
gRPC (Google Remote Procedure Call) é um framework de comunicação remota que utiliza o Protocol Buffers (Protobuf) como mecanismo de serialização. Ele oferece:
- Comunicação binária (mais rápida que JSON)
- Contrato fortemente tipado
- Suporte a comunicação bidirecional e streaming
- Compatibilidade com várias linguagens
🧰 Tecnologias Utilizadas
- .NET 8 (SDK)
- gRPC (via
Grpc.AspNetCore) - Protocol Buffers (v3)
- Docker (opcional)
- REST Gateway (opcional)
📦 Criando um Projeto gRPC com .NET 8
dotnet new grpc -n GrpcDemo cd GrpcDemo Estrutura criada:
GrpcDemo/ ├── Protos/greeter.proto ├── Services/GreeterService.cs ├── Program.cs └── Startup.cs (se for .NET 6-) ✍️ Exemplo de contrato .proto
syntax = "proto3"; option csharp_namespace = "GrpcDemo"; service ProductService { rpc GetProduct (ProductRequest) returns (ProductReply); } message ProductRequest { int32 id = 1; } message ProductReply { int32 id = 1; string name = 2; double price = 3; } 🔧 Implementação do Serviço
public class ProductService : ProductService.ProductServiceBase { public override Task<ProductReply> GetProduct(ProductRequest request, ServerCallContext context) { var product = new ProductReply { Id = request.Id, Name = "Produto Exemplo", Price = 99.90 }; return Task.FromResult(product); } } Registre no Program.cs:
app.MapGrpcService<ProductService>(); 🔗 Chamando gRPC via Client .NET
Crie um app console separado:
dotnet new console -n GrpcClientDemo cd GrpcClientDemo dotnet add package Grpc.Net.Client dotnet add package Google.Protobuf dotnet add package Grpc.Tools Edite o .csproj para incluir o .proto:
<ItemGroup> <Protobuf Include="../GrpcDemo/Protos/greeter.proto" GrpcServices="Client" /> </ItemGroup> Código do cliente:
using var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new ProductService.ProductServiceClient(channel); var reply = await client.GetProductAsync(new ProductRequest { Id = 1 }); Console.WriteLine($"Produto: {reply.Name}, Preço: R${reply.Price}"); 📡 Streaming com gRPC
Você também pode implementar:
-
Server streaming(ex: atualizações de status) -
Client streaming(ex: upload em partes) -
Bidirectional streaming(ex: chat)
Exemplo simples de server streaming:
rpc SubscribePrices (PriceRequest) returns (stream PriceReply); ✅ Vantagens do gRPC
| Característica | REST | gRPC |
|---|---|---|
| Performance | ⚠️ Alta latência | ✅ Alta performance |
| Tipagem | ❌ Fraca | ✅ Forte via Protobuf |
| Streaming | ❌ Difícil | ✅ Nativo |
| Ferramentas modernas | ✅ Sim | ✅ Sim |
| Compatibilidade com browser | ✅ Sim | ⚠️ Parcial (usa gRPC-Web) |
🔐 Segurança e Produção
- Ative TLS por padrão (
https) - Utilize
gRPC-Webse precisar de compatibilidade com front-end (ex: Blazor, Angular) - Faça versionamento via namespaces e pastas
.proto - Considere usar Envoy como proxy (se necessário)
🧪 Testes de gRPC
Você pode usar o BloomRPC ou grpcurl para testar seus serviços sem front-end.
🧠 Quando usar gRPC?
✅ Microserviços internos com alta performance
✅ Comunicação entre sistemas distribuídos
✅ Serviços móveis ou IoT com limitação de banda
❌ APIs públicas para consumo por browsers (recomenda-se REST)
📘 Boas práticas
- Separe contratos
.protoem um projeto compartilhado - Use
MapGrpcReflectionService()em ambientes de desenvolvimento - Registre interceptadores para logging, metrics e autenticação
- Combine com OpenTelemetry para rastreamento distribuído
🤝 Conecte-se Comigo
Tem usado gRPC ou deseja explorar mais sobre APIs performáticas no .NET moderno? Vamos conversar:
- 💻 Dev.to
- ✍️ Medium
- 📬 contato@dopme.io
Top comments (0)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.