.NET8中g(shù)RPC的使用方法詳解
在現(xiàn)代分布式系統(tǒng)中,服務(wù)之間的通信是一個(gè)非常重要的環(huán)節(jié)。隨著微服務(wù)架構(gòu)的流行,服務(wù)之間的通信方式也在不斷演進(jìn)。gRPC作為一種高性能、跨語言的RPC框架,逐漸成為了我們的首選。
一、簡介
gRPC 是一種高性能、開源的遠(yuǎn)程過程調(diào)用(RPC)框架,基于 HTTP/2 協(xié)議,支持雙向流、頭部壓縮等特性。它默認(rèn)使用 Protocol Buffers(Protobuf)作為接口定義語言(IDL)和數(shù)據(jù)序列化格式,適用于微服務(wù)、實(shí)時(shí)通信等場景。
在 .NET Core(.NET 8)中,gRPC 提供了原生的支持,我們可以輕松創(chuàng)建 gRPC 服務(wù)端和客戶端,并將其集成到 Web API 或其他應(yīng)用中。
本文將圍繞以下幾個(gè)方面介紹如何在 .NET Core (.NET 8) 中使用 gRPC:
- 創(chuàng)建 gRPC 服務(wù)端
- 創(chuàng)建 gRPC 客戶端
- 在 Web API 中集成 gRPC
二、創(chuàng)建 gRPC 服務(wù)端
1. 創(chuàng)建 gRPC 項(xiàng)目
首先,使用 .NET CLI 創(chuàng)建一個(gè) gRPC 服務(wù)端項(xiàng)目。也可以通過VS2022直接進(jìn)行創(chuàng)建。
dotnet new grpc -o GrpcDemo.Service cd GrpcDemo.Service
這將創(chuàng)建一個(gè)包含 gRPC 模板的項(xiàng)目,其中包含一個(gè)示例的 gRPC 服務(wù)。
2. 編寫自己的服務(wù)
在 Protos
文件夾中,默認(rèn)會(huì)生成一個(gè) greet.proto
文件。我們可以修改或創(chuàng)建新的 .proto
文件來定義自己的服務(wù)。
例如,創(chuàng)建一個(gè) 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; // 錯(cuò)誤信息 } //查詢訂單請求參數(shù) message QueryRequest{ int32 Id=1; } //查詢訂單返回結(jié)果 message QueryResult{ int32 Id=1; string OrderNo=2; string OrderName=3; double Price=4; }
接下來,在 Services
文件夾中實(shí)現(xiàn)服務(wù)邏輯。創(chuàng)建一個(gè) 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) { //報(bào)存數(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();
運(yùn)行項(xiàng)目后,gRPC 服務(wù)端將啟動(dòng)并監(jiān)聽指定的端口。
三、創(chuàng)建 gRPC 客戶端
1. 創(chuàng)建客戶端項(xiàng)目
使用 .NET CLI 創(chuàng)建一個(gè)控制臺(tái)項(xiàng)目作為 gRPC 客戶端:
dotnet new console -o GrpcDemo.Client cd GrpcDemo.Client
2. 添加 gRPC 客戶端依賴
在客戶端項(xiàng)目中,添加 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ù)制到客戶端項(xiàng)目的 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 項(xiàng)目中,可以同時(shí)提供 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ù)、實(shí)時(shí)通信等場景。我們可以輕松創(chuàng)建 gRPC 服務(wù)端和客戶端,并將其集成到 Web API 中。
關(guān)鍵點(diǎn):
- 使用
.proto
文件定義服務(wù)接口。 - 實(shí)現(xiàn) gRPC 服務(wù)端邏輯。
- 在客戶端中調(diào)用 gRPC 服務(wù)。
- 在 Web API 中集成 gRPC,提供 RESTful API 和 gRPC 服務(wù)。
通過以上步驟,我們就可以在 .NET Core 項(xiàng)目中充分利用 gRPC 的優(yōu)勢,構(gòu)建高效的分布式系統(tǒng)。
以上就是.NET8中g(shù)RPC的使用方法詳解的詳細(xì)內(nèi)容,更多關(guān)于.NET8 gRPC的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Excel自定義關(guān)閉按鈕實(shí)現(xiàn)代碼
這篇文章主要介紹了Excel自定義關(guān)閉按鈕實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12asp.net實(shí)現(xiàn)拒絕頻繁的IP訪問的方法
這篇文章主要介紹了asp.net實(shí)現(xiàn)拒絕頻繁的IP訪問的方法,涉及asp.net針對訪問IP的判斷及配置文件的設(shè)置技巧,需要的朋友可以參考下2016-04-04有潛在危險(xiǎn)的 Request.Form 值避免方法
在 .net framework 4.0中在 system.web 中加上httpRuntime requestValidationMode="2.0" 這句即可解決,需要的朋友可以了解下2013-12-12ASP.NET Core 1.0實(shí)現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了ASP.NET Core 1.0實(shí)現(xiàn)郵件發(fā)送功能的相關(guān)資料,需要的朋友可以參考下2016-07-07asp.net 因?yàn)閿?shù)據(jù)庫正在使用的解決方法
因?yàn)閿?shù)據(jù)庫正在使用,所以未能獲得對數(shù)據(jù)庫的排它訪問權(quán)?2009-02-02ASP.NET WebForm中<%=%>與<%#%>的區(qū)別
這篇文章主要介紹了ASP.NET WebForm中<%=%>與<%#%>的區(qū)別,需要的朋友可以參考下2015-01-01Asp.Net Core 通過中間件防止圖片盜鏈的實(shí)例
本篇文章主要介紹了Asp.Net Core 通過中間件防止圖片盜鏈的實(shí)例,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12