Introduzione a gRPC in .NET CoreIntroduction to gRPC on .NET Core

Di John Luo e James Newton-KingBy John Luo and James Newton-King

gRPC è un framework RPC indipendente dal linguaggio a elevate prestazioni.gRPC is a language agnostic, high-performance Remote Procedure Call (RPC) framework.

I principali vantaggi di gRPC sono:The main benefits of gRPC are:

  • Framework RPC moderno, ad alte prestazioni e leggero.Modern, high-performance, lightweight RPC framework.
  • Sviluppo di API con priorità al contratto usando i buffer del protocollo per impostazione predefinita e implementazioni indipendenti dal linguaggio.Contract-first API development, using Protocol Buffers by default, allowing for language agnostic implementations.
  • Strumenti disponibili per molte linguaggi consentono di generare client e server fortemente tipizzati.Tooling available for many languages to generate strongly-typed servers and clients.
  • Supporto per chiamate client, server e di streaming bidirezionale.Supports client, server, and bi-directional streaming calls.
  • Utilizzo di rete ridotto grazie alla serializzazione binaria Protobuf.Reduced network usage with Protobuf binary serialization.

Questi vantaggi rendono gRPC ideale per:These benefits make gRPC ideal for:

  • Microservizi leggeri in cui l'efficienza è fondamentale.Lightweight microservices where efficiency is critical.
  • Sistemi poliglotti che richiedono l'uso di più linguaggi per lo sviluppo.Polyglot systems where multiple languages are required for development.
  • Servizi in tempo reale da punto a punto che devono gestire richieste o risposte di streaming.Point-to-point real-time services that need to handle streaming requests or responses.

C#Supporto degli strumenti per i file. protoC# Tooling support for .proto files

gRPC usa un approccio basato sul contratto per lo sviluppo di API.gRPC uses a contract-first approach to API development. I servizi e i messaggi vengono definiti nei *file. 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;
}

I tipi .NET per servizi, client e messaggi vengono generati automaticamente includendo *file con estensione proto in un progetto:.NET types for services, clients and messages are automatically generated by including *.proto files in a project:

  • Aggiungere un riferimento al pacchetto Grpc. Tools .Add a package reference to Grpc.Tools package.
  • <Protobuf> Aggiungere *i file. proto al gruppo di elementi.Add *.proto files to the <Protobuf> item group.
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

Per ulteriori informazioni sul supporto per gli strumenti gRPC, Servizi gRPC con C#vedere.For more information on gRPC tooling support, see Servizi gRPC con C#.

Servizi gRPC in ASP.NET CoregRPC services on ASP.NET Core

i servizi gRPC possono essere ospitati in ASP.NET Core.gRPC services can be hosted on ASP.NET Core. I servizi hanno un'integrazione completa con le funzionalità DI ASP.NET Core più diffuse, ad esempio registrazione, inserimento DI dipendenze, autenticazione e autorizzazione.Services have full integration with popular ASP.NET Core features such as logging, dependency injection (DI), authentication and authorization.

Il modello di progetto di servizio gRPC fornisce un servizio Starter: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
        });
    }
}

GreeterServiceeredita dal GreeterBase tipo, generato Greeter dal servizio nel *file. proto .GreeterService inherits from the GreeterBase type, which is generated from the Greeter service in the *.proto file. Il servizio è reso accessibile ai client in Startup.cs:The service is made accessible to clients in Startup.cs:

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

Per ulteriori informazioni sui servizi gRPC in ASP.NET Core, vedere Servizi gRPC con ASP.NET Core.To learn more about gRPC services on ASP.NET Core, see Servizi gRPC con ASP.NET Core.

Chiamare i servizi gRPC con un client .NETCall gRPC services with a .NET client

i client gRPC sono tipi di client concreti generati *da file. proto .gRPC clients are concrete client types that are generated from *.proto files. Il client gRPC concreto dispone di metodi che vengono convertiti nel servizio gRPC nel *file. 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.SayHello(
    new HelloRequest { Name = "World" });

Console.WriteLine(response.Message);

Un client gRPC viene creato usando un canale che rappresenta una connessione di lunga durata a un servizio gRPC.A gRPC client is created using a channel, which represents a long-lived connection to a gRPC service. Un canale può essere creato usando GrpcChannel.ForAddress.A channel can be created using GrpcChannel.ForAddress.

Per ulteriori informazioni sulla creazione di client e sulla chiamata di diversi metodi di Chiamare i servizi gRPC con il client .NETservizio, vedere.For more information on creating clients, and calling different service methods, see Chiamare i servizi gRPC con il client .NET.

gRPC non supportato nel servizio app AzuregRPC not supported on Azure App Service

Avviso

ASP.NET Core gRPC non è attualmente supportato nel servizio app Azure o in IIS.ASP.NET Core gRPC is not currently supported on Azure App Service or IIS. L'implementazione HTTP/2 di http. sys non supporta le intestazioni finali della risposta HTTP su cui si basa gRPC.The HTTP/2 implementation of Http.Sys does not support HTTP response trailing headers which gRPC relies on. Per altre informazioni, vedere questo problema su GitHub.For more information, see this GitHub issue.

Risorse aggiuntiveAdditional resources