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файлов (добавляется какProtobufitem в .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}");
}
Продвинутые возможности
- Аутентификация
Также в библиотеке
Работа с XML в C++: библиотеки pugixml, TinyXML-2 и RapidXML
Кэширование в Go (Golang): Redis, in-memory и другие решения
Валидация данных в Java: обзор инструментов и библиотек
Генерация PDF отчётов на Go (Golang): библиотеки и примеры