C# Academy · Aula

Fundamentos de gRPC e Protobuf

Defina contratos de serviço em arquivos .proto, gere código C# com Grpc.Tools e entenda o transporte do gRPC.

Aula 1 de 413 etapas

Fundamentos de gRPC e Protobuf é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

O Que é gRPC?

gRPC é uma estrutura RPC de alto desempenho e independente de linguagem, desenvolvida pelo Google. Ela usa HTTP/2 como transporte e Protocol Buffers (Protobuf) como formato de serialização — muito mais rápido e compacto que JSON sobre HTTP/1.1.

Protocol Buffers: A IDL

Você define o contrato do serviço em um arquivo .proto. A IDL (Linguagem de Definição de Interface) do Protobuf é fortemente tipada e independente de linguagem — o mesmo arquivo gera código de cliente e servidor em C#, Go, Python etc.

// greet.proto
syntax = "proto3";

option csharp_namespace = "GrpcService";

package greet;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Configurando um Servidor gRPC no .NET

Crie um projeto gRPC com dotnet new grpc. Adicione arquivos .proto ao projeto, e Grpc.Tools gerará as classes C# automaticamente no momento da compilação.

// .csproj snippet
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>

// Program.cs
builder.Services.AddGrpc();

var app = builder.Build();
app.MapGrpcService<GreeterService>();
app.Run();

Implementando um Serviço gRPC

Herde da classe base gerada e substitua o método RPC. A estrutura gerencia automaticamente a serialização, o enquadramento HTTP/2 e o roteamento.

using Grpc.Core;
using GrpcService;

public class GreeterService : Greeter.GreeterBase
{
    private readonly ILogger<GreeterService> _logger;
    public GreeterService(ILogger<GreeterService> logger) => _logger = logger;

    public override Task<HelloReply> SayHello(
        HelloRequest request,
        ServerCallContext context)
    {
        _logger.LogInformation("Saying hello to {Name}", request.Name);
        return Task.FromResult(new HelloReply
        {
            Message = $"Hello, {request.Name}!"
        });
    }
}

Criando um Cliente gRPC

O compilador Protobuf também gera uma classe de cliente fortemente tipada. Use GrpcChannel para se conectar e chamar o serviço como se fosse um método local.

// Client project: add Grpc.Net.Client package
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);

var reply = await client.SayHelloAsync(
    new HelloRequest { Name = "Alice" });

Console.WriteLine(reply.Message); // Hello, Alice!

Tipos do Protobuf e Números de Campos

Cada campo em uma mensagem Protobuf tem um número de campo exclusivo (1–536870911). Os números de campo são codificados no formato binário — nunca os altere depois da implantação, ou você quebrará a compatibilidade com versões anteriores.

message Product {
  int32  id          = 1;
  string name        = 2;
  double price       = 3;
  int32  stock       = 4;
  bool   is_active   = 5;
  repeated string tags = 6; // array
}

// Supported scalar types:
// int32, int64, uint32, uint64, float, double
// bool, string, bytes, enum

Enumerações e Mensagens Aninhadas

O Protobuf oferece suporte a enumerações e tipos de mensagem aninhados. Use-os para modelar objetos de domínio complexos no contrato do serviço.

enum OrderStatus {
  ORDER_STATUS_UNSPECIFIED = 0;
  ORDER_STATUS_PENDING     = 1;
  ORDER_STATUS_SHIPPED     = 2;
  ORDER_STATUS_CANCELLED   = 3;
}

message Order {
  int32       id       = 1;
  OrderStatus status   = 2;
  repeated OrderLine lines = 3;
}

message OrderLine {
  int32  product_id = 1;
  int32  quantity   = 2;
  double price      = 3;
}

HTTP/2 e Transporte gRPC

O gRPC usa HTTP/2, que oferece multiplexação — várias chamadas RPC simultâneas em uma única conexão TCP — reduzindo a latência e a sobrecarga de conexão em comparação com o HTTP/1.1.

// gRPC requires HTTP/2
// For local dev with HTTP (not HTTPS), enable HTTP/2 cleartext:
builder.WebHost.ConfigureKestrel(opt =>
    opt.ListenLocalhost(5000, o => o.Protocols = HttpProtocols.Http2));

// Client for cleartext (dev only)
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
using var channel = GrpcChannel.ForAddress("http://localhost:5000");

Tratamento de Erros com StatusCode

O gRPC usa seus próprios códigos de status, diferentes dos códigos HTTP. Lance RpcException com um Status para enviar respostas de erro tipadas aos clientes.

public override Task<ProductReply> GetProduct(
    ProductRequest request,
    ServerCallContext context)
{
    var product = _repo.FindById(request.Id);
    if (product is null)
        throw new RpcException(
            new Status(StatusCode.NotFound, $"Product {request.Id} not found"));

    return Task.FromResult(MapToReply(product));
}

Reflexão do gRPC para Desenvolvimento

Ative a reflexão do gRPC para que ferramentas como grpcurl e Postman possam descobrir seus serviços sem acessar diretamente o arquivo .proto.

// dotnet add package Grpc.AspNetCore.Server.Reflection

builder.Services.AddGrpcReflection();

if (app.Environment.IsDevelopment())
    app.MapGrpcReflectionService();

// Now use grpcurl:
// grpcurl -plaintext localhost:5000 list
// grpcurl -plaintext localhost:5000 greet.Greeter/SayHello

Mundo Real: Consulta de Produto por Microsserviço

Um serviço de produto que expõe um ponto de acesso gRPC usado internamente por um serviço de pedidos — um padrão clássico de comunicação entre serviços.

// product.proto
service ProductService {
  rpc GetProduct (GetProductRequest) returns (ProductResponse);
  rpc ListProducts (ListProductsRequest) returns (ListProductsResponse);
}

// Order service calls it:
public class OrderService
{
    private readonly ProductService.ProductServiceClient _products;
    public OrderService(ProductService.ProductServiceClient p) => _products = p;

    public async Task<Order> PlaceOrderAsync(int productId, int qty)
    {
        var product = await _products.GetProductAsync(
            new GetProductRequest { Id = productId });
        return new Order { ProductName = product.Name, Quantity = qty };
    }
}

Verificação Rápida

Por que você nunca deve alterar um número de campo Protobuf existente após a implantação?

Resumo: Fundamentos de gRPC e Protobuf

Principais conclusões:

  • O gRPC usa HTTP/2 + Protobuf para comunicação rápida e fortemente tipada entre serviços
  • Defina contratos de serviço em arquivos .proto — o código é gerado no momento da compilação
  • Os números de campo representam a codificação no protocolo — nunca os altere nem reutilize
  • Herde da classe base gerada e substitua os métodos RPC
  • Use RpcException com StatusCode para obter respostas de erro tipadas
  • Ative a reflexão do gRPC para oferecer suporte a ferramentas durante o desenvolvimento
Grátis para começar

Aprenda C# com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
93
Aulas
346

Perguntas Frequentes

A aula “Fundamentos de gRPC e Protobuf” é grátis?

Sim — o texto completo de “Fundamentos de gRPC e Protobuf” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Fundamentos de gRPC e Protobuf”?

Defina contratos de serviço em arquivos .proto, gere código C# com Grpc.Tools e entenda o transporte do gRPC. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “Fundamentos de gRPC e Protobuf”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Fundamentos de gRPC e Protobuf
  2. RPCs unários e transmissão pelo servidor
  3. Transmissão pelo cliente e bidirecional
  4. Prazos, cancelamento e interceptadores
← Voltar para C# Academy