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

前言

上一篇 什麼是 gRPC,筆者大致介紹了 gRPC Service 的基本概念,這一次,我們就來小試一下身手,撰寫一個 Hello World (迷之音:嘗試新技術時,總是得先來一個 Hello World ~我不想違背這良好傳統阿阿阿阿)


使用環境

  • Visual Studio 2019
  • .NET Core 3.0.100-preview3-010431


開始進行

撰寫 gRPC 除了先準備好基礎環境、選定一種 作業系統/ 程式語言 Language 外、(Framework/SDK/Runtime)等環境備妥後,就可以開始撰寫,

(1). 開始撰寫 gRPC 第一步就是先定義 .proto 協議了

上一篇筆者提到,gRPC 的 Server 與 Client 必須使用相同的協議才可進行溝通,一般來說,你應該使用 protoc.exe 編譯器先行編譯過 greet.proto 協議檔,並產出 C# 程式碼檔案後才可繼續,而在 Visual Studio 2019 裡,拜 MSBuild 之賜,已經有人預先寫好 .Target 檔案了 (什麼是 MSBuild?什麼是附檔名 .Target 檔案可參考:MSBuild .targets 檔案

筆者先撰寫一個 SayHelloWorld 方法如下:

在協議裡,除了在 service Class 撰寫要公開存取的方法外,必須在提供『傳入訊息型態』、『回傳訊息型態』,這邊我先定義兩個 message,一個是『HelloMyFirstgRPC』、另一個是『HelloMyReply

在撰寫 proto 協議檔時,建議先決定 message 回傳型態與傳入的型態,那麼 Visual Studio 2019 會有 InteillSense 的完整支援。不得不說 Visual Studio 2019 在 .proto 協議編輯上的支援已經算不錯了。

注意:
一般來說,Visual Studio 2019 會在背景裡自動編譯 .proto 協議檔案,但始有可能不會有任何提示,所以您也可以自行使用命令列工具進行手動編譯,如下圖,若編譯失敗會出現錯誤訊息,如下圖顯示 return 關鍵字錯誤:

protoc.exe 編譯器 & 相關 MSBuild Tools 會隨著 NuGet 套件在 Visual Studio 2019 進行自動還原的時候,安裝在你的 User Profile 的 .nuget 快取路徑下:C:\Users\Gelis\.nuget\packages\grpc.tools\1.19.0-pre1

我目前安裝的是 preview 1

我的完整的 protoc.exe 編譯器路徑是:"C:\Users\Gelis\.nuget\packages\grpc.tools\1.19.0-pre1\tools\windows_x64\protoc.exe"

而手動進編譯成功的情況如下:


(2). 撰寫 C# 的伺服器方法

完成 .proto 協議之後,沒有實際的 C# 伺服器方法,程式還是跑不起來的,所以我們必須在 GreeterService.cs 裡,加入一個 SayHelloworld 方法,如下:



(3). 撰寫 Client

完成 Server 端的伺服器方法後,當然就是接著住撰寫 Client 呼叫的程式碼了,Visual Studio 2019 在這裡都有完整的 InteillSense 的支援,不得不再說一次 XD,實在太棒了!

最後,完成的 Client 完整程式碼如下:

如上程式碼,由於是拿 Visual Studio 2019 內建範本來練習,紅色部分是增加的部分。在呼叫遠端方法時,建立 HelloMyFirstgRPC() 類別時,我們傳入的 UserName 就是我們在 greet.proto 協議中所定義的回傳 message 中,我們自己給的,還記得嗎?

到這裡,基本上就完成了。


(4). 測試程式

我們先將 Server 執行起來,再到 "bin\Debug\netcoreapp3.0" 路徑下,執行 "gRPCServer.Client.exe" ,如果沒有任何意外,應該可以將 UserName 傳入至 Server 中,由 Server 的伺服器端方法重新組字串 "test My gRPC"+UserName 並回傳至 Client 的 .NET Core 3.0 的 Console App 並秀出結果 。

執行結果如下:

程式也如預期般運作,如何?是不是非常的容易?


後記:

這雖然不是非常新的協定,目前開發上仍然不是那麼普及,不過在某些大型企業內部已經高效運轉中,雖然的的優勢就是在成為標準之前就已經在許多實務上經過許多考驗,但是面對許多各種(協定/標準)的競爭下,會不會脫穎而出還有待觀察。




關於 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 範本設計

留言

這個網誌中的熱門文章

從 Semantic Kernel 談 AI 浪潮下的開發人員的挑戰

什麼是 gRPC ?