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.
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, enumEnumeraçõ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/SayHelloMundo 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
RpcExceptioncomStatusCodepara obter respostas de erro tipadas - Ative a reflexão do gRPC para oferecer suporte a ferramentas durante o desenvolvimento
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
- Fundamentos de gRPC e Protobuf
- RPCs unários e transmissão pelo servidor
- Transmissão pelo cliente e bidirecional
- Prazos, cancelamento e interceptadores