0Pricing
C# Academy · Lección

Fundamentos de gRPC y Protobuf

Defina contratos de servicio en archivos .proto, genere código C# con Grpc.Tools y comprenda el transporte de gRPC.

Fundamentos de gRPC y Protobuf es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.

¿Qué es gRPC?

gRPC es un framework RPC de alto rendimiento e independiente del lenguaje, desarrollado por Google. Usa HTTP/2 como transporte y Protocol Buffers (Protobuf) como formato de serialización: es mucho más rápido y compacto que JSON sobre HTTP/1.1.

Protocol Buffers: el IDL

Defina el contrato de su servicio en un archivo .proto. El IDL de Protobuf (lenguaje de definición de interfaces) tiene tipado fuerte y es independiente del lenguaje: el mismo archivo genera código de cliente y servidor en 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;
}

Configuración de un servidor gRPC en .NET

Cree un proyecto gRPC con dotnet new grpc. Agregue archivos .proto al proyecto y Grpc.Tools generará automáticamente las clases de C# durante la compilación.

// .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();

Implementación de un servicio gRPC

Herede de la clase base generada y sobrescriba el método RPC. El framework gestiona automáticamente la serialización, el entramado HTTP/2 y el enrutamiento.

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}!"
        });
    }
}

Creación de un cliente gRPC

El compilador de Protobuf también genera una clase de cliente con tipado fuerte. Use GrpcChannel para conectarse y llamar al servicio como si fuera un 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 de Protobuf y números de campo

Cada campo de un mensaje de Protobuf tiene un número de campo único (1–536870911). Los números de campo se codifican en el formato binario: no los cambie nunca después de implementar el servicio, ya que rompería la compatibilidad con versiones 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

Enumeraciones y mensajes anidados

Protobuf admite enumeraciones y tipos de mensajes anidados. Úselos para modelar objetos de dominio complejos en el contrato de su servicio.

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 y transporte gRPC

gRPC usa HTTP/2, que admite multiplexación: varias llamadas RPC simultáneas en una única conexión TCP. Esto reduce la latencia y la sobrecarga de conexión en comparación con 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");

Gestión de errores con StatusCode

gRPC usa sus propios códigos de estado, diferentes de los de HTTP. Lance RpcException con un Status para enviar respuestas de error con tipos a los 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));
}

Reflexión de gRPC para desarrollo

Habilite la reflexión de gRPC para que herramientas como grpcurl y Postman puedan descubrir sus servicios sin acceder directamente al archivo .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

Caso real: consulta de productos en un microservicio

Un servicio de productos que expone un endpoint gRPC utilizado internamente por un servicio de pedidos: un patrón clásico de comunicación entre servicios.

// 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 };
    }
}

Comprobación rápida

¿Por qué no debe cambiar nunca un número de campo de Protobuf existente después de implementar el servicio?

Resumen: fundamentos de gRPC y Protobuf

Puntos clave:

  • gRPC usa HTTP/2 + Protobuf para una comunicación rápida y con tipado fuerte entre servicios
  • Defina los contratos de servicio en archivos .proto; el código se genera durante la compilación
  • Los números de campo forman parte de la codificación del protocolo: no los cambie ni los reutilice nunca
  • Herede de la clase base generada y sobrescriba los métodos RPC
  • Use RpcException con StatusCode para obtener respuestas de error con tipos
  • Habilite la reflexión de gRPC para permitir la compatibilidad con herramientas durante el desarrollo

Preguntas frecuentes

¿La lección «Fundamentos de gRPC y Protobuf» es gratis?

Sí — el texto completo de «Fundamentos de gRPC y Protobuf» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Fundamentos de gRPC y Protobuf»?

Defina contratos de servicio en archivos .proto, genere código C# con Grpc.Tools y comprenda el transporte de gRPC. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C# Academy?

No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Fundamentos de gRPC y Protobuf»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C# Academy?

Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Fundamentos de gRPC y Protobuf
  2. RPC unarios y streaming del servidor
  3. Streaming del cliente y bidireccional
  4. Plazos, cancelación e interceptores
← Volver a C# Academy