.NET8中g(shù)RPC的使用方法詳解
在現(xiàn)代分布式系統(tǒng)中,服務(wù)之間的通信是一個非常重要的環(huán)節(jié)。隨著微服務(wù)架構(gòu)的流行,服務(wù)之間的通信方式也在不斷演進。gRPC作為一種高性能、跨語言的RPC框架,逐漸成為了我們的首選。
一、簡介
gRPC 是一種高性能、開源的遠程過程調(diào)用(RPC)框架,基于 HTTP/2 協(xié)議,支持雙向流、頭部壓縮等特性。它默認使用 Protocol Buffers(Protobuf)作為接口定義語言(IDL)和數(shù)據(jù)序列化格式,適用于微服務(wù)、實時通信等場景。
在 .NET Core(.NET 8)中,gRPC 提供了原生的支持,我們可以輕松創(chuàng)建 gRPC 服務(wù)端和客戶端,并將其集成到 Web API 或其他應(yīng)用中。
本文將圍繞以下幾個方面介紹如何在 .NET Core (.NET 8) 中使用 gRPC:
- 創(chuàng)建 gRPC 服務(wù)端
- 創(chuàng)建 gRPC 客戶端
- 在 Web API 中集成 gRPC
二、創(chuàng)建 gRPC 服務(wù)端
1. 創(chuàng)建 gRPC 項目
首先,使用 .NET CLI 創(chuàng)建一個 gRPC 服務(wù)端項目。也可以通過VS2022直接進行創(chuàng)建。
dotnet new grpc -o GrpcDemo.Service cd GrpcDemo.Service

這將創(chuàng)建一個包含 gRPC 模板的項目,其中包含一個示例的 gRPC 服務(wù)。

2. 編寫自己的服務(wù)
在 Protos 文件夾中,默認會生成一個 greet.proto 文件。我們可以修改或創(chuàng)建新的 .proto 文件來定義自己的服務(wù)。
例如,創(chuàng)建一個 order.proto 文件:
syntax = "proto3";
option csharp_namespace = "GrpcDemo.Service";
package order;
// 訂單服務(wù)定義
service Order {
// 創(chuàng)建訂單
rpc CreateOrder (CreateRequest) returns (CreateResult);
//查詢訂單
rpc QueryOrder (QueryRequest) returns (QueryResult);
}
//創(chuàng)建訂單請求參數(shù)
message CreateRequest {
string OrderNo = 1;
string OrderName=2;
double Price=3;
}
//創(chuàng)建訂單返回結(jié)果
message CreateResult {
bool IsSuccess = 1; // 是否成功
string Message = 2; // 錯誤信息
}
//查詢訂單請求參數(shù)
message QueryRequest{
int32 Id=1;
}
//查詢訂單返回結(jié)果
message QueryResult{
int32 Id=1;
string OrderNo=2;
string OrderName=3;
double Price=4;
}
接下來,在 Services 文件夾中實現(xiàn)服務(wù)邏輯。創(chuàng)建一個 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>
/// 創(chuàng)建訂單
/// </summary>
/// <param name="request"></param>
/// <param name="context"></param>
/// <returns></returns>
public override Task<CreateResult> CreateOrder(CreateRequest request, ServerCallContext context)
{
//報存數(shù)據(jù)庫 todo
return Task.FromResult(new CreateResult
{
IsSuccess = true,
Message = "訂單創(chuàng)建成功"
});
}
/// <summary>
/// 查詢訂單
/// </summary>
/// <param name="request"></param>
/// <param name="context"></param>
/// <returns></returns>
public override Task<QueryResult> QueryOrder(QueryRequest request, ServerCallContext context)
{
//查詢數(shù)據(jù)庫 //todo
return Task.FromResult(new QueryResult
{
Id = request.Id,
OrderNo = DateTime.Now.ToString("yyyyMMddHHmmss"),
OrderName = "年貨大禮包",
Price = 699
});
}
}
}在 Program.cs 中注冊服務(wù):
using GrpcDemo.Service.Services; var builder = WebApplication.CreateBuilder(args); // 添加 gRPC 服務(wù) builder.Services.AddGrpc(); var app = builder.Build(); // 映射 gRPC 服務(wù) app.MapGrpcService<OrderService>(); app.Run();
運行項目后,gRPC 服務(wù)端將啟動并監(jiān)聽指定的端口。
三、創(chuàng)建 gRPC 客戶端
1. 創(chuàng)建客戶端項目
使用 .NET CLI 創(chuàng)建一個控制臺項目作為 gRPC 客戶端:
dotnet new console -o GrpcDemo.Client cd GrpcDemo.Client
2. 添加 gRPC 客戶端依賴
在客戶端項目中,添加 Grpc.Net.Client 和 Google.Protobuf 包:
dotnet add package Grpc.Net.Client dotnet add package Google.Protobuf dotnet add package Grpc.Tools
將服務(wù)端的 order.proto 文件復(fù)制到客戶端項目的 Protos 文件夾中,并在 .csproj 文件中添加以下內(nèi)容以生成 C# 代碼:

3. 編寫客戶端代碼
在 Program.cs 中編寫 gRPC服務(wù)HTTPS調(diào)用的代碼:
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
//常規(guī)使用,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服務(wù)https的調(diào)用結(jié)果:{reply.IsSuccess},message:{reply.Message}");
}
Console.ReadKey();
}
結(jié)果:

如果 gRPC 服務(wù)端使用 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內(nèi)網(wǎng)http調(diào)用結(jié)果:{reply.IsSuccess},message:{reply.Message}");
}
Console.ReadKey();
結(jié)果:

四、Web API 中加入 gRPC
在 Web API 項目中,可以同時提供 RESTful API 和 gRPC 服務(wù)。以下是如何在 Web API 中集成 gRPC 的步驟:
1. 添加 gRPC 服務(wù)
在 Program.cs 中注冊 gRPC 服務(wù):
var builder = WebApplication.CreateBuilder(args); // 添加 gRPC 服務(wù) builder.Services.AddGrpc(); var app = builder.Build(); // 映射 gRPC 服務(wù) app.MapGrpcService<OrderService>(); app.Run();
2. 提供 RESTful API
在 Web API 中,可以通過控制器提供 RESTful API,并在內(nèi)部調(diào)用 gRPC 服務(wù):
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<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");
});
結(jié)果:

總結(jié)
在 .NET Core 中,gRPC 提供了高性能的通信方式,適用于微服務(wù)、實時通信等場景。我們可以輕松創(chuàng)建 gRPC 服務(wù)端和客戶端,并將其集成到 Web API 中。
關(guān)鍵點:
- 使用
.proto文件定義服務(wù)接口。 - 實現(xiàn) gRPC 服務(wù)端邏輯。
- 在客戶端中調(diào)用 gRPC 服務(wù)。
- 在 Web API 中集成 gRPC,提供 RESTful API 和 gRPC 服務(wù)。
通過以上步驟,我們就可以在 .NET Core 項目中充分利用 gRPC 的優(yōu)勢,構(gòu)建高效的分布式系統(tǒng)。
以上就是.NET8中g(shù)RPC的使用方法詳解的詳細內(nèi)容,更多關(guān)于.NET8 gRPC的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ASP.NET Core 1.0實現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細介紹了ASP.NET Core 1.0實現(xiàn)郵件發(fā)送功能的相關(guān)資料,需要的朋友可以參考下2016-07-07
asp.net 因為數(shù)據(jù)庫正在使用的解決方法
因為數(shù)據(jù)庫正在使用,所以未能獲得對數(shù)據(jù)庫的排它訪問權(quán)?2009-02-02
ASP.NET WebForm中<%=%>與<%#%>的區(qū)別
這篇文章主要介紹了ASP.NET WebForm中<%=%>與<%#%>的區(qū)別,需要的朋友可以參考下2015-01-01

