.NET8中gRPC的使用方法详解
分布式系统里,服务之间的通信从来都是个绕不开的话题。微服务架构火了之后,通信方式也跟着迭代了好几轮。gRPC凭借高性能、跨语言的优势,慢慢成了不少团队的首选。 一、简介 gRPC,全称是高性能远程过程调用框架,开源、基于HTTP/2,支持双向流、头部压缩这些特性。默认用Protocol Buffer
分布式系统里,服务之间的通信从来都是个绕不开的话题。微服务架构火了之后,通信方式也跟着迭代了好几轮。gRPC凭借高性能、跨语言的优势,慢慢成了不少团队的首选。
一、简介
gRPC,全称是高性能远程过程调用框架,开源、基于HTTP/2,支持双向流、头部压缩这些特性。默认用Protocol Buffers(Protobuf)做接口定义语言和数据序列化,微服务、实时通信场景都很合适。
在.NET Core(.NET 8)上,官方对gRPC提供了原生支持,搭建服务端和客户端非常方便,也能轻松集成到Web API或其他应用中。
下面围绕三个核心环节展开:创建gRPC服务端、创建gRPC客户端、在Web API里集成gRPC。
二、创建 gRPC 服务端
1. 创建 gRPC 项目
用.NET CLI创建gRPC服务端项目,Visual Studio 2022里直接新建项目也行。
dotnet new grpc -o GrpcDemo.Service cd GrpcDemo.Service

项目模板会自带一个示例服务,方便直接上手。

2. 编写自己的服务
Protos文件夹里默认有个greet.proto,可以修改或者新建.proto文件来定义自己的服务接口。
比如创建一个order.proto文件:
syntax = "proto3";
option csharp_namespace = "GrpcDemo.Service";
package order;
// 订单服务定义
service Order {
// 创建订单
rpc CreateOrder (CreateRequest) returns (CreateResult);
//查询订单
rpc QueryOrder (QueryRequest) returns (QueryResult);
}
//创建订单请求参数
message CreateRequest {
string OrderNo = 1;
string OrderName=2;
double Price=3;
}
//创建订单返回结果
message CreateResult {
bool IsSuccess = 1; // 是否成功
string Message = 2; // 错误信息
}
//查询订单请求参数
message QueryRequest{
int32 Id=1;
}
//查询订单返回结果
message QueryResult{
int32 Id=1;
string OrderNo=2;
string OrderName=3;
double Price=4;
}
然后在Services文件夹里写业务逻辑。创建OrderService.cs:
using Grpc.Core;
namespace GrpcDemo.Service.Services
{
public class OrderService : Order.OrderBase
{
private readonly ILogger _logger;
public OrderService(ILogger logger)
{
_logger = logger;
}
///
/// 创建订单
///
///
///
///
public override Task CreateOrder(CreateRequest request, ServerCallContext context)
{
//报存数据库 todo
return Task.FromResult(new CreateResult
{
IsSuccess = true,
Message = "订单创建成功"
});
}
///
/// 查询订单
///
///
///
///
public override Task QueryOrder(QueryRequest request, ServerCallContext context)
{
//查询数据库 //todo
return Task.FromResult(new QueryResult
{
Id = request.Id,
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
OrderName = "年货大礼包",
Price = 699
});
}
}
}
最后在Program.cs里注册服务:
using GrpcDemo.Service.Services; var builder = WebApplication.CreateBuilder(args); // 添加 gRPC 服务 builder.Services.AddGrpc(); var app = builder.Build(); // 映射 gRPC 服务 app.MapGrpcService(); app.Run();
跑起来,gRPC服务端就会监听指定端口了。
三、创建 gRPC 客户端
1. 创建客户端项目
再建一个控制台项目当客户端:
dotnet new console -o GrpcDemo.Client cd GrpcDemo.Client
2. 添加 gRPC 客户端依赖
需要引入Grpc.Net.Client、Google.Protobuf和Grpc.Tools:
dotnet add package Grpc.Net.Client dotnet add package Google.Protobuf dotnet add package Grpc.Tools
把服务端的order.proto复制到客户端的Protos文件夹,然后在.csproj里添加生成C#代码的配置:

3. 编写客户端代码
在Program.cs里写HTTPS调用的示例:
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
//常规使用,https
string url = "https://localhost:7231";
using (var channel = GrpcChannel.ForAddress(url))
{
var client = new Order.OrderClient(channel);
var reply = client.CreateOrder(new CreateRequest()
{
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
OrderName = "年货大礼包",
Price = 699
});
Console.WriteLine($"Grpc服务https的调用结果:{reply.IsSuccess},message:{reply.Message}");
}
Console.ReadKey();
}
效果如下:

如果服务端只用了HTTP(非HTTPS),客户端需要额外设置:
//使用http
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
string url = "http://localhost:5147";
using (var channel = GrpcChannel.ForAddress(url))
{
var client = new Order.OrderClient(channel);
var reply = client.CreateOrder(new CreateRequest()
{
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
OrderName = "年货大礼包",
Price = 699
});
Console.WriteLine($"gGrpc内网http调用结果:{reply.IsSuccess},message:{reply.Message}");
}
Console.ReadKey();
结果:

四、Web API 中加入 gRPC
Web API项目里可以同时提供RESTful API和gRPC服务,两者互不冲突。具体做法如下:
1. 添加 gRPC 服务
在Program.cs注册gRPC:
var builder = WebApplication.CreateBuilder(args); // 添加 gRPC 服务 builder.Services.AddGrpc(); var app = builder.Build(); // 映射 gRPC 服务 app.MapGrpcService(); app.Run();
2. 提供 RESTful API
通过控制器暴露RESTful接口,内部调用gRPC客户端:
using Microsoft.AspNetCore.Mvc;
namespace GrpcDemo.API.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class OrderController : ControllerBase
{
private readonly Order.OrderClient _client;
public OrderController(Order.OrderClient client)
{
_client = client;
}
[HttpGet("create")]
public async Task CreateOrder()
{
var response = await _client.CreateOrderAsync(
new CreateRequest {
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
OrderName = "年货大礼包",
Price = 699
});
return Ok(response);
}
}
}
3. 配置 gRPC 客户端
在Program.cs里注入客户端:
builder.Services.AddGrpcClient(options => { options.Address = new Uri("http://localhost:5147"); });
效果:

总结
在.NET Core里,gRPC提供了一种高性能的通信方式,特别适合微服务和实时交互场景。从创建服务端、客户端,到集成到Web API,整个过程都很顺畅。
关键点总结:
- 用
.proto文件定义服务接口。 - 实现gRPC服务端业务逻辑。
- 客户端通过
GrpcChannel调用服务。 - Web API中可以同时支持RESTful和gRPC,灵活组合。
掌握了这些步骤,就能在.NET Core项目中充分利用gRPC的优势,构建出高效的分布式系统。
WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,
Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。
REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。
Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator
Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。
Adobe Bridge 是 Adobe 推出的创意资产管理工具,可集中预览、分类和查找照片、视频、PDF及多种设计文件,并支持元数据、关键词、评级、批量重命名和格式导出。它可与 Photoshop、Illustrator 等应用衔接,













