Общие сведения о gRPC на .NET

Автор: Джеймс Ньютон-Кинг (James Newton-King)

gRPC — это не зависящая от языка высокопроизводительная платформа удаленного вызова процедур (RPC).

Ниже приведены основные преимущества gRPC.

  • Современная высокопроизводительная упрощенная платформа RPC.
  • Разработка API по модели "сначала контракт" с использованием механизма Protocol Buffers по умолчанию, что позволяет выпускать не зависящие от языка реализации.
  • Доступные для многих языков инструменты, предназначенные для создания строго типизированных серверов и клиентов.
  • Поддержка клиентских, серверных и двунаправленных потоковых вызовов.
  • Снижение уровня использования сети за счет двоичной сериализации Protobuf.

Благодаря этим преимуществам gRPC идеально подходит для:

  • упрощенных микрослужб, где важна эффективность;
  • многоязычных систем, где для разработки требуется несколько языков;
  • работающих в режиме реального времени служб типа "точка-точка", которые должны обрабатывать запросы и ответы потоковой передачи данных.

Средства C# для работы с файлами .proto

Для разработки API в gRPC используется подход, при котором сначала создается контракт. Службы и сообщения определяются в файлах .proto:

syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Типы .NET для служб, клиентов и сообщений создаются автоматически путем добавления файлов .proto в проект:

  • Добавьте ссылку на пакет Grpc.Tools.
  • Добавьте файлы .proto в группу элементов <Protobuf>.
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

Дополнительные сведения о поддержке средств gRPC см. в статье Службы gRPC на языке C#.

Службы gRPC на платформе ASP.NET Core

Службы gRPC можно размещать на платформе ASP.NET Core. Службы поддерживают полную интеграцию с функциями ASP.NET Core, такими как ведение журнала, внедрение зависимостей (DI), проверка подлинности и авторизация.

Добавление служб gRPC в приложение ASP.NET Core

Для gRPC требуется пакет Grpc.AspNetCore. Сведения о настройке gRPC в приложении .NET см. в разделе Настройка gRPC.

Шаблон проекта службы gRPC

В шаблоне проекта службы gRPC ASP.NET Core предоставляется базовая служба:

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

GreeterService является производным от типа GreeterBase, который создается из службы Greeter в файле .proto. Служба доступна клиентам в Program.csследующих службах:

app.MapGrpcService<GreeterService>();

Дополнительные сведения о службах gRPC на ASP.NET Core см. в статье Службы gRPC в ASP.NET Core.

Вызов служб gRPC с помощью клиента .NET

Клиенты gRPC — это конкретные типы клиентов, создаваемые в файлах .proto. Конкретный клиент gRPC использует методы, которые выполняют преобразование для служб gRPC в файле .proto.

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

var response = await client.SayHelloAsync(
    new HelloRequest { Name = "World" });

Console.WriteLine(response.Message);

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

Дополнительные сведения о создании клиентов и вызове различных методов службы см. в статье Вызов служб gRPC с помощью клиента .NET.

Дополнительные ресурсы

gRPC — это не зависящая от языка высокопроизводительная платформа удаленного вызова процедур (RPC).

Ниже приведены основные преимущества gRPC.

  • Современная высокопроизводительная упрощенная платформа RPC.
  • Разработка API по модели "сначала контракт" с использованием механизма Protocol Buffers по умолчанию, что позволяет выпускать не зависящие от языка реализации.
  • Доступные для многих языков инструменты, предназначенные для создания строго типизированных серверов и клиентов.
  • Поддержка клиентских, серверных и двунаправленных потоковых вызовов.
  • Снижение уровня использования сети за счет двоичной сериализации Protobuf.

Благодаря этим преимуществам gRPC идеально подходит для:

  • упрощенных микрослужб, где важна эффективность;
  • многоязычных систем, где для разработки требуется несколько языков;
  • работающих в режиме реального времени служб типа "точка-точка", которые должны обрабатывать запросы и ответы потоковой передачи данных.

Средства C# для работы с файлами .proto

Для разработки API в gRPC используется подход, при котором сначала создается контракт. Службы и сообщения определяются в файлах .proto:

syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Типы .NET для служб, клиентов и сообщений создаются автоматически путем добавления файлов .proto в проект:

  • Добавьте ссылку на пакет Grpc.Tools.
  • Добавьте файлы .proto в группу элементов <Protobuf>.
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

Дополнительные сведения о поддержке средств gRPC см. в статье Службы gRPC на языке C#.

Службы gRPC на платформе ASP.NET Core

Службы gRPC можно размещать на платформе ASP.NET Core. Службы поддерживают полную интеграцию с функциями ASP.NET Core, такими как ведение журнала, внедрение зависимостей (DI), проверка подлинности и авторизация.

Добавление служб gRPC в приложение ASP.NET Core

Для gRPC требуется пакет Grpc.AspNetCore. Сведения о настройке gRPC в приложении .NET см. в разделе Настройка gRPC.

Шаблон проекта службы gRPC

В шаблоне проекта gRPC предоставляется базовая служба:

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

GreeterService является производным от типа GreeterBase, который создается из службы Greeter в файле .proto. Служба доступна клиентам в Startup.csследующих службах:

app.UseEndpoints(endpoints =>
{
    endpoints.MapGrpcService<GreeterService>();
});

Дополнительные сведения о службах gRPC на ASP.NET Core см. в статье Службы gRPC в ASP.NET Core.

Вызов служб gRPC с помощью клиента .NET

Клиенты gRPC — это конкретные типы клиентов, создаваемые в файлах .proto. Конкретный клиент gRPC использует методы, которые выполняют преобразование для служб gRPC в файле .proto.

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

var response = await client.SayHelloAsync(
    new HelloRequest { Name = "World" });

Console.WriteLine(response.Message);

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

Дополнительные сведения о создании клиентов и вызове различных методов службы см. в статье Вызов служб gRPC с помощью клиента .NET.

Дополнительные ресурсы