.NET 上的 gRPC 概述
注意
此版本不是本文的最新版本。 有关当前版本,请参阅本文的 .NET 9 版本。
警告
此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅此文的 .NET 8 版本。
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。
gRPC 的主要优点是:
- 现代高性能轻量级 RPC 框架。
- 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
- 可用于多种语言的工具,以生成强类型服务器和客户端。
- 支持客户端、服务器和双向流式处理调用。
- 使用 Protobuf 二进制序列化减少对网络的使用。
这些优点使 gRPC 适用于:
- 效率至关重要的轻量级微服务。
- 需要多种语言用于开发的 Polyglot 系统。
- 需要处理流式处理请求或响应的点对点实时服务。
对 .proto
文件的 C# 工具支持
gRPC 使用协定优先方法进行 API 开发。 在 .proto
文件中定义服务和消息:
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
通过在项目中包含 .proto
文件,可自动生成用于服务、客户端和消息的 .NET 类型:
- 将包引用添加到 Grpc.Tools 包。
- 将
.proto
文件添加到<Protobuf>
项目组。
<ItemGroup>
<Protobuf Include="Protos\greet.proto" />
</ItemGroup>
有关 gRPC 工具支持的详细信息,请参阅使用 C# 的 gRPC 服务。
ASP.NET Core 上的 gRPC 服务
gRPC 服务可以托管在 ASP.NET Core 上。 这些服务与日志记录、依赖关系注入 (DI)、身份验证和授权等 ASP.NET Core 功能完全集成。
将 gRPC 服务添加到 ASP.NET Core 应用
gRPC 需要 Grpc.AspNetCore 包。 若要了解如何在 .NET 应用中配置 gRPC,请查看配置 gRPC。
gRPC 服务项目模板
ASP.NET Core 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
服务生成的。 Program.cs
中的客户端可以访问该服务:
app.MapGrpcService<GreeterService>();
若要详细了解 ASP.NET Core 上的 gRPC 服务,请参阅使用 ASP.NET Core 的 gRPC 服务。
使用 .NET 客户端调用 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 服务。
其他资源
gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架。
gRPC 的主要优点是:
- 现代高性能轻量级 RPC 框架。
- 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的实现。
- 可用于多种语言的工具,以生成强类型服务器和客户端。
- 支持客户端、服务器和双向流式处理调用。
- 使用 Protobuf 二进制序列化减少对网络的使用。
这些优点使 gRPC 适用于:
- 效率至关重要的轻量级微服务。
- 需要多种语言用于开发的 Polyglot 系统。
- 需要处理流式处理请求或响应的点对点实时服务。
对 .proto
文件的 C# 工具支持
gRPC 使用协定优先方法进行 API 开发。 在 .proto
文件中定义服务和消息:
syntax = "proto3";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
通过在项目中包含 .proto
文件,可自动生成用于服务、客户端和消息的 .NET 类型:
- 将包引用添加到 Grpc.Tools 包。
- 将
.proto
文件添加到<Protobuf>
项目组。
<ItemGroup>
<Protobuf Include="Protos\greet.proto" />
</ItemGroup>
有关 gRPC 工具支持的详细信息,请参阅使用 C# 的 gRPC 服务。
ASP.NET Core 上的 gRPC 服务
gRPC 服务可以托管在 ASP.NET Core 上。 这些服务与日志记录、依赖关系注入 (DI)、身份验证和授权等 ASP.NET Core 功能完全集成。
将 gRPC 服务添加到 ASP.NET Core 应用
gRPC 需要 Grpc.AspNetCore 包。 若要了解如何在 .NET 应用中配置 gRPC,请查看配置 gRPC。
gRPC 服务项目模板
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 服务。
使用 .NET 客户端调用 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 服务。