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

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

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服务端就会监听指定端口了。
再建一个控制台项目当客户端:
dotnet new console -o GrpcDemo.Client cd GrpcDemo.Client
需要引入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#代码的配置:

在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项目里可以同时提供RESTful API和gRPC服务,两者互不冲突。具体做法如下:
在Program.cs注册gRPC:
var builder = WebApplication.CreateBuilder(args); // 添加 gRPC 服务 builder.Services.AddGrpc(); var app = builder.Build(); // 映射 gRPC 服务 app.MapGrpcService(); app.Run();
通过控制器暴露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);
}
}
}
在Program.cs里注入客户端:
builder.Services.AddGrpcClient(options => { options.Address = new Uri("http://localhost:5147"); });
效果:

在.NET Core里,gRPC提供了一种高性能的通信方式,特别适合微服务和实时交互场景。从创建服务端、客户端,到集成到Web API,整个过程都很顺畅。
关键点总结:
.proto文件定义服务接口。GrpcChannel调用服务。掌握了这些步骤,就能在.NET Core项目中充分利用gRPC的优势,构建出高效的分布式系统。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8