Сервер и клиент в .NET: Grpc.AspNetCore, Grpc.Net.Client

↑ 5.2 gRPC · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Практическая часть: как поднять gRPC-сервис и вызывать его из другого сервиса.

Объяснение

Сервер

// Program.cs
builder.Services.AddGrpc(o => o.Interceptors.Add<ExceptionInterceptor>());
app.MapGrpcService<OrderGrpcService>();
 
public class OrderGrpcService(IOrderService orders) : OrderService.OrderServiceBase
{
    public override async Task<OrderReply> GetOrder(GetOrderRequest req, ServerCallContext ctx)
    {
        var order = await orders.FindAsync(Guid.Parse(req.Id), ctx.CancellationToken)
            ?? throw new RpcException(new Status(StatusCode.NotFound, "order not found"));
        return new OrderReply { Id = order.Id.ToString(), Customer = order.Customer };
    }
}

Клиент

builder.Services.AddGrpcClient<OrderService.OrderServiceClient>(o => o.Address = new Uri("https://orders:8443"))
    .AddStandardResilienceHandler();
 
public class Checkout(OrderService.OrderServiceClient client)
{
    public async Task<OrderReply> LoadAsync(string id, CancellationToken ct)
        => await client.GetOrderAsync(new GetOrderRequest { Id = id }, deadline: DateTime.UtcNow.AddSeconds(3), cancellationToken: ct);
}

AddGrpcClient использует HttpClientFactory: пул соединений и ретраи настраиваются так же. Внутри сети без TLS используйте h2c (Http2UnencryptedSupport).

Нюансы и подводные камни

  • Сервис gRPC создаётся на вызов (transient); состояние храните в DI, не в полях.
  • Исключения превращайте в RpcException с корректным StatusCode в interceptor.
  • Клиент должен передавать CancellationToken и deadline.
  • Kestrel: HTTP/2 требует TLS или явной настройки Http2 для порта.
  • Модели protobuf — не доменные: маппьте их на границе.

Практика

  1. Поднимите gRPC-сервис и клиент в двух проектах.
  2. Добавьте interceptor для логирования и преобразования исключений.
  3. Включите gRPC reflection и проверьте через grpcurl.

Вопросы с ответами

Связанные темы