gRPC 用于 C# (.NET):库与示例
gRPC 是 Google 开发的高性能远程过程调用(RPC)框架,基于 HTTP/2 和 Protocol Buffers(protobuf)。在 .NET 生态系统中,gRPC 已成为微服务通信的事实标准,提供强类型、双向流传输和低延迟。本文将介绍在 C# 中使用 gRPC 的关键库,并提供服务器和客户端配置的实用示例。
gRPC 在 .NET 中的主要库
在 .NET 中使用 gRPC 需要以下 NuGet 包:
- Grpc.AspNetCore — 将 gRPC 服务器集成到 ASP.NET Core(推荐用于托管)。
- Grpc.Net.Client — 用于 .NET 的客户端库(包括 .NET Core、.NET 5+)。
- Grpc.Tools — 从
.proto文件生成代码的工具(作为Protobuf项添加到 .csproj)。 - Google.Protobuf — 处理 protobuf 消息。
所有这些包均由 Microsoft 支持并积极开发。可通过 NuGet 包管理器或 dotnet CLI 安装:
dotnet add package Grpc.AspNetCoredotnet add package Grpc.Net.Clientdotnet add package Google.Protobufdotnet add package Grpc.Tools在 C# 中创建 gRPC 服务器
让我们逐步创建一个处理订单的简单服务。
1. 定义 proto 文件
在服务器项目中(例如 GrpcServer)创建 order.proto 文件:
syntax = "proto3";
service OrderService { rpc GetOrder (OrderRequest) returns (OrderResponse); rpc SubscribeOrders (OrderRequest) returns (stream OrderResponse);}
message OrderRequest { int32 order_id = 1;}
message OrderResponse { int32 order_id = 1; string status = 2; double total = 3;}2. 配置 .csproj 以生成代码
在 .csproj 文件中添加:
<ItemGroup> <Protobuf Include="order.proto" GrpcServices="Server" /></ItemGroup>3. 实现服务
创建一个继承自生成的基类的类:
public class OrderServiceImpl : OrderService.OrderServiceBase{ public override Task<OrderResponse> GetOrder(OrderRequest request, ServerCallContext context) { return Task.FromResult(new OrderResponse { OrderId = request.OrderId, Status = "Shipped", Total = 99.99 }); }
public override async Task SubscribeOrders(OrderRequest request, IServerStreamWriter<OrderResponse> responseStream, ServerCallContext context) { for (int i = 0; i < 5; i++) { await responseStream.WriteAsync(new OrderResponse { OrderId = request.OrderId, Status = $"Update #{i}", Total = 100 + i * 10 }); await Task.Delay(1000); } }}4. 在 Program.cs 中注册
var builder = WebApplication.CreateBuilder(args);builder.Services.AddGrpc();
var app = builder.Build();app.MapGrpcService<OrderServiceImpl>();app.MapGet("/", () => "gRPC server is running");app.Run();在 C# 中创建 gRPC 客户端
现在创建一个控制台应用程序客户端(GrpcClient)。
1. 准备工作
将 order.proto 复制到客户端项目,并在 .csproj 中指定:
<Protobuf Include="order.proto" GrpcServices="Client" />2. 客户端代码
using Grpc.Net.Client;using GrpcClient;
var channel = GrpcChannel.ForAddress("https://localhost:5001");\