.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的几种通信模式:

  1. 一元RPC:客户端发送单个请求,服务端返回单个响应,这种是最基本最常用的交互,完全可以媲美REST API接口调用;
  2. 服务端流式RPC:客户端发送请求,服务端返回流式响应
  3. 客户端流式RPC:客户端发送流式请求,服务端返回单个响应
  4. 双向流式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服务

代码生成工具

Grpc.Tools

从.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服务端

步骤一:创建项目

  1. 启动Visual Studio,选择“创建新项目”
  2. 搜索“gRPC”,选择“ASP.NET Core gRPC 服务”

  1. 项目名称设为GrpcGreeter
  2. 选择.NET版本(推荐.NET 8.0或更高)

步骤二:查看项目结构

创建完成后,可以看到以下两个核心文件:

  • Protos/greet.proto:定义gRPC服务的接口文件,这里包含了一个请求/响应数据结构,一个接口函数SayHello;

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

步骤三:运行服务端

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

3.3 创建gRPC客户端

步骤一:创建控制台应用

  1. 另开一个Visual Studio实例
  2. 创建“控制台应用”项目,命名GrpcGreeterClient

在客户端控制台项目中添加以下几个NuGet包,作用可以文章开头的描述;

步骤二:添加proto文件

  1. 在客户端项目中创建Protos文件夹,把服务端的greet.proto文件复制到该文件夹
  2. 修改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的性能和体验,将其作为未来服务间通信的首选方案。