Fondamenti di gRPC e Protobuf
Definisca i contratti dei servizi nei file .proto, generi codice C# con Grpc.Tools e comprenda il trasporto gRPC.
Fondamenti di gRPC e Protobuf è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.
Che cos'è gRPC?
gRPC è un framework RPC ad alte prestazioni e indipendente dal linguaggio, sviluppato da Google. Utilizza HTTP/2 per il trasporto e Protocol Buffers (Protobuf) come formato di serializzazione: è molto più veloce e compatto di JSON su HTTP/1.1.
Protocol Buffers: il linguaggio IDL
Definisca il contratto del servizio in un file .proto. L'IDL (Interface Definition Language) di Protobuf è fortemente tipizzato e indipendente dal linguaggio: lo stesso file genera il codice client/server in C#, Go, Python ecc.
// 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;
}Configurare un server gRPC in .NET
Crei un progetto gRPC con dotnet new grpc. Aggiunga i file .proto al progetto: Grpc.Tools genera automaticamente le classi C# durante la compilazione.
// .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();Implementare un servizio gRPC
Erediti dalla classe base generata e sovrascriva il metodo RPC. Il framework gestisce automaticamente la serializzazione, l'incapsulamento HTTP/2 e il routing.
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}!"
});
}
}Creare un client gRPC
Il compilatore Protobuf genera anche una classe client fortemente tipizzata. Utilizzi GrpcChannel per connettersi e chiamare il servizio come se fosse un metodo locale.
// 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!Tipi Protobuf e numeri di campo
Ogni campo di un messaggio Protobuf ha un numero di campo univoco (1–536870911). I numeri di campo sono codificati nel formato binario: non li modifichi mai dopo la distribuzione, altrimenti interromperebbe la compatibilità con le versioni precedenti.
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, enumEnum e messaggi annidati
Protobuf supporta enum e tipi di messaggio annidati. Li utilizzi per modellare oggetti di dominio complessi nel contratto del servizio.
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 trasporto gRPC
gRPC utilizza HTTP/2, che supporta il multiplexing: più chiamate RPC simultanee su una singola connessione TCP, riducendo latenza e sovraccarico delle connessioni rispetto a 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");Gestione degli errori con StatusCode
gRPC utilizza codici di stato propri, diversi da quelli HTTP. Generi una RpcException con un Status per inviare ai client risposte di errore tipizzate.
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));
}Reflection gRPC per lo sviluppo
Abiliti la reflection gRPC, così che strumenti come grpcurl e Postman possano individuare i servizi senza accedere direttamente al file .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/SayHelloEsempio reale: ricerca di prodotti tramite microservizi
Un servizio prodotti che espone un endpoint gRPC utilizzato internamente da un servizio ordini: un classico modello di comunicazione tra servizi.
// 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 rapida
Perché non dovrebbe mai modificare il numero di un campo Protobuf esistente dopo la distribuzione?
Riepilogo: fondamenti di gRPC e Protobuf
Punti chiave:
- gRPC utilizza HTTP/2 + Protobuf per una comunicazione tra servizi veloce e fortemente tipizzata
- Definisca i contratti dei servizi nei file
.proto: il codice viene generato durante la compilazione - I numeri di campo costituiscono la codifica sul filo: non li modifichi né li riutilizzi mai
- Erediti dalla classe base generata e sovrascriva i metodi RPC
- Utilizzi RpcException con StatusCode per risposte di errore tipizzate
- Abiliti la reflection gRPC per il supporto degli strumenti in fase di sviluppo
Domande Frequenti
La lezione «Fondamenti di gRPC e Protobuf» è gratuita?
Sì — il testo completo di «Fondamenti di gRPC e Protobuf» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.
Cosa imparerò in «Fondamenti di gRPC e Protobuf»?
Definisca i contratti dei servizi nei file .proto, generi codice C# con Grpc.Tools e comprenda il trasporto gRPC. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C# Academy?
Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Fondamenti di gRPC e Protobuf»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C# Academy?
Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Fondamenti di gRPC e Protobuf
- RPC unarie e streaming dal server
- Streaming dal client e bidirezionale
- Scadenze, annullamento e interceptor