Introducción a gRPC en .NET

Por James Newton-King

gRPC es un marco de llamada a procedimiento remoto (RPC) de alto rendimiento e independiente del idioma.

Las principales ventajas de gRPC son:

  • Marco de RPC moderno, ligero y de alto rendimiento.
  • Desarrollo de la API de primer contrato utilizando búferes de protocolo de forma predeterminada, lo que permite realizar implementaciones independientes del idioma.
  • Dispone de herramientas para muchos idioma con la finalidad de generar clientes y servidores fuertemente tipados.
  • Admite llamadas de transmisión en secuencias bidireccionales, de servidor y de cliente.
  • Uso reducido de red con serialización binaria Protobuf.

Estas ventajas hacen que gRPC sea ideal para:

  • Microservicios ligeros en los que la eficiencia sea fundamental.
  • Sistemas políglotas en los que se requieran varios idiomas para el desarrollo.
  • Servicios en tiempo real de punto a punto que necesitan controlar respuestas o solicitudes de transmisión en secuencias.

Compatibilidad de las herramientas de C# con archivos .proto

gRPC usa un enfoque de contrato primero para el desarrollo de API. Los servicios y mensajes se definen en los archivos .proto:

syntax = "proto3";

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

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Los tipos .NET para los servicios, los clientes y los mensajes se generan automáticamente incluyendo archivos .proto en un proyecto:

  • Agregue una referencia de paquete al paquete Grpc.Tools.
  • Agregue archivos .proto al grupo de elementos <Protobuf>.
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

Para más información sobre la compatibilidad con las herramientas de gRPC, vea Servicios gRPC con C#.

Servicios gRPC en ASP.NET Core

Los servicios gRPC se puede hospedar en ASP.NET Core. Los servicios tienen una integración completa con características de ASP.NET Core como el registro, la inserción de dependencias (DI), la autenticación y la autorización.

Incorporación de servicios gRPC a una aplicación de ASP.NET Core

gRPC requiere el paquete Grpc.AspNetCore. Para obtener información sobre cómo configurar gRPC en una aplicación .NET, consulte Configuración de gRPC.

Plantilla de proyecto de servicios gRPC

La plantilla de proyecto ASP.NET Core gRPC Service proporciona un servicio de inicio:

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 se hereda del tipo GreeterBase, que se genera a partir del servicio Greeter en el archivo .proto. El servicio se hace accesible a los clientes en Program.cs:

app.MapGrpcService<GreeterService>();

Para más información sobre los servicios gRPC en ASP.NET Core, consulte Servicios gRPC con ASP.NET Core.

Llamada a servicios gRPC con un cliente .NET

Los clientes gRPC son tipos de cliente concretos que se generan a partir de archivos .proto. El cliente gRPC concreto tiene métodos que se convierten en el servicio gRPC en el archivo .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);

Un cliente gRPC se crea mediante un canal, que representa una conexión de larga duración con un servicio gRPC. Un canal se puede crear mediante GrpcChannel.ForAddress.

Para más información sobre cómo crear clientes y llamar a métodos de servicio diferentes, vea Llamada a servicios gRPC con el cliente .NET.

Recursos adicionales

gRPC es un marco de llamada a procedimiento remoto (RPC) de alto rendimiento e independiente del idioma.

Las principales ventajas de gRPC son:

  • Marco de RPC moderno, ligero y de alto rendimiento.
  • Desarrollo de la API de primer contrato utilizando búferes de protocolo de forma predeterminada, lo que permite realizar implementaciones independientes del idioma.
  • Dispone de herramientas para muchos idioma con la finalidad de generar clientes y servidores fuertemente tipados.
  • Admite llamadas de transmisión en secuencias bidireccionales, de servidor y de cliente.
  • Uso reducido de red con serialización binaria Protobuf.

Estas ventajas hacen que gRPC sea ideal para:

  • Microservicios ligeros en los que la eficiencia sea fundamental.
  • Sistemas políglotas en los que se requieran varios idiomas para el desarrollo.
  • Servicios en tiempo real de punto a punto que necesitan controlar respuestas o solicitudes de transmisión en secuencias.

Compatibilidad de las herramientas de C# con archivos .proto

gRPC usa un enfoque de contrato primero para el desarrollo de API. Los servicios y mensajes se definen en los archivos .proto:

syntax = "proto3";

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

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

Los tipos .NET para los servicios, los clientes y los mensajes se generan automáticamente incluyendo archivos .proto en un proyecto:

  • Agregue una referencia de paquete al paquete Grpc.Tools.
  • Agregue archivos .proto al grupo de elementos <Protobuf>.
<ItemGroup>
  <Protobuf Include="Protos\greet.proto" />
</ItemGroup>

Para más información sobre la compatibilidad con las herramientas de gRPC, vea Servicios gRPC con C#.

Servicios gRPC en ASP.NET Core

Los servicios gRPC se puede hospedar en ASP.NET Core. Los servicios tienen una integración completa con características de ASP.NET Core como el registro, la inserción de dependencias (DI), la autenticación y la autorización.

Incorporación de servicios gRPC a una aplicación de ASP.NET Core

gRPC requiere el paquete Grpc.AspNetCore. Para obtener información sobre cómo configurar gRPC en una aplicación .NET, consulte Configuración de gRPC.

Plantilla de proyecto de servicios gRPC

La plantilla de proyecto de servicios gRPC proporciona un servicio de inicio:

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 se hereda del tipo GreeterBase, que se genera a partir del servicio Greeter en el archivo .proto. El servicio se hace accesible a los clientes en Startup.cs:

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

Para más información sobre los servicios gRPC en ASP.NET Core, consulte Servicios gRPC con ASP.NET Core.

Llamada a servicios gRPC con un cliente .NET

Los clientes gRPC son tipos de cliente concretos que se generan a partir de archivos .proto. El cliente gRPC concreto tiene métodos que se convierten en el servicio gRPC en el archivo .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);

Un cliente gRPC se crea mediante un canal, que representa una conexión de larga duración con un servicio gRPC. Un canal se puede crear mediante GrpcChannel.ForAddress.

Para más información sobre cómo crear clientes y llamar a métodos de servicio diferentes, vea Llamada a servicios gRPC con el cliente .NET.

Recursos adicionales