作者:John Luo 和 James Newton-King
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。
gRPC 的主要优点是:
这些优点使 gRPC 适用于:
gRPC 使用协定优先方法进行 API 开发。 在 *.proto 文件中定义服务和消息:
syntax = "proto3"; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); } message HelloRequest { string name = 1; } message HelloReply { string message = 1; }
通过在项目中包含 *.proto 文件,可以自动生成用于服务、客户端和消息的 .NET 类型:
<Protobuf>
项目组。<ItemGroup> <Protobuf Include="Protos\greet.proto" /> </ItemGroup>
有关 gRPC 工具支持的详细信息,请参阅 使用 C# 的 gRPC 服务。
gRPC 服务可以托管在 ASP.NET Core 上。 这些服务与常用的 ASP.NET Core 功能(例如日志记录、依赖关系注入(DI)、身份验证和授权)完全集成。
gRPC 服务项目模板提供了一个入门版服务:
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
继承自 GreeterBase
类型,后者是从 *.proto 文件的 Greeter
服务生成的。 Startup.cs 中的客户端可以访问该服务:
app.UseEndpoints(endpoints => { endpoints.MapGrpcService<GreeterService>(); });
若要了解有关 ASP.NET Core 上的 gRPC 服务的详细信息,请参阅 使用 ASP.NET Core 的 gRPC 服务。
gRPC 客户端是从 *.proto 文件生成的具体客户端类型。 具体 gRPC 客户端具有转换为 *.proto 文件中 gRPC 服务的方法。
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);
gRPC 客户端是使用通道创建的,该通道表示与 gRPC 服务的长期连接。 可以使用 GrpcChannel.ForAddress
创建通道。
有关创建客户端、调用不同服务方法的详细信息,请参阅 通过 .NET 客户端调用 gRPC 服务。
警告
Azure 应用服务或 IIS 当前不支持 ASP.NET Core gRPC。 Http.Sys 的 HTTP/2 实现不支持 gRPC 依赖的 HTTP 响应尾随标头。 有关详细信息,请参阅此 GitHub 问题。