gRPC для C# (.NET): библиотеки и примеры использования

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

gRPC для C# (.NET): библиотеки и примеры

gRPC — это высокопроизводительный фреймворк удалённого вызова процедур (RPC) от Google, основанный на HTTP/2 и Protocol Buffers (protobuf). В экосистеме .NET gRPC стал де-факто стандартом для общения микросервисов, обеспечивая строгую типизацию, двунаправленную потоковую передачу и низкую задержку. В этой статье мы рассмотрим ключевые библиотеки для работы с gRPC в C# и приведём практические примеры настройки сервера и клиента.

Основные библиотеки gRPC для .NET

Для работы с gRPC в .NET используются следующие пакеты из NuGet:

  • Grpc.AspNetCore — интеграция gRPC-сервера в ASP.NET Core (рекомендуется для хостинга).
  • Grpc.Net.Client — клиентская библиотека для .NET (включая .NET Core, .NET 5+).
  • Grpc.Tools — генератор кода из .proto файлов (добавляется как Protobuf item в .csproj).
  • Google.Protobuf — работа с protobuf-сообщениями.

Все эти пакеты поддерживаются Microsoft и активно развиваются. Установка производится через NuGet Package Manager или dotnet CLI:

dotnet add package Grpc.AspNetCore
dotnet add package Grpc.Net.Client
dotnet add package Google.Protobuf
dotnet add package Grpc.Tools

Создание gRPC-сервера на C#

Рассмотрим пошаговое создание простого сервиса для работы с заказами.

1. Определение proto-файла

Создайте файл order.proto в проекте сервера (например, 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. Настройка .csproj для генерации кода

Добавьте в .csproj файл:

<ItemGroup>
    <Protobuf Include="order.proto" GrpcServices="Server" />
</ItemGroup>

3. Реализация сервиса

Создайте класс, наследующий от сгенерированного базового класса:

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. Регистрация в 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();

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

Теперь создадим консольное приложение-клиент (GrpcClient).

1. Подготовка

Скопируйте order.proto в проект клиента и укажите в .csproj:

<Protobuf Include="order.proto" GrpcServices="Client" />

2. Код клиента

using Grpc.Net.Client;
using GrpcClient;

var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new OrderService.OrderServiceClient(channel);

// Простой RPC
var response = await client.GetOrderAsync(new OrderRequest { OrderId = 42 });
Console.WriteLine($"Order {response.OrderId}: {response.Status}, {response.Total:C}");

// Потоковый RPC
using var streamingCall = client.SubscribeOrders(new OrderRequest { OrderId = 100 });
await foreach (var update in streamingCall.ResponseStream.ReadAllAsync())
{
    Console.WriteLine($"Update: {update.Status}, Total: {update.Total:C}");
}

Продвинутые возможности

  • Аутентификация

Рекомендаций