一直以來我們使用 gRPC 來進(jìn)行微服務(wù)開發(fā)目锭,對 gRPC
有過了解應(yīng)該清楚它依賴 proto
接口定義文件來實(shí)現(xiàn)的评汰,在進(jìn)行服務(wù)調(diào)用之前,需要先通過 proto
文件來生成當(dāng)前服務(wù)使用語言的代碼痢虹,然后就可以實(shí)現(xiàn)調(diào)用本地方法一樣調(diào)用遠(yuǎn)程服務(wù)被去。(.NET Core 3.0 開始已支持不用手動生成代碼就可以調(diào)用方法,但在多語言的微服務(wù)開發(fā)中奖唯,proto
文件的維護(hù)還是比較傾向我們目前的方式)
在 .NET 開發(fā)中惨缆,我們之前的方式還是根據(jù) proto
文件手動生成代碼,接著生成 NuGet Package 丰捷,然后推送到自己的私有 NuGet 倉庫坯墨,最后在服務(wù)內(nèi)進(jìn)行 NuGet Package 安裝來引用,這樣不至于需要依賴此服務(wù)的服務(wù)每次都 copy 代碼瓢阴,目的是在服務(wù)引用上簡化一些步驟畅蹂。
但問題又來了,要最終實(shí)現(xiàn)推送到自己的私有 NuGet 倉庫的步驟實(shí)在太多荣恐,這樣依然效率低下液斜,最后我們決定還是自己開發(fā)一個 VS 插件 Grpc Proto To NuGet Package ,功能就是一鍵生成 NuGet Package 并發(fā)布到私有倉庫叠穆。
實(shí)現(xiàn)方案
創(chuàng)建
gRPC
接口生成的項(xiàng)目模板少漆,關(guān)于 .NET 項(xiàng)目模板創(chuàng)建可參考文章:ASP.NET 自定義項(xiàng)目模板 ;創(chuàng)建 VS 擴(kuò)展插件
Grpc Proto To NuGet Package
硼被;右鍵選中
proto
接口定義文件所在的文件夾(所有proto
文件中定義的package
名暫必須一致示损,公共proto
文件暫只能放在根目錄的common
文件夾下),在右鍵菜單中點(diǎn)擊Grpc Proto To NuGet Package
嚷硫,首次需要配置私有 NuGet 倉庫源地址和 API Key检访,然后根據(jù)package
名自動創(chuàng)建基于項(xiàng)目模板的臨時項(xiàng)目始鱼,同時會把當(dāng)前選中文件夾內(nèi)的proto
文件復(fù)制到臨時項(xiàng)目中,執(zhí)行代碼生成命令脆贵;介于
gRPC
客戶端調(diào)用需要對 channel 進(jìn)行復(fù)用医清,所以同時會基于 T4 模板自動生成復(fù)用 channel 的 client 代碼,調(diào)用時就不用再考慮 channel 復(fù)用問題 卖氨;最終通過
dotnet build
和dotnet nuget push
自動將生成的 NuGet Package 推送到私有倉庫会烙;刪除臨時項(xiàng)目。
使用方法
下載最新 GrpcProtoToNuGetPackageTemplate.zip ASP.NET 的項(xiàng)目模板筒捺;
-
解壓
GrpcProtoToNuGetPackageTemplate.zip
柏腻,在安裝之前最好對以下文件進(jìn)行必要的修改,主要是團(tuán)隊相關(guān)信息:Content/.template.config/template.json
: author
Grpc.Proto.To.NuGet.Package.nuspec
: authors
GrpcProtoToNuGetPackage.csproj
: Authors系吭、Company五嫂、RepositoryUrl,其他看情況修改如:TargetFrameworks
. 執(zhí)行
nuget pack Grpc.Proto.To.NuGet.Package.nuspec
(nuget 如果不存在村斟,需要下載并將 nuget.exe 添加到環(huán)境變量) 生成Grpc.Proto.To.NuGet.Package.1.0.0.nupkg
贫导;執(zhí)行
dotnet new -i Grpc.Proto.To.NuGet.Package.1.0.0.nupkg
進(jìn)行模板安裝;-
安裝成功后蟆盹,可通過
dotnet new -u
進(jìn)行查看現(xiàn)有的項(xiàng)目模板孩灯,如下:Grpc.Proto.To.NuGet.Package
即安裝的項(xiàng)目模板,如果需要卸載逾滥,執(zhí)行dotnet new -u Grpc.Proto.To.NuGet.Package
下載最新版 GrpcProtoToNuGetPackage.vsix峰档,在關(guān)閉所有 VS 窗口下安裝此插件;
安裝成功后寨昙,VS 中打開含
proto
接口定義文件的項(xiàng)目(我們目前是將所有 gRPC 服務(wù)按文件夾存放到一個公共項(xiàng)目中讥巡,統(tǒng)一維護(hù));-
在
protos
文件夾右鍵選擇Grpc Proto To NuGet Package
舔哪,如下: -
點(diǎn)擊后會彈出配置窗口欢顷,設(shè)置 NuGet Package 要推送到的
源地址
和APIKey
(只需首次設(shè)置)可在 https://www.nuget.org 官網(wǎng)注冊賬號,并創(chuàng)建 API Key 進(jìn)行測試捉蚤,不過這樣是推送到公共平臺上
-
設(shè)置 NuGet Package 包名和版本(包名默認(rèn)是
proto
文件定義的package
名抬驴,版本號默認(rèn)是當(dāng)前最大版本的 revision 位加 1),也可完全自定義執(zhí)行過程中使用的資源文件會暫存到
C:\TempGrpcNuGet
目錄下缆巧。首次會創(chuàng)建repository.json
保存 NuGet 倉庫的配置信息布持,接下來每次會根據(jù)包名創(chuàng)建一個臨時項(xiàng)目用于生成對應(yīng) NuGet Package,如果有問題陕悬,一般是因不符合規(guī)范導(dǎo)致編譯不通過题暖,這時候可在臨時項(xiàng)目中通過dotnet build
進(jìn)行編譯或通過 VS 添加現(xiàn)有項(xiàng)目查看具體問題。 -
執(zhí)行,注意執(zhí)行結(jié)果內(nèi)的輸出日志胧卤,確保推送到遠(yuǎn)端倉庫 OK
-
NuGet Package 安裝與使用
static void Main(string[] args) { // client 集合 var clientContainer = new ClientContainer("127.0.0.1:1234"); // GreeterClient唯绍,如果有多個 Client,也是直接從 clientContainer 中獲取 var greeterClient = clientContainer.GreeterClient; var response = greeterClient.SayHello(new HelloRequest { Name = "BeckJin" }); Console.WriteLine(response.Message); }
總結(jié)
以上主要是實(shí)現(xiàn)方案及使用方法的具體說明枝誊,實(shí)際使用 Grpc Proto To NuGet Package
只需如下 3 步:
- 安裝
GrpcProtoToNuGetPackageTemplate
項(xiàng)目模板推捐; - 安裝
Grpc Proto To NuGet Package
VS 插件; - 配置私有 NuGet 倉庫侧啼;