.NET项目如何用gRPC?从零到跑通一个例子就够了
在微服务和云原生架构大行其道的今天,服务之间的通信效率成为系统性能的关键瓶颈。你是否还在为REST API的低效序列化而烦恼?是否在寻找一种既能跨语言又能保持高性能的通信方案?今天,跟随作者一起来认识gRPC,以及.NET生态如何完美支持这一现代RPC框架。
如果你对gRPC的概念有所了解,可以直接跳入第3章节;如果你对gRPC已经完全熟练掌握,那就可以完全跳过本文^=^
一、什么是gRPC?为何它如此重要?
gRPC是由Google开源的高性能远程过程调用框架,它基于HTTP/2协议,使用Protocol Buffers(protobuf)作为接口定义语言和数据序列化格式。

gRPC的几个核心优势:
- 高性能:使用protobuf二进制序列化,相比JSON体积更小、速度更快
- 多语言支持:支持C++、Java、Python、Go、C#等多种语言
- 双向流式通信:基于HTTP/2,支持客户端、服务端双向流式传输
- 强类型:通过.proto文件明确定义接口,生成强类型代码
- 自动代码生成:提高开发效率,减少手动编写样板代码
gRPC的几种通信模式:
- 一元RPC:客户端发送单个请求,服务端返回单个响应,这种是最基本最常用的交互,完全可以媲美REST API接口调用;
- 服务端流式RPC:客户端发送请求,服务端返回流式响应
- 客户端流式RPC:客户端发送流式请求,服务端返回单个响应
- 双向流式RPC:双方同时发送流式消息
二、.NET对gRPC的支持:成熟且强大
微软对gRPC的支持可以说是全力投入。从.NET Core 3.0开始,gRPC就成为.NET平台的一等公民。
官方支持情况:
|
组件 |
包名 |
用途 |
|
gRPC服务端 |
Microsoft.AspNetCore.App(内置) |
ASP.NET Core中创建gRPC服务 |
|
gRPC客户端 |
Grpc.Net.Client |
.NET Core调用gRPC服务 |
|
代码生成工具 |
从.proto文件生成C#代码 |
|
|
Protobuf支持 |
Google.Protobuf |
Protocol Buffers序列化支持 |
.NET gRPC的技术特点:
- 完全托管实现:基于.NET原生实现,无需依赖C++库
- 与ASP.NET Core无缝集成:共享配置、日志、依赖注入等基础设施
- 性能优异:微软官方基准测试显示,gRPC性能远超传统REST API
- 跨平台支持:Windows、Linux、macOS均可完美运行
三、实战演练:创建完整的gRPC服务与客户端
接下来跟随作者一块创建一个基本的gRPC示例,包含服务端和客户端。
3.1 环境准备
- Visual Studio 2022(需安装ASP.NET和Web开发工作负载,如下图所示)
- .NET 6.0 SDK或更高版本

3.2 创建gRPC服务端
步骤一:创建项目
- 启动Visual Studio,选择“创建新项目”
- 搜索“gRPC”,选择“ASP.NET Core gRPC 服务”

- 项目名称设为GrpcGreeter
- 选择.NET版本(推荐.NET 8.0或更高)
步骤二:查看项目结构
创建完成后,可以看到以下两个核心文件:
- Protos/greet.proto:定义gRPC服务的接口文件,这里包含了一个请求/响应数据结构,一个接口函数SayHello;

- Services/GreeterService.cs:实现gRPC服务的业务逻辑

步骤三:运行服务端
按F5运行服务,控制台会显示服务监听的地址,如https://localhost:7208。

3.3 创建gRPC客户端
步骤一:创建控制台应用
- 另开一个Visual Studio实例
- 创建“控制台应用”项目,命名GrpcGreeterClient
在客户端控制台项目中添加以下几个NuGet包,作用可以文章开头的描述;

步骤二:添加proto文件
- 在客户端项目中创建Protos文件夹,把服务端的greet.proto文件复制到该文件夹
- 修改greet.proto中的命名空间,修改是为了方便区分,不修改也不影响使用;

编辑.csproj文件,将proto文件加入项目编译流程:
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>
步骤三:编写客户端代码并启动运行
在控制台项目添加我们的请求代码,然后即可收到服务端的回应,其中SayHelloAsync就是根据Proto自动生成的异步函数;
这里我们相当于使用了gRPC最简单的一元 RPC模式完成了一次RPC完整交互流程;
注意,这里我没有对服务端添加有效的https证书,直接使用https会报证书错误,所以暂时用http代替,

四、小结:gRPC的典型应用场景
✅ 适合使用gRPC的场景:
- 微服务间通信:高性能、低延迟的内部服务调用
- 实时服务:需要流式数据传输的场景(如聊天、位置同步)
- 多语言环境:不同语言编写的服务需要高效通信
- 移动客户端:节省流量和电量的二进制传输
❌ gRPC虽然好用,但是相对REST API也有不太适用的场景:
- 浏览器直接调用:需要grpc-web代理,不如REST方便
- 面向公网的API:需要广泛的客户端支持
- 简单查询场景:REST的开销可以接受时无需复杂化
通过本文的介绍,可以看到.NET对gRPC的全面支持,从创建服务端到编写客户端,整个过程流畅自然。gRPC的高性能、强类型、多语言等特性,使其成为现代微服务架构的通信利器。
随着.NET平台的不断发展,gRPC在.NET中的应用将更加广泛。官方也在不断优化gRPC的性能和体验,将其作为未来服务间通信的首选方案。