Fondamentaux de gRPC et Protobuf
Définissez des contrats de services dans des fichiers .proto, générez du code C# avec Grpc.Tools et comprenez le transport gRPC.
Fondamentaux de gRPC et Protobuf est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.
Qu’est-ce que gRPC ?
gRPC est un framework RPC haute performance et indépendant du langage, développé par Google. Il utilise HTTP/2 pour le transport et Protocol Buffers (Protobuf) comme format de sérialisation, bien plus rapide et compact que JSON sur HTTP/1.1.
Protocol Buffers : l’IDL
Vous définissez le contrat de votre service dans un fichier .proto. L’IDL Protobuf (langage de définition d’interface) est fortement typée et indépendante du langage : le même fichier génère du code client et serveur 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;
}Configurer un serveur gRPC dans .NET
Créez un projet gRPC avec dotnet new grpc. Ajoutez des fichiers .proto au projet et Grpc.Tools génère automatiquement les classes C# au moment de la compilation.
// .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();Implémenter un service gRPC
Héritez de la classe de base générée et redéfinissez la méthode RPC. Le framework gère automatiquement la sérialisation, le découpage en trames HTTP/2 et le routage.
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}!"
});
}
}Créer un client gRPC
Le compilateur Protobuf génère également une classe cliente fortement typée. Utilisez GrpcChannel pour vous connecter et appeler le service comme s’il s’agissait d’une méthode 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!Types Protobuf et numéros de champs
Chaque champ d’un message Protobuf possède un numéro de champ unique (1–536870911). Les numéros de champs sont encodés dans le format binaire : ne les modifiez jamais après le déploiement, car vous romp riez la compatibilité ascendante.
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Énumérations et messages imbriqués
Protobuf prend en charge les énumérations et les types de messages imbriqués. Utilisez-les pour modéliser des objets métier complexes dans votre contrat de service.
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 et transport gRPC
gRPC utilise HTTP/2, qui prend en charge le multiplexage : plusieurs appels RPC simultanés sur une seule connexion TCP, ce qui réduit la latence et la surcharge des connexions par rapport à 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");Gestion des erreurs avec StatusCode
gRPC utilise ses propres codes d’état, différents de ceux d’HTTP. Lancez RpcException avec un Status pour envoyer des réponses d’erreur typées aux clients.
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));
}Réflexion gRPC pour le développement
Activez la réflexion gRPC afin que des outils comme grpcurl et Postman puissent découvrir vos services sans accéder directement au fichier .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/SayHelloCas réel : recherche de produits par microservice
Un service de produits exposant un point de terminaison gRPC utilisé en interne par un service de commandes : un modèle classique de communication interservices.
// 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 };
}
}Vérification rapide
Pourquoi ne devez-vous jamais modifier le numéro d’un champ Protobuf existant après le déploiement ?
Récapitulatif : principes fondamentaux de gRPC et Protobuf
Points clés :
- gRPC utilise HTTP/2 et Protobuf pour une communication interservices rapide et fortement typée
- Définissez les contrats de service dans des fichiers
.proto: le code est généré au moment de la compilation - Les numéros de champs constituent l’encodage sur le réseau : ne les modifiez ni ne les réutilisez jamais
- Héritez de la classe de base générée et redéfinissez les méthodes RPC
- Utilisez RpcException avec StatusCode pour obtenir des réponses d’erreur typées
- Activez la réflexion gRPC pour prendre en charge les outils pendant le développement
Apprends C# avec un tuteur IA — gratuit
Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.
- Cours
- 93
- Leçons
- 346
Questions Fréquemment Posées
La leçon « Fondamentaux de gRPC et Protobuf » est-elle gratuite ?
Oui — le texte complet de « Fondamentaux de gRPC et Protobuf » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Fondamentaux de gRPC et Protobuf » ?
Définissez des contrats de services dans des fichiers .proto, générez du code C# avec Grpc.Tools et comprenez le transport gRPC. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C# Academy ?
Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.
Combien de temps prend la leçon « Fondamentaux de gRPC et Protobuf » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?
Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Fondamentaux de gRPC et Protobuf
- RPC unaires et flux du serveur
- Flux du client et flux bidirectionnels
- Échéances, annulation et intercepteurs