0Pricing
C# Academy · Lekcja

Podstawy gRPC i Protobuf

Definiuj kontrakty usług w plikach .proto, generuj kod C# za pomocą Grpc.Tools i poznaj transport gRPC.

Podstawy gRPC i Protobuf to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Czym jest gRPC

gRPC to wysokowydajny, niezależny od języka framework RPC opracowany przez Google. Wykorzystuje HTTP/2 jako protokół transportowy oraz Protocol Buffers (Protobuf) jako format serializacji — jest znacznie szybszy i bardziej zwarty niż JSON przez HTTP/1.1.

Protocol Buffers: IDL

Kontrakt usługi definiuje się w pliku .proto. IDL Protobuf (Interface Definition Language) jest silnie typowany i niezależny od języka — ten sam plik generuje kod klienta i serwera w językach C#, Go, Python itd.

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

Konfigurowanie serwera gRPC w .NET

Należy utworzyć projekt gRPC za pomocą dotnet new grpc. Pliki .proto należy dodać do projektu, a Grpc.Tools automatycznie wygeneruje klasy C# podczas kompilacji.

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

Implementowanie usługi gRPC

Należy dziedziczyć po wygenerowanej klasie bazowej i przesłonić metodę RPC. Framework automatycznie obsługuje serializację, ramkowanie HTTP/2 i 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}!"
        });
    }
}

Tworzenie klienta gRPC

Kompilator Protobuf generuje również silnie typowaną klasę klienta. Należy użyć GrpcChannel, aby nawiązać połączenie i wywoływać usługę tak, jakby była lokalną metodą.

// 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!

Typy Protobuf i numery pól

Każde pole w komunikacie Protobuf ma unikatowy numer (1–536870911). Numery pól są kodowane w formacie binarnym — nie wolno ich zmieniać po wdrożeniu, ponieważ spowoduje to utratę zgodności wstecznej.

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

Wyliczenia i zagnieżdżone komunikaty

Protobuf obsługuje wyliczenia i zagnieżdżone typy komunikatów. Należy ich używać do modelowania złożonych obiektów domenowych w kontrakcie usługi.

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 i transport gRPC

gRPC wykorzystuje HTTP/2, który obsługuje multipleksowanie — wiele równoczesnych wywołań RPC w ramach jednego połączenia TCP — co zmniejsza opóźnienia i narzut związany z połączeniami w porównaniu z 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");

Obsługa błędów za pomocą StatusCode

gRPC używa własnych kodów statusu, innych niż HTTP. Należy zgłaszać RpcException z obiektem Status, aby wysyłać klientom typowane odpowiedzi błędów.

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

Refleksja gRPC na potrzeby programowania

Należy włączyć refleksję gRPC, aby narzędzia takie jak grpcurl i Postman mogły wykrywać usługi bez bezpośredniego dostępu do pliku .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

Praktyczny przykład: wyszukiwanie produktów w mikroserwisie

Usługa produktów udostępniająca endpoint gRPC używany wewnętrznie przez usługę zamówień — klasyczny wzorzec komunikacji między usługami.

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

Szybkie sprawdzenie

Dlaczego po wdrożeniu nie wolno nigdy zmieniać istniejącego numeru pola Protobuf?

Podsumowanie: podstawy gRPC i Protobuf

Najważniejsze informacje:

  • gRPC wykorzystuje HTTP/2 + Protobuf do szybkiej, silnie typowanej komunikacji między usługami
  • Kontrakty usług definiuje się w plikach .proto, a kod jest generowany podczas kompilacji
  • Numery pól określają kodowanie binarne — nie wolno ich zmieniać ani ponownie używać
  • Należy dziedziczyć po wygenerowanej klasie bazowej i przesłaniać metody RPC
  • Należy używać RpcException z StatusCode do wysyłania typowanych odpowiedzi błędów
  • Refleksję gRPC należy włączać na potrzeby obsługi narzędzi podczas programowania

Często zadawane pytania

Czy lekcja „Podstawy gRPC i Protobuf” jest bezpłatna?

Tak — pełny tekst „Podstawy gRPC i Protobuf” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Podstawy gRPC i Protobuf”?

Definiuj kontrakty usług w plikach .proto, generuj kod C# za pomocą Grpc.Tools i poznaj transport gRPC. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Podstawy gRPC i Protobuf”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy gRPC i Protobuf
  2. Jednoargumentowe i strumieniowane RPC po stronie serwera
  3. Strumieniowanie klienta i dwukierunkowe
  4. Limity czasu, anulowanie i interceptory
← Powrót do C# Academy