Zum Inhalt springen

Comunicação Rápida e Tipada com gRPC no .NET

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:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert