gRPC之.Net6中的客戶端和服務端共用proto協議檔案

Qubernet發表於2023-03-14

1、?說明

在上一篇文章gRPC之.Net6中的初步使用介紹中,我們簡單的介紹了gRPC在服務端、客戶端以及Web專案中的使用。

有一個問題,不知道大家發現沒有,就是不管在服務端專案還是客戶端專案中,我們都需要建立相同的proto協議檔案,這樣就會顯得很麻煩,有沒有一種辦法只建立一次proto協議檔案呢?答案是肯定的:有。

在介紹實現之前,建議大家先檢視一下前一篇文章gRPC之.Net6中的初步使用介紹,方便後面關聯性的講解。


2、?實現

2.1、?新建類庫專案

首先我們新建一個名稱為Quber.Grpc.Common的類庫專案,目的就是用於存放proto協議檔案協議檔案生成的對應類檔案,如下圖所示:

image

image

image

2.2、?新增引用

接下來我們在Quber.Grpc.Common的類庫專案中分別新增如下引用:

Google.Protobuf
Grpc.Core.Api
Grpc.Tools

image

2.3、?建立proto協議檔案

我們在Quber.Grpc.Common類庫專案中新建一個資料夾Protos,用於存放各種proto協議檔案,然後我們把Quber.Grpc.Service專案中的user.proto協議檔案複製過來,複製過來後,將user.proto協議檔案中的名稱空間修改為Quber.Grpc.Common.Protos和該類庫保持一致),如下圖所示:

image

2.4、?修改協議檔案屬性

滑鼠右鍵user.proto協議檔案,選擇屬性(或者滑鼠選中user.proto協議檔案,然後按ALT+Enter快捷鍵開啟檔案屬性窗體),在開啟的屬性窗體中,將Build Action選項設定為Protobuf compiler,將gRPC Stub Classes選項設定為Client and Server,然後點選應用確定即可,如下圖所示:

image

此時,我們雙擊Quber.Grpc.Common類庫專案,在專案檔案中,我們會發現有一個Protobuf節點設定,並且該節點中的GrpcServices屬性值為BothBoth表示我們剛才選擇的Client and ServiceClient表示客戶端,Service表示服務端),如下圖所示:

image

注意:如果專案的編輯檔案中,沒有Protobuf節點設定,請手動增加進去,不然到時候在生成的時候不會生成協議檔案對應的類檔案

2.5、?生成專案

此時我們重新生成下Quber.Grpc.Common類庫專案,會發現在obj\Debug\net6.0\Protos目錄下生成了user.proto協議檔案對應的2個類檔案,如下圖所示:

image

2.6、?改造服務端和客戶端專案

  1. 改造Quber.Grpc.Service專案

    Quber.Grpc.Service專案中,我們新增對Quber.Grpc.Common類庫專案的引用,如下圖所示:

    image

    然後我們將Quber.Grpc.Service專案中的整個Protos資料夾刪除掉,如下圖所示:

    image

    修改UserService.cs服務檔案中的名稱空間,如下圖所示:

    image

    此時我們注意到User.UserBaseUserInfoResultUserInfoRequest都來自我們新建的Quber.Grpc.Common類庫專案。

    執行Quber.Grpc.Service專案,如下圖所示:

    image

    如上圖所示,Quber.Grpc.Service服務端就執行成功了。

  2. 改造Quber.Grpc.Client專案

    Quber.Grpc.Client專案中,我們新增對Quber.Grpc.Common類庫專案的引用,如下圖所示:

    image

    然後我們將Quber.Grpc.Client專案中的整個Protos資料夾刪除掉,如下圖所示:

    image

    修改服務檔案UserTest.csUserTestIoc.cs以及啟動檔案Program.cs中的名稱空間,如下圖所示:

    image

    image

    image

    此時我們注意到User.UserClientUserInfoRequest都來自我們新建的Quber.Grpc.Common類庫專案。

    執行Quber.Grpc.Client專案,如下圖所示:

    image

    如上圖所示,Quber.Grpc.Client客戶端就執行成功了。


同理,我們可以將Quber.Grpc.Web專案也按照上述說明進行調整,此處就不一一演示了。

??????透過上述步驟的演示,我們就達到了客戶端和服務端公用一份proto協議檔案的目的,就不用在每個專案中新建相同的proto協議檔案了,後期只需要維護一份proto協議檔案即可。

相關文章