.NET Core 上的 gRPC 的简介Introduction to gRPC on .NET Core

本文内容

作者:John LuoJames Newton-King

gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。

gRPC 的主要优点是:

  • 现代高性能轻量级 RPC 框架。
  • 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
  • 可用于多种语言的工具,以生成强类型服务器和客户端。
  • 支持客户端、服务器和双向流式处理调用。
  • 使用 Protobuf 二进制序列化减少对网络的使用。

这些优点使 gRPC 适用于:

  • 效率至关重要的轻量级微服务。
  • 需要多种语言用于开发的 Polyglot 系统。
  • 需要处理流式处理请求或响应的点对点实时服务。

.proto 文件的 C# 工具支持C# Tooling support for .proto files

gRPC 使用协定优先方法进行 API 开发。在 *.proto 文件中定义服务和消息:

  1. syntax = "proto3";
  2. service Greeter {
  3. rpc SayHello (HelloRequest) returns (HelloReply);
  4. }
  5. message HelloRequest {
  6. string name = 1;
  7. }
  8. message HelloReply {
  9. string message = 1;
  10. }

通过在项目中包含 *.proto 文件,可以自动生成用于服务、客户端和消息的 .NET 类型:

  • 将包引用添加到 Grpc.Tools 包。
  • 将 *.proto 文件添加到 <Protobuf> 项目组。
  1. <ItemGroup>
  2. <Protobuf Include="Protos\greet.proto" />
  3. </ItemGroup>

有关 gRPC 工具支持的详细信息,请参阅 使用 C# 的 gRPC 服务

ASP.NET Core 上的 gRPC 服务gRPC services on ASP.NET Core

gRPC 服务可以托管在 ASP.NET Core 上。这些服务与常用的 ASP.NET Core 功能(例如日志记录、依赖关系注入(DI)、身份验证和授权)完全集成。

gRPC 服务项目模板提供了一个入门版服务:

  1. public class GreeterService : Greeter.GreeterBase
  2. {
  3. private readonly ILogger<GreeterService> _logger;
  4. public GreeterService(ILogger<GreeterService> logger)
  5. {
  6. _logger = logger;
  7. }
  8. public override Task<HelloReply> SayHello(HelloRequest request,
  9. ServerCallContext context)
  10. {
  11. _logger.LogInformation("Saying hello to {Name}", request.Name);
  12. return Task.FromResult(new HelloReply
  13. {
  14. Message = "Hello " + request.Name
  15. });
  16. }
  17. }

GreeterService 继承自 GreeterBase 类型,后者是从 *.proto 文件的 Greeter 服务生成的。Startup.cs 中的客户端可以访问该服务:

  1. app.UseEndpoints(endpoints =>
  2. {
  3. endpoints.MapGrpcService<GreeterService>();
  4. });

若要了解有关 ASP.NET Core 上的 gRPC 服务的详细信息,请参阅 使用 ASP.NET Core 的 gRPC 服务

使用 .NET 客户端调用 gRPC 服务Call gRPC services with a .NET client

gRPC 客户端是从 *.proto 文件生成的具体客户端类型。具体 gRPC 客户端具有转换为 *.proto 文件中 gRPC 服务的方法。

  1. var channel = GrpcChannel.ForAddress("https://localhost:5001");
  2. var client = new Greeter.GreeterClient(channel);
  3. var response = await client.SayHelloAsync(
  4. new HelloRequest { Name = "World" });
  5. Console.WriteLine(response.Message);

gRPC 客户端是使用通道创建的,该通道表示与 gRPC 服务的长期连接。可以使用 GrpcChannel.ForAddress 创建通道。

有关创建客户端、调用不同服务方法的详细信息,请参阅 使用 .NET 客户端调用 gRPC 服务

Azure 应用服务不支持 gRPCgRPC not supported on Azure App Service

警告

Azure 应用服务或 IIS 当前不支持 ASP.NET Core gRPCHttp.Sys 的 HTTP/2 实现不支持 gRPC 依赖的 HTTP 响应尾随标头。有关详细信息,请参阅此 GitHub 问题

其他资源Additional resources