用途
gRPC Services 用于在 .NET 中进行 gRPC 服务开发,目标场景是高性能的服务间(inter-service)通信。资料给出的定位是:将 gRPC 用于内部服务间通信,将 REST/HTTP 用于对外 API。
主要能力
Proto 契约定义
示例定义了一个 package 为 catalog、csharp_namespace 为 MyApp.Grpc 的 proto3 契约,包含 CatalogService,提供四种 RPC:
- GetProduct (GetProductRequest) returns (ProductResponse)
- ListProducts (ListProductsRequest) returns (ListProductsResponse)
- CreateProduct (CreateProductRequest) returns (ProductResponse)
- StreamProducts (StreamRequest) returns (stream ProductResponse)
消息类型包括:GetProductRequest(int32 id)、ListProductsRequest(int32 page、int32 page_size、string search)、ListProductsResponse(repeated ProductResponse products、int32 total_count)、CreateProductRequest(string name、string description、double price)、ProductResponse(int32 id、string name、string description、double price)、StreamRequest(string filter)。
服务实现
示例 CatalogGrpcService 继承 CatalogService.CatalogServiceBase,构造注入 ICatalogService 与 ILogger。GetProduct 调用 catalog.GetByIdAsync,找不到时抛出 RpcException(new Status(StatusCode.NotFound, ...))。StreamProducts 使用 await foreach 遍历 catalog.StreamAsync,并通过 IServerStreamWriter 逐条 WriteAsync。
服务端与客户端接入
服务端:builder.Services.AddGrpc() 与 app.MapGrpcService<CatalogGrpcService>()。
客户端(配合 Aspire):AddGrpcClient<CatalogService.CatalogServiceClient> 指定 Address 为 "https+http://catalog-api",并链式调用 AddStandardResilienceHandler()。
四种 RPC 模式
除一元与服务器流外,资料还给出客户端流与双向流示例:
- 客户端流:LotsOfGreetings 接收 IAsyncStreamReader<HelloRequest>,用 ReadAllAsync 统计请求数后返回单个 HelloReply。
- 双向流:BidiHello 同时接收 requestStream 与 responseStream,逐个读取请求并向响应流写入 Echo 回复。
项目配置与安装
在 .csproj 中通过 <Protobuf Include="Protos\greet.proto" /> 引入 proto 文件。安装命令:
dotnet add package Grpc.AspNetCore dotnet add package Grpc.Tools
gRPC 与 REST 对比(来自官方文档)
- 序列化:gRPC 使用 Protocol Buffers(二进制);REST/HTTP 使用 JSON(文本)。
- 协议:gRPC 为 HTTP/2;REST/HTTP 为 HTTP/1.1 或 HTTP/2。
- 负载大小:gRPC 小且压缩;REST 较大但可读。
- 延迟:gRPC 低(约快 10 倍);REST 较高。
- 浏览器支持:gRPC 有限(gRPC-Web);REST 完整。
- 代码生成:gRPC 自动(契约优先);REST 手动。
- 流式:gRPC 原生、双向;REST 有限。
- 调试:gRPC 二进制,较难;REST 容易(HTTP 工具)。
- 适用场景:gRPC 用于微服务、实时;REST 用于公开 API、浏览器。
使用方式
按资料给出的流程:先用 proto3 编写 .proto 契约,将其加入 .csproj 的 <Protobuf> 项,安装 Grpc.AspNetCore 与 Grpc.Tools,在服务端实现继承自生成基类的服务并注册 AddGrpc/MapGrpcService,客户端通过 AddGrpcClient 接入并按需附加标准韧性处理器。
适用场景
内部服务间通信、需要低延迟与原生流式(服务器流、客户端流、双向流)的实时场景,以及适合契约优先、自动代码生成的微服务架构。对外公开 API 与浏览器场景则更适合 REST/HTTP。
限制与注意事项
- 二进制格式导致调试较难,可使用 gRPC 反射配合工具。
- 浏览器支持有限,需 gRPC-Web。
- 建议使用 Deadline 控制请求超时。
- 建议使用拦截器(interceptors)处理日志、认证等横切关注点。
- 大结果集建议使用服务器流。
- 上述对比数据(如延迟约 10 倍)来自资料引用的官方文档,未在本资料中给出测试条件。
其余未在资料中说明的信息(如具体版本要求、完整部署方式、收费情况)暂未提供。