什麼是 gRPC ?

圖片取自:https://grpc.io/docs/guides/

gRPC 是什麼?能吃嗎?

在安裝了 .NET Core 3.0 之後,眼尖的朋友應該會發現,在新增 ASP.NET Core 網頁類型專案裡,會看見一個 gRPC Service 類型的專案,其實它也不是什麼很新的東西,早在十多年前 Google 就使用這樣的 RPC 協定進行一些大量的可靠性微服務的存取,聽到這,難道現有的 Web API 不可靠嗎?其實不是的,它主要用在移動設備等提供高效簡單且跨平台的通訊與熱插拔的驗證機制。


gRPC 的運作原理

gRPC 顧名思義,是種基於 RPC 的通訊協定,不同於 Web API 走的傳統 HTTP 基礎協定,它有點像是 Socket ,但應該說是基於 Socket,或精確地來說它是基於 HTTP/2 的協定,gRPC 是種協議緩衝協定,它必須事先定義 IDL (Interface Definition Language) 描述檔,看到 IDL 對於一些熟悉 COM/DCOM 的朋友一定非常的熟悉,對!沒錯!就是類似的東西!但,這邊的 IDL 是用一種副檔名為 .proto 檔案來是先定義在分散式環境中,要傳輸的序列化結構資訊,當然它也可以跟 JSON 一起使用。

也就是說,要使用 gRPC 您必須先定義 .proto 協議,然後透過 Compile 的支援,編譯成特定語言框架。而很高興的是,C# 也支援了,然而其實根據官方的資料顯示,C# 應該在 .NET Core 2.1 開始就支援了,只是到了 .NET Core 3.0 才有樣版的支援。

而使用 gRPC 的協議緩衝區的服務可以做到 Stub 的機制,也就是說,它就像是許多 RPC 一樣,Client 在呼叫 Server 端時,其實是對 Stub 進行叫用,Stub 在這就像個緩衝區一般,但更細部的說,應該是一個遠程服務的替身,這應該又讓許多熟悉 COM/RPC 通訊的朋友覺得熟悉了起來,是的!沒有錯。


在 .NET Core 3.0 裡使用 gRPC

目前支援 .proto 擴展為 gRPC 協議緩衝區的編譯器只有 .NET Core 了根據 Github 上的說明 .NET Framework 4.5+ 以上或 Mono 4+ 以上也可支援,而 gRPC 也完全的跨平台。要在 .NET Core 3.0 裡建立非常容易,因為已經有內建範本的支援了,就是建立一個 ASP.NET Core 3.0 類型的 Web 專案,選擇 gRPC Service 即可。

建立好的專案會有兩個:一個就是 gRPC 的 Server,另一個就是 gRPC 的 Client

在範例程式碼當中,可以看到 Server 與 Client 同時都定義了 greet.proto 檔案,這是它們彼此溝通的協議,預設的範本裡定義的一個類別 Greeter ,並提個一個 SayHello 方法。

.proto 協議可以被編譯特定平台的語言,在這裡我們可以經由 Visual Studio 看到 greet.proto 被編譯的結果。

當 NuGet 還原如果完成,應該可以直接執行,它不是走 HTTP 協定,所以無法使用 PostMan 進行測試,gRPC Server 執行畫面如下。

這時候我們可以 Run 起 Client 來對 gRPC Server 進行 SayHello 的呼叫,他會接受 Server 回傳的 message 內容,並顯示在 Console 畫面中。

很有趣,對吧?待續…

下次,我們再討論一些實際的應用。


References:

https://grpc.io/docs/guides/

https://grpc.io/docs/quickstart/csharp.html

https://developers.google.com/protocol-buffers/docs/overview

https://grpc.io/about/

https://grpc.io/blog/principles

https://github.com/grpc/grpc/tree/master/src/csharp




關於 Gelis:

資深 .NET 技術顧問

FB 社團 (軟體開發之路):

https://www.facebook.com/groups/361804473860062/

FB 粉絲團 (Gelis 的程式設計訓練營):

https://www.facebook.com/gelis.dev.learning/

我講授過的課程 SlideShare:

https://www.slideshare.net/GelisWu


以下是我經營的項目與內容:

(1). 企業內訓課程

(2). 專業顧問


企業內訓課程:

1. .NET Core 3.1 從入門到進階

先前實體課程連結

2. 跨平台的 Web API Framework 框架設計

先前實體課程連結

3. 決戰 OOAD 系列課程 - 使用 UML

先前實體課程連結

4. 單元測試 UnitTest 與 Moq 物件實務課程

先前實體課程連結

5. 快速開發系列 - C# Project Templates 範本設計

留言

這個網誌中的熱門文章

什麼是 gRPC(二)- 來撰寫第一個 Hello World 吧!

常見的程式碼壞味道(Code Smell or Bad Smell)