.NET8中gRPC的使用
在当代分布式体系中,服务之间的通信是一个非常重要的环节。随着微服务架构的盛行,服务之间的通信方式也在不停演进。gRPC作为一种高性能、跨语言的RPC框架,渐渐成为了我们的首选。一、简介
gRPC 是一种高性能、开源的远程过程调用(RPC)框架,基于 HTTP/2 协议,支持双向流、头部压缩等特性。它默认使用 Protocol Buffers(Protobuf)作为接口界说语言(IDL)和数据序列化格式,适用于微服务、及时通信等场景。
在 .NET Core(.NET 8)中,gRPC 提供了原生的支持,我们可以轻松创建 gRPC 服务端和客户端,并将其集成到 Web API 或其他应用中。
本文将围绕以下几个方面介绍如何在 .NET Core (.NET 8) 中使用 gRPC:
[*]创建 gRPC 服务端
[*]创建 gRPC 客户端
[*]在 Web API 中集成 gRPC
二、创建 gRPC 服务端
1. 创建 gRPC 项目
起首,使用 .NET CLI 创建一个 gRPC 服务端项目。也可以通过VS2022直接举行创建。
dotnet new grpc -o GrpcDemo.Service
cd GrpcDemo.Servicehttps://fastly.jsdelivr.net/gh/bucketio/img3@main/2025/01/25/1737795543433-38c57f50-626b-4fe2-9890-6431ef5ffa08.png
这将创建一个包含 gRPC 模板的项目,此中包含一个示例的 gRPC 服务。
https://fastly.jsdelivr.net/gh/bucketio/img14@main/2025/01/25/1737795586791-5bda56fb-ee3c-453e-a503-2121a7d4542d.png
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<OrderService> _logger;
public OrderService(ILogger<OrderService> logger)
{
_logger = logger;
}
/// <summary>
/// 创建订单
/// </summary>
/// <param name="request"></param>
/// <param name="context"></param>
/// <returns></returns>
public override Task<CreateResult> CreateOrder(CreateRequest request, ServerCallContext context)
{
//报存数据库 todo
return Task.FromResult(new CreateResult
{
IsSuccess = true,
Message = "订单创建成功"
});
}
/// <summary>
/// 查询订单
/// </summary>
/// <param name="request"></param>
/// <param name="context"></param>
/// <returns></returns>
public override Task<QueryResult> 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<OrderService>();
app.Run();运行项目后,gRPC 服务端将启动并监听指定的端口。
三、创建 gRPC 客户端
1. 创建客户端项目
使用 .NET CLI 创建一个控制台项目作为 gRPC 客户端:
dotnet new console -o GrpcDemo.Client
cd GrpcDemo.Client2. 添加 gRPC 客户端依赖
在客户端项目中,添加 Grpc.Net.Client 和 Google.Protobuf 包:
dotnet add package Grpc.Net.Client
dotnet add package Google.Protobuf
dotnet add package Grpc.Tools将服务端的 order.proto 文件复制到客户端项目的 Protos 文件夹中,并在 .csproj 文件中添加以下内容以生成 C# 代码:
https://fastly.jsdelivr.net/gh/bucketio/img1@main/2025/01/25/1737795484246-8c31c246-9159-4b32-9200-0681eaf2f89b.png
3. 编写客户端代码
在 Program.cs 中编写 gRPC服务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();
}结果:
https://fastly.jsdelivr.net/gh/bucketio/img8@main/2025/01/25/1737795409412-de4df56d-e5fe-406f-8d77-8cc2d90548fc.jpg
如果 gRPC 服务端使用 HTTP(非 HTTPS),可以在客户端中直接使用 HTTP 地址:
//使用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();结果:
https://fastly.jsdelivr.net/gh/bucketio/img17@main/2025/01/25/1737795381222-19b769b5-f4d3-4cab-8a03-9977341584a0.jpg
四、Web API 中加入 gRPC
在 Web API 项目中,可以同时提供 RESTful API 和 gRPC 服务。以下是如何在 Web API 中集成 gRPC 的步骤:
1. 添加 gRPC 服务
在 Program.cs 中注册 gRPC 服务:
var builder = WebApplication.CreateBuilder(args);
// 添加 gRPC 服务
builder.Services.AddGrpc();
var app = builder.Build();
// 映射 gRPC 服务
app.MapGrpcService<OrderService>();
app.Run();2. 提供 RESTful API
在 Web API 中,可以通过控制器提供 RESTful API,并在内部调用 gRPC 服务:
using Microsoft.AspNetCore.Mvc;
namespace GrpcDemo.API.Controllers
{
")]
public class OrderController : ControllerBase
{
private readonly Order.OrderClient _client;
public OrderController(Order.OrderClient client)
{
_client = client;
}
public async Task<IActionResult> CreateOrder()
{
var response = await _client.CreateOrderAsync(
new CreateRequest {
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
OrderName = "年货大礼包",
Price = 699
});
return Ok(response);
}
}
}3. 配置 gRPC 客户端
在 Program.cs 中注册 gRPC 客户端:
builder.Services.AddGrpcClient<Order.OrderClient>(options =>
{
options.Address = new Uri("http://localhost:5147");
});结果:
https://fastly.jsdelivr.net/gh/bucketio/img19@main/2025/01/25/1737795335855-1ee4db8c-3adc-421d-a967-3f9b6393f244.jpg
总结
在 .NET Core 中,gRPC 提供了高性能的通信方式,适用于微服务、及时通信等场景。我们可以轻松创建 gRPC 服务端和客户端,并将其集成到 Web API 中。
关键点:
[*]使用 .proto 文件界说服务接口。
[*]实现 gRPC 服务端逻辑。
[*]在客户端中调用 gRPC 服务。
[*]在 Web API 中集成 gRPC,提供 RESTful API 和 gRPC 服务。
通过以上步骤,我们就可以在 .NET Core 项目中充分利用 gRPC 的优势,构建高效的分布式体系。
源码地址:https://github.com/liyongqiang-cc/GrpcDemo
https://img2024.cnblogs.com/blog/2063798/202503/2063798-20250319094748394-306274407.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]