微服務之間的通信之gRPC
介紹
gRPC是一種與語言無關的高性能遠程程序呼叫 (RPC) 框架,gRPC是Google發布的基于HTTP 2.0傳輸層協議承載的高性能開源軟體框架,提供了支持多種編程語言的、對網路設備進行配置和納管的方法,由于是開源框架,通信的雙方可以進行二次開發,所以客戶端和服務器端之間的通信會更加專注于業務層面的內容,減少了對由gRPC框架實作的底層通信的關注,
gRPC 的主要優點是:
- 現代高性能輕量級 RPC 框架,
- 協定優先 API 開發,默認使用協議緩沖區,允許與語言無關的實作,
- 可用于多種語言的工具,以生成強型別服務器和客戶端,
- 支持客戶端、服務器和雙向流式處理呼叫,
- 使用 Protobuf 二進制序列化減少對網路的使用,
這些優點使 gRPC 適用于:
-
效率至關重要的輕量級微服務,
-
需要多種語言用于開發的 Polyglot 系統,
-
需要處理流式處理請求或回應的點對點實時服務,
以上摘自Microsoft Document
微服務中gRPC的互動程序

- 交換機在開啟gRPC功能后充當gRPC客戶端的角色,采集服務器充當gRPC服務器角色;
- 交換機會根據訂閱的事件構建對應資料的格式(GPB/JSON),通過Protocol Buffers進行撰寫proto檔案,交換機與服務器建立gRPC通道,通過gRPC協議向服務器發送請求訊息;
- 服務器收到請求訊息后,服務器會通過Protocol Buffers解譯proto檔案,還原出最先定義好格式的資料結構,進行業務處理;
- 資料梳理完后,服務器需要使用Protocol Buffers重編譯應答資料,通過gRPC協議向交換機發送應答訊息;
交換機收到應答訊息后,結束本次的gRPC互動,上圖展示的是gRPC互動程序的具體流程,這也是Telemetry觸發方式其中之一,稱為Dial-out模式,簡單地說,gRPC就是在客戶端和服務器端開啟gRPC功能后建立連接,將設備上配置的訂閱資料推送給服務器端,我們可以看到整個程序是需要用到Protocol Buffers將所需要處理資料的結構化資料在proto檔案中進行定義,
微服務中gRPC的使用
1、想要使用grpc首先需要先引入gRPC的包
引入包的方法是:選中服務--->打開管理庫程式包管理器--->選中瀏覽--->輸入 Grpc.AspNetCore --->選中第一個下載即可
注釋:兩個服務之間需要通信則這兩個服務都需要引入gRPC的包
2、添加gRPC檔案
在服務端中添加Protos檔案夾(存盤所有gRPC檔案),在檔案夾中添加一個 協議緩沖區檔案,檔案后綴為 .proto
設計 gRPC 的檔案語法,有關 gRPC 檔案語法的詳細資訊,參考一些國內的博客,如《Protobuf語言指南——.proto檔案語法詳解》,
我專案中使用的語法:
1 syntax = "proto3"; 2 3 option csharp_namespace = "BS.GrpcServices.WorkTask"; 4 5 package BS.GrpcServices.WorkTask; 6 7 service WorkTaskGrpc{ 8 rpc SubmitWorkTask(SubmitRequest) returns (SubmitResponse); 9 } 10 11 message SubmitRequest{ 12 string Id = 1; 13 int32 Survey = 2; 14 string OrderId = 3; 15 } 16 17 message SubmitResponse{ 18 bool Result = 1; 19 }
代碼詳解:
-
BS.GrpcServices.WorkTask:生成的程式集,供外部參考,引入方法:using BS.GrpcServices.WorkTask;
-
WorkTaskGrpc:程式集中的類,也是存盤服務之間通信的方法集,引入程式集后通過繼承當前類,則可以呼叫類中的方法
-
SubmitWorkTask:類中的方法,也是兩個服務之間通信的方法,通信的主要邏輯均存在當前方法中
-
SubmitRequest:Request默認代表傳入引數,Submit與方法相匹配
-
SubmitResponse:Response默認代表回傳值,Submit與方法相匹配
3、專案檔案配置
雙擊客戶端的服務專案,打開專案檔案(.csproj后綴的檔案),在檔案中輸入以下代碼:
<ItemGroup> <Protobuf Include="Protos\WorkTask.proto" GrpcServices="Server" /> </ItemGroup>
輸入完成之后保存即可;
雙擊客戶端的服務專案,打開專案檔案(.csproj后綴的檔案),在檔案中輸入以下代碼:
<ItemGroup> <Protobuf Include="..\BS.WorkTask.API\Protos\WorkTask.proto" GrpcServices="Client" Link="Protos\WorkTask.proto" /> </ItemGroup>
輸入完成之后保存即可;
4、Startup.cs檔案
客戶端打開Startup.cs檔案,輸入以下代碼:
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); //允許使用不加密的HTTP/2協議 services.AddGrpcClient<WorkTaskGrpc.WorkTaskGrpcClient>(options => { options.Address = new Uri(Configuration.GetValue<string>("ServiceUrls:WorkTaskAPI")); });
代碼注解:上述代碼是打通gRPC通信的最后一個關鍵點,客戶端通過以上方法與gRPC展開通信,才能訪問到服務端的gRPC程式集(BS.GrpcServices.WorkTask)
特別注意:上述代碼的第一行,備注為允許使用不加密的 HTTP/2協議 是一定不能忽略的,少了此行代碼通信則無法完成,因為gRPC就是通過當前協議來完成通信的
5、方法的實作
實作方法通過參考gRPC程式集,繼承 WorkTaskGrpc.WorkTaskGrpcBase 類,實作方法如下:
1 using BS.GrpcServices.WorkTask; 2 using Grpc.Core; 3 4 namespace BS.WorkTask.API.Services 5 { 6 public class WorkTaskService : WorkTaskGrpc.WorkTaskGrpcBase 7 { 8 public override async Task<SubmitResponse> SubmitWorkTask(SubmitRequest request, ServerCallContext context) 9 { 10 ,,,,,, 11 12 if(result.Succeeded) 13 return new SubmitResponse() { Result = true }; 14 else 15 return new SubmitResponse() { Result = false }; 16 } 17 } 18 }
呼叫方法通過參考gRPC程式集,創建 WorkTaskGrpc.WorkTaskGrpcClient 物件,通過物件呼叫類中的方法,呼叫方法如下:
1 using BS.GrpcServices.WorkTask; 2 3 namespace BS.ApiAggregator.Controllers 4 { 5 [Route("api/worktask")] 6 [ApiController] 7 public class WorkTaskController: ControllerBase 8 { 9 WorkTaskGrpc.WorkTaskGrpcClient _workTaskClient; 10 public WorkTaskController(WorkTaskGrpc.WorkTaskGrpcClient workTaskClient) 11 { 12 _workTaskClient = workTaskClient; 13 } 14 15 [HttpPost("submit")] 16 public async Task<IActionResult> SubmitAsync(GrpcServices.WorkTask.SubmitRequest request) 17 { 18 try 19 { 20 var clientResult = await _workTaskClient.SubmitWorkTaskAsync(request); 21 if (clientResult.Result) 22 { 23 ,,,,,, 24 return Ok(OperateResult.Success); 25 } 26 } 27 catch (Exception ex) 28 { 29 ,,,,, 30 } 31 } 32 } 33 }
提醒事項:
- 中間省略的代碼是處理邏輯,與gRPC無關
- 呼叫方法在客戶端內撰寫,實作方法在服務服務端被撰寫,兩個位置不可混淆
- 客戶端代表的是呼叫方,服務端代表的是被呼叫方
總結:
gRPC的配置相對來說比較復雜,對于一些服務比較少的微服務來說,不建議使用,可以通過傳統的httpclient通信即可,相對于純文本傳輸來說,gRPC傳輸的是二進制資料,使得傳輸資料體積小、負載低,保持更加緊湊和高效,對于傳入的引數較大的情況的話,用gRPC的話則顯得不夠靈活
文章參考自:https://blog.csdn.net/zhaobw831/article/details/101638695
https://baijiahao.baidu.com/s?id=1633335936037018920&wfr=spider&for=pc
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/4891.html
標籤:.NET Core
上一篇:遵守這些原則讓你開發效率提高一倍
