Introdução ao gRPC no .NET CoreIntroduction to gRPC on .NET Core

Por John Luo e James Newton – KingBy John Luo and James Newton-King

gRPC é uma estrutura de RPC (chamada de procedimento remoto) de alto desempenho independente de linguagem.gRPC is a language agnostic, high-performance Remote Procedure Call (RPC) framework.

Os principais benefícios de gRPC são:The main benefits of gRPC are:

  • Estrutura de RPC leve, moderna e de alto desempenho.Modern, high-performance, lightweight RPC framework.
  • Desenvolvimento da API de primeiro contrato, usando buffers de protocolo, por padrão, permitindo implementações independente de linguagem.Contract-first API development, using Protocol Buffers by default, allowing for language agnostic implementations.
  • As ferramentas disponíveis para várias linguagens gerarem clientes e servidores fortemente tipados.Tooling available for many languages to generate strongly-typed servers and clients.
  • Dá suporte ao cliente, servidor e chamadas bi-direcionais de streaming.Supports client, server, and bi-directional streaming calls.
  • Uso de rede reduzida com a serialização binária Protobuf.Reduced network usage with Protobuf binary serialization.

Esses benefícios tornam o gRPC ideal para:These benefits make gRPC ideal for:

  • Microsserviços leves em que a eficiência é crítica.Lightweight microservices where efficiency is critical.
  • Sistemas poliglotas nos quais múltiplas linguagens são necessárias para o desenvolvimento.Polyglot systems where multiple languages are required for development.
  • Serviços ponto a ponto em tempo real que precisam lidar com solicitações ou respostas de streaming.Point-to-point real-time services that need to handle streaming requests or responses.

Aviso

No momento, não há suporte para o ASP.NET Core gRPC no serviço Azure app ou no IIS.ASP.NET Core gRPC is not currently supported on Azure App Service or IIS. A implementação de HTTP/2 de Http.Sys não dá suporte a cabeçalhos de barra de resposta HTTP com os quais o gRPC se baseia.The HTTP/2 implementation of Http.Sys does not support HTTP response trailing headers which gRPC relies on. Para obter mais informações, consulte este problema do GitHub.For more information, see this GitHub issue.

Suporte de ferramentas C# para arquivos. protoC# Tooling support for .proto files

o gRPC usa uma abordagem de primeiro contrato para o desenvolvimento de API.gRPC uses a contract-first approach to API development. Serviços e mensagens são definidos em arquivos * * . proto* :Services and messages are defined in *.proto files:

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 com a inclusão de arquivos * * . proto* em um projeto:.NET types for services, clients and messages are automatically generated by including *.proto files in a project:

  • Adicione uma referência de pacote ao pacote Grpc. Tools .Add a package reference to Grpc.Tools package.
  • Adicione arquivos * * . proto* ao <Protobuf> grupo de itens.Add *.proto files to the <Protobuf> item group.
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

Para obter mais informações sobre o suporte de ferramentas do gRPC, consulte Serviços do gRPC com C# .For more information on gRPC tooling support, see Serviços do gRPC com C#.

serviços gRPCs no ASP.NET CoregRPC services on ASP.NET Core

os serviços gRPCs podem ser hospedados em ASP.NET Core.gRPC services can be hosted on ASP.NET Core. Os serviços têm integração total com recursos populares de ASP.NET Core, como registro em log, injeção de dependência (DI), autenticação e autorização.Services have full integration with popular ASP.NET Core features such as logging, dependency injection (DI), authentication and authorization.

O modelo de projeto de serviço gRPC fornece um serviço inicial:The gRPC service project template provides a starter service:

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

GreeterServiceherda do GreeterBase tipo, que é gerado a partir do Greeter serviço no arquivo * * . proto* .GreeterService inherits from the GreeterBase type, which is generated from the Greeter service in the *.proto file. O serviço torna-se acessível para clientes no Startup.cs:The service is made accessible to clients in Startup.cs:

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

Para saber mais sobre os serviços gRPCs no ASP.NET Core, consulte Serviços do gRPC com o ASP.NET Core .To learn more about gRPC services on ASP.NET Core, see Serviços do gRPC com o ASP.NET Core.

Chamar serviços gRPCs com um cliente .NETCall gRPC services with a .NET client

Os clientes gRPC são tipos de cliente concretos que são gerados a partir de arquivos * * . proto* .gRPC clients are concrete client types that are generated from *.proto files. O cliente gRPC concreto tem métodos que se convertem para o serviço gRPC no arquivo * * . proto* .The concrete gRPC client has methods that translate to the gRPC service in the *.proto file.

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 vida longa para um serviço gRPC.A gRPC client is created using a channel, which represents a long-lived connection to a gRPC service. Um canal pode ser criado usando GrpcChannel.ForAddress .A channel can be created using GrpcChannel.ForAddress.

Para obter mais informações sobre a criação de clientes e a chamada de métodos de serviço diferentes, consulte Chamar os serviços gRPC com o cliente .NET .For more information on creating clients, and calling different service methods, see Chamar os serviços gRPC com o cliente .NET.

Recursos adicionaisAdditional resources