使用 C# 建立 gRPC 服務

1. 總覽

gRPC 是由 Google 開發的遠端程序呼叫 (RPC) 架構和工具集,支援各種語言、平台中立的遠端程序呼叫,可讓您使用通訊協定緩衝區 (通訊協定緩衝區) 定義服務。通訊協定緩衝區是特別強大的二進位序列化工具集和語言。然後,您就可以透過各種語言的服務定義,產生慣用的用戶端和伺服器虛設常式。

在本程式碼研究室中,您將瞭解如何建構使用 gRPC 架構公開 API 的 C# 服務。您會透過以 C# 編寫的主控台用戶端與這項服務互動,且該用戶端與服務說明與服務相同。

課程內容

  • 通訊協定緩衝區語言。
  • 如何使用 C# 實作 gRPC 服務。
  • 如何使用 C# 實作 gRPC 用戶端。
  • 如何更新 gRPC 服務。

軟硬體需求

您會如何使用這個教學課程?

僅供閱讀 閱讀並完成練習

您對 Google Cloud Platform 的使用感想為何?

新手 中級 還算容易

2. 下載並建構 gRPC C# 範例

下載範例

下載 gRPC C# 範例存放區做為 ZIP 檔案,然後解壓縮。

或者,您也可以複製其 Git 存放區。

git clone https://github.com/meteatamel/grpc-samples-dotnet.git

無論採用哪種方式,您都應該擁有包含以下內容的 grpc-samples-dotnet 資料夾:

d056832ff4ce0c8f.png

建構解決方案

範例應用程式資料夾包含 Visual Studio 解決方案 GrpcSamples.sln。按兩下即可在 Visual Studio 中開啟解決方案。您應該會看到包含數個專案的解決方案。

61da9ddc86c08019.png

我們會在下一節詳細說明專案,但先來建構專案。前往 Build > Build SolutionCtrl + Shift + B 建構解決方案。這項操作會從 NuGet 下載所有依附元件,然後編譯應用程式。

最後,您應該會在 Visual Studio 主控台輸出內容中看到 Build succeeded 訊息。

3. 探索希臘式範例

Greeter 是一個簡單的 gRPC 範例,其中用戶端會傳送具有名稱的要求,而伺服器會回應,後面附上名稱的訊息。有一個 Greeter 專案,其中包含用戶端和伺服器的基礎服務定義 (proto 檔案)。

Greeter 專案

這是用戶端與伺服器共用的通用專案。其 greeter.proto 是用戶端和伺服器使用的 gRPC 服務定義。服務定義定義了名為 GreetingService 的 gRPC 服務,且採用 greeting 方法,以 HelloRequest 做為輸入內容及 HelloResponse 輸出。

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
}

此為一元 (即不使用串流) 方法,可讓用戶端傳送單一要求,並從伺服器取得一項回應。您可以探索 greeter.proto. 的其他內容。這項專案也提供名為 generate_protos.bat 的指令碼,可用於從 proto 檔案產生用戶端和伺服器虛設常式。專案已包含產生的用戶端和伺服器虛設常式,因此您不必自行產生。不過,如果您對服務定義檔案進行變更,就必須執行這段指令碼才能重新產生虛設常式。

希臘伺服器

這是 gRPC 伺服器的專案。Program.cs 是設定通訊埠和伺服器實作項目的主要進入點。重要的類別是 GreeterServiceImpl.cs。這種 greeting 方法會實作實際功能。

public override Task<HelloResponse> greeting(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Hello " + request.Name });
}

希臘用戶端

這是 gRPC 服務的用戶端。而且還有 Program.cs 做為進入點。它會建立一個頻道來與伺服器通訊,然後依據產生的虛設常式建立頻道的用戶端。然後建立一個要求,並使用用戶端虛設常式傳送至伺服器。

4. 執行 Greeter 範例

首先,請啟動 Greeter Server。開啟命令提示字元視窗,然後前往 Greeter 伺服器的 bin > Debug 資料夾,執行執行檔。您應該會看到伺服器正在監聽。

> C:\grpc-samples-dotnet\GreeterServer\bin\Debug>GreeterServer.exe
GreeterServer listening on port 50051
Press any key to stop the server...

接下來,執行 Greeter Client。在另外的命令提示字元中,前往 Greeter 的 bin > Debug 資料夾,然後執行執行檔。您應該會看到傳送要求的用戶端,並接收來自伺服器的回應。

> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
Press any key to exit...

5. 更新 Greeter 範例

讓我們來瞭解一下服務更新過程。將新方法新增至 gRPC 服務,稱為「再見」。這個方法會傳回「再見了」,而不會傳回用戶端的 Hello。

首先請更新服務定義檔案 greeter.proto.

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
    
    rpc goodbye(HelloRequest) returns (HelloResponse);
}

接下來,您需要重新產生用戶端與伺服器虛設常式。在命令提示字元中執行 generate_protos.bat。產生虛設常式後,您可能需要重新整理 Visual Studio 專案,才能取得更新後的程式碼。

最後,更新用戶端和伺服器程式碼,以便利用新的方法。在服務中更新 GreeterServiceImpl.cs,並新增 goodbye 方法。

public override Task<HelloResponse> goodbye(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Goodbye " + request.Name });
}

在用戶端中,呼叫 Program.cs. 中的 goodbye 方法

response = client.goodbye(request);
Console.WriteLine("GreeterClient received response: " 
                       + response.Greeting);

請重新建構專案,然後再次執行伺服器和用戶端。您應該會看到客戶收到告別訊息。

> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
GreeterClient received response: Goodbye Mete - on C#
Press any key to exit...

6. 探索 Chat 範例

解決方案中還有 ChatServerChatWindowsClient 專案。顧名思義,這是適用於簡易即時通訊應用程式的用戶端與伺服器配對。「Chat」專案含有名為「chat.proto」的服務定義檔案。這會使用 chat 方法定義 ChatService

service ChatService {
 rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer);
}

重要的是,傳入和傳出的即時通訊訊息都會加上 stream 關鍵字標記。這麼做基本上會將連線轉換為雙向資料流,用戶端和伺服器可隨時互相傳送訊息;最適合即時通訊應用程式的解決方案

您可以進一步探索範例、建構並執行該範例,瞭解它在運動中的表現。

7. 恭喜!

涵蓋內容

  • 通訊協定緩衝區語言。
  • 如何使用 C# 實作 gRPC 服務。
  • 如何使用 C# 實作 gRPC 用戶端。
  • 如何更新 gRPC 服務。

後續步驟