0Pricing
C# Academy · Урок

Основы gRPC и Protobuf

Определяйте контракты служб в .proto-файлах, генерируйте код C# с помощью Grpc.Tools и разбирайтесь в транспорте gRPC.

«Основы gRPC и Protobuf» — бесплатный урок C# Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Что такое gRPC?

gRPC — высокопроизводительная, языконезависимая платформа удалённого вызова процедур (RPC), разработанная Google. Для передачи данных она использует HTTP/2, а в качестве формата сериализации — Protocol Buffers (Protobuf); это гораздо быстрее и компактнее, чем JSON поверх HTTP/1.1.

Protocol Buffers: IDL

Контракт службы определяется в файле .proto. IDL Protobuf (язык определения интерфейсов) строго типизирован и не зависит от языка — один и тот же файл создаёт клиентский и серверный код на C#, Go, Python и других языках.

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

Настройка сервера gRPC в .NET

Создайте проект gRPC с помощью dotnet new grpc. Добавьте в проект файлы .proto, и Grpc.Tools автоматически создаст классы C# во время сборки.

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

Реализация службы gRPC

Унаследуйтесь от созданного базового класса и переопределите метод RPC. Платформа автоматически обрабатывает сериализацию, кадрирование HTTP/2 и маршрутизацию.

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

Создание клиента gRPC

Компилятор Protobuf также создаёт строго типизированный класс клиента. Используйте GrpcChannel, чтобы подключиться к службе и вызвать её так, будто это локальный метод.

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

Типы Protobuf и номера полей

У каждого поля сообщения Protobuf есть уникальный номер поля (1–536870911). Номера полей кодируются в двоичном формате — никогда не изменяйте их после развёртывания, иначе нарушится обратная совместимость.

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

Перечисления и вложенные сообщения

Protobuf поддерживает перечисления и вложенные типы сообщений. Используйте их для моделирования сложных объектов предметной области в контракте службы.

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 и транспорт gRPC

gRPC использует HTTP/2, который поддерживает мультиплексирование — несколько параллельных вызовов RPC через одно TCP-соединение. Это уменьшает задержку и накладные расходы на соединения по сравнению с 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");

Обработка ошибок с помощью StatusCode

gRPC использует собственные коды состояния, отличающиеся от HTTP. Выбросьте RpcException с Status, чтобы отправить клиентам типизированные ответы об ошибках.

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

Отражение gRPC для разработки

Включите отражение gRPC, чтобы такие инструменты, как grpcurl и Postman, могли обнаруживать ваши службы без прямого доступа к файлу .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

Практический пример: поиск товара в микрослужбе

Служба товаров предоставляет конечную точку gRPC, которая используется внутри службы заказов — классический пример взаимодействия между службами.

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

Быстрая проверка

Почему нельзя изменять существующий номер поля Protobuf после развёртывания?

Итоги: основы gRPC и Protobuf

Основные выводы:

  • gRPC использует HTTP/2 и Protobuf для быстрого, строго типизированного взаимодействия между службами
  • Определяйте контракты служб в файлах .proto — код создаётся во время сборки
  • Номера полей используются для кодирования в проводном формате — никогда не изменяйте и не переиспользуйте их
  • Наследуйтесь от созданного базового класса и переопределяйте методы RPC
  • Используйте RpcException с StatusCode для типизированных ответов об ошибках
  • Включайте отражение gRPC для поддержки инструментов во время разработки

Часто задаваемые вопросы

Урок «Основы gRPC и Protobuf» бесплатный?

Да — полный текст урока «Основы gRPC и Protobuf» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Основы gRPC и Protobuf»?

Определяйте контракты служб в .proto-файлах, генерируйте код C# с помощью Grpc.Tools и разбирайтесь в транспорте gRPC. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Основы gRPC и Protobuf»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы gRPC и Protobuf
  2. Унарные вызовы и потоковая передача от сервера
  3. Потоковая передача от клиента и двунаправленная передача
  4. Крайние сроки, отмена и перехватчики
← Назад к C# Academy