Visão geral do gRPC no .NET

Por James Newton-King

O gRPC é uma estrutura de RPC (Chamada de Procedimento Remoto) de linguagem independente de alto desempenho.

Os principais benefícios de gRPC são:

  • Estrutura de RPC leve, moderna e de alto desempenho.
  • Desenvolvimento da API de primeiro contrato, usando buffers de protocolo, por padrão, permitindo implementações independente de linguagem.
  • As ferramentas disponíveis para várias linguagens gerarem clientes e servidores fortemente tipados.
  • Dá suporte ao cliente, servidor e chamadas bi-direcionais de streaming.
  • Uso de rede reduzida com a serialização binária Protobuf.

Esses benefícios tornam o gRPC ideal para:

  • Microsserviços leves em que a eficiência é crítica.
  • Sistemas poliglotas nos quais múltiplas linguagens são necessárias para o desenvolvimento.
  • Serviços ponto a ponto em tempo real que precisam lidar com solicitações ou respostas de streaming.

Suporte para ferramentas de C# para arquivos .proto

O gRPC usa uma abordagem de contrato primeiro para o desenvolvimento de API. Serviços e mensagens são definidos em arquivos .proto:

syntax = "proto3";

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

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Os tipos .NET para serviços, clientes e mensagens são gerados automaticamente, incluindo arquivos .proto em um projeto:

  • Adicione uma referência de pacote ao pacote Grpc.Tools.
  • Adicione arquivos .proto ao grupo de itens <Protobuf>.
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

Para obter mais informações sobre o suporte para ferramentas gRPC, consulte Serviços do gRPC com C#.

Serviços do gRPC com o ASP.NET Core

Os serviços gRPC podem ser hospedados no ASP.NET Core. Os serviços têm integração completa com recursos do ASP.NET Core como registro em log, DI (injeção de dependência), autenticação e autorização.

Adicionar serviços gRPC a um aplicativo ASP.NET Core

O gRPC requer o pacote Grpc.AspNetCore. Para obter informações sobre como configurar o gRPC em um aplicativo .NET, consulte Configurar o gRPC.

O modelo de projeto do serviço gRPC

O modelo de projeto do Serviço gRPC do ASP.NET Core fornece um serviço inicial:

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 herda do tipo GreeterBase, que é gerado do serviço Greeter no arquivo .proto. O serviço é acessível aos clientes em Program.cs:

app.MapGrpcService<GreeterService>();

Para saber mais sobre os serviços gRPC no ASP.NET Core, consulte Serviços gRPC com o ASP.NET Core.

Chamar os serviços do gRPC com um cliente .NET

Os clientes gRPC são tipos de cliente concretos gerados a partir de arquivos .proto. O cliente gRPC concreto tem métodos que se traduzem para o serviço gRPC no arquivo .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);

Um cliente gRPC é criado usando um canal, que representa uma conexão de longa duração com um serviço gRPC. Um canal pode ser criado usando GrpcChannel.ForAddress.

Para obter mais informações sobre como criar clientes e chamar diferentes métodos de serviço, consulte Chamar serviços gRPC com o cliente .NET.

Recursos adicionais

O gRPC é uma estrutura de RPC (Chamada de Procedimento Remoto) de linguagem independente de alto desempenho.

Os principais benefícios de gRPC são:

  • Estrutura de RPC leve, moderna e de alto desempenho.
  • Desenvolvimento da API de primeiro contrato, usando buffers de protocolo, por padrão, permitindo implementações independente de linguagem.
  • As ferramentas disponíveis para várias linguagens gerarem clientes e servidores fortemente tipados.
  • Dá suporte ao cliente, servidor e chamadas bi-direcionais de streaming.
  • Uso de rede reduzida com a serialização binária Protobuf.

Esses benefícios tornam o gRPC ideal para:

  • Microsserviços leves em que a eficiência é crítica.
  • Sistemas poliglotas nos quais múltiplas linguagens são necessárias para o desenvolvimento.
  • Serviços ponto a ponto em tempo real que precisam lidar com solicitações ou respostas de streaming.

Suporte para ferramentas de C# para arquivos .proto

O gRPC usa uma abordagem de contrato primeiro para o desenvolvimento de API. Serviços e mensagens são definidos em arquivos .proto:

syntax = "proto3";

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

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Os tipos .NET para serviços, clientes e mensagens são gerados automaticamente, incluindo arquivos .proto em um projeto:

  • Adicione uma referência de pacote ao pacote Grpc.Tools.
  • Adicione arquivos .proto ao grupo de itens <Protobuf>.
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

Para obter mais informações sobre o suporte para ferramentas gRPC, consulte Serviços do gRPC com C#.

Serviços do gRPC com o ASP.NET Core

Os serviços gRPC podem ser hospedados no ASP.NET Core. Os serviços têm integração completa com recursos do ASP.NET Core como registro em log, DI (injeção de dependência), autenticação e autorização.

Adicionar serviços gRPC a um aplicativo ASP.NET Core

O gRPC requer o pacote Grpc.AspNetCore. Para obter informações sobre como configurar o gRPC em um aplicativo .NET, consulte Configurar o gRPC.

O modelo de projeto do serviço gRPC

O modelo de projeto do serviço gRPC fornece um serviço inicial:

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 herda do tipo GreeterBase, que é gerado do serviço Greeter no arquivo .proto. O serviço é acessível aos clientes em Startup.cs:

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

Para saber mais sobre os serviços gRPC no ASP.NET Core, consulte Serviços gRPC com o ASP.NET Core.

Chamar os serviços do gRPC com um cliente .NET

Os clientes gRPC são tipos de cliente concretos gerados a partir de arquivos .proto. O cliente gRPC concreto tem métodos que se traduzem para o serviço gRPC no arquivo .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);

Um cliente gRPC é criado usando um canal, que representa uma conexão de longa duração com um serviço gRPC. Um canal pode ser criado usando GrpcChannel.ForAddress.

Para obter mais informações sobre como criar clientes e chamar diferentes métodos de serviço, consulte Chamar serviços gRPC com o cliente .NET.

Recursos adicionais