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-Web
se 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
.proto
em 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