gRPC by .net core 3.x——概念、語法、編譯

預備鏟屎官發表於2020-07-03

什麼是grpc?

grpc來自大名鼎鼎的谷歌,孵化於CNCF基金會(docker、k8s同樣出自這個基金會)。它是一款高效能、開源、通用的rpc框架,你可以通過它來定義rpc的請求和響應。它基於http/2,全雙工通訊、低延遲、高效率、支援流、可輕鬆的插入身份認證、負載均衡、監控日誌等等等等。。。關鍵是它還可以跨語言操作。只要server端或client端是它支援的語言編寫,都可以跨語言操作。官方支援的開發語言:

什麼是rpc?

rpc,全稱Remote Procedure Call,通過它,你可以像呼叫本地方法一樣呼叫遠端服務。前端可以呼叫後端方法,後端也可以呼叫前端方法。其實這個概念並不陌生,上一篇關於web實時應用的文章也提到了這個概念,並實現了前後端互調的操作。

在正式開始使用grpc之前,我們還需要掌握protocol buffer的概念。

為什麼用protocol buffer?

因為grpc採用合約優先的API開發模式,預設採用protocol buffer作為介面設計語言,我們可以在proto檔案裡定義訊息和服務。當然,作為預設選項,它自然是有優勢的,主要是這些:

1、語法簡單,容易上手。

2、可生成所有(官方稱)主流開發語言的程式碼。

3、二進位制格式,效率高的同時也很適合大資料傳輸。

瞭解完基礎以後,先上一個小demo參考一下:

syntax = "proto3";

import "aaa.proto";
option csharp_namespace
= "gRPCApiDemo.Protos"; package Demo; service Math{ rpc Add (AddRequest) returns (AddRespones); } message AddRequest{ int32 a=1; int32 b=2; } message AddRespones{ int32 a=1; repeated int32 b=2;
  reserved 3,4 to 10;
  reserved "phone";
}

解讀一下:

syntax:宣告當前使用的語法

import:引入其他proto

option csharp_namespace:打包以後類的名稱空間,優先順序高

package:打包以後類的名稱空間,優先順序低

service:宣告服務

rpc Add (AddRequest) returns (AddRespones):宣告一個rpc呼叫,接收AddRequest訊息,返回AddRespones訊息。

message:宣告訊息

int32:資料型別,常用的還有int64、float、string、bool等,有興趣的可以去查一下。

a=1:如果把a看作欄位名,那麼1相當於欄位名的別名。

repeated:可重複欄位。如果給b多個值,那麼b差不多相當於一個int型別的陣列,先後順序會被保留。

reserved:保留欄位,宣告以後的欄位名和別名都不允許再使用了。需要注意欄位名和別名不能一起宣告。

編譯proto

proto編譯的主要目的是生成程式碼。

首先是工具,點選這裡,選出適合自己系統的外掛,如圖:

 下載完以後隨便找個目錄解壓,然後把其中的bin目錄新增到環境變數裡:

如果在控制檯輸入protoc可以看到一堆資訊彈出來,就表示安裝成功了:

在我們使用protoc把proto檔案編譯成c#檔案之前,我們還需要做這些:

1、指定proto專案路徑。

可以用rotoc --IPath(或--proto_path)或者直接開啟控制檯轉到protoc安裝目錄。

2、指定生成檔案的型別和路徑。

protoc --csharp_out=cs grpcApi.proto   //如果有多個proto檔案想批量生成可以使用  *.proto

上面的cs是我新建的資料夾名(這個資料夾是建立在proto專案目錄下的),grpcApi.proto是自建的proto檔案,執行結果見圖:

成功以後會在指定的目錄下生成cs檔案,見圖:

 生成的檔案和proto檔案命名一樣,只不過首字母會自動大寫,開啟看看:

好吧能看懂的有限,所以看看就行了。

不過有一點千萬注意:這個cs檔案不要手動改不要手動改不要手動改!

關於應用

能使用編譯器生成程式碼就可以用了麼?其實還差很多。距離正式應用還差服務端和客戶端的編寫部署。

不過因為時間問題,在這一篇寫不完。下一篇再見~

相關文章