gRPC para C# (.NET): bibliotecas y ejemplos
gRPC es un framework de alto rendimiento para llamadas a procedimientos remotos (RPC) de Google, basado en HTTP/2 y Protocol Buffers (protobuf). En el ecosistema .NET, gRPC se ha convertido en el estándar de facto para la comunicación entre microservicios, proporcionando tipado estricto, transmisión bidireccional y baja latencia. En este artículo, revisaremos las bibliotecas clave para trabajar con gRPC en C# y presentaremos ejemplos prácticos de configuración del servidor y el cliente.
Bibliotecas principales de gRPC para .NET
Para trabajar con gRPC en .NET se utilizan los siguientes paquetes de NuGet:
- Grpc.AspNetCore — integración del servidor gRPC en ASP.NET Core (recomendado para alojamiento).
- Grpc.Net.Client — biblioteca cliente para .NET (incluye .NET Core, .NET 5+).
- Grpc.Tools — generador de código a partir de archivos
.proto(se agrega como elementoProtobufen .csproj). - Google.Protobuf — manejo de mensajes protobuf.
Todos estos paquetes son compatibles con Microsoft y están en desarrollo activo. La instalación se realiza a través del Administrador de paquetes NuGet o la CLI de dotnet:
dotnet add package Grpc.AspNetCoredotnet add package Grpc.Net.Clientdotnet add package Google.Protobufdotnet add package Grpc.ToolsCreación de un servidor gRPC en C#
Veamos la creación paso a paso de un servicio simple para gestionar pedidos.
1. Definición del archivo proto
Cree un archivo order.proto en el proyecto del servidor (por ejemplo, GrpcServer):
syntax = "proto3";
service OrderService { rpc GetOrder (OrderRequest) returns (OrderResponse); rpc SubscribeOrders (OrderRequest) returns (stream OrderResponse);}
message OrderRequest { int32 order_id = 1;}
message OrderResponse { int32 order_id = 1; string status = 2; double total = 3;}2. Configuración de .csproj para generación de código
Agregue al archivo .csproj:
<ItemGroup> <Protobuf Include="order.proto" GrpcServices="Server" /></ItemGroup>3. Implementación del servicio
Cree una clase que herede de la clase base generada:
public class OrderServiceImpl : OrderService.OrderServiceBase{ public override Task<OrderResponse> GetOrder(OrderRequest request, ServerCallContext context) { return Task.FromResult(new OrderResponse { OrderId = request.OrderId, Status = "Shipped", Total = 99.99 }); }
public override async Task SubscribeOrders(OrderRequest request, IServerStreamWriter<OrderResponse> responseStream, ServerCallContext context) { for (int i = 0; i < 5; i++) { await responseStream.WriteAsync(new OrderResponse { OrderId = request.OrderId, Status = $"Update #{i}", Total = 100 + i * 10 }); await Task.Delay(1000); } }}4. Registro en Program.cs
var builder = WebApplication.CreateBuilder(args);builder.Services.AddGrpc();
var app = builder.Build();app.MapGrpcService<OrderServiceImpl>();app.MapGet("/", () => "gRPC server is running");app.Run();Creación de un cliente gRPC en C#
Ahora crearemos una aplicación de consola cliente (GrpcClient).
1. Preparación
Copie el archivo order.proto en el proyecto del cliente e indíquelo en .csproj:
<Protobuf Include="order.proto" GrpcServices="Client" />2. Código del cliente
using Grpc.Net.Client;using GrpcClient;
var channel = GrpcChannel.ForAddress("https://localhost:5001");\