SuperAPI AI 工具集

grpc-services

编程与开发

查看项目

更新于 10-16 04:01

技能介绍

用途

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 倍)来自资料引用的官方文档,未在本资料中给出测试条件。

其余未在资料中说明的信息(如具体版本要求、完整部署方式、收费情况)暂未提供。