VS 擴(kuò)展開發(fā):Grpc Proto To NuGet Package

一直以來我們使用 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)方案

  1. 創(chuàng)建 gRPC 接口生成的項(xiàng)目模板少漆,關(guān)于 .NET 項(xiàng)目模板創(chuàng)建可參考文章:ASP.NET 自定義項(xiàng)目模板

  2. 創(chuàng)建 VS 擴(kuò)展插件 Grpc Proto To NuGet Package硼被;

  3. 右鍵選中 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í)行代碼生成命令脆贵;

  4. 介于 gRPC 客戶端調(diào)用需要對 channel 進(jìn)行復(fù)用医清,所以同時會基于 T4 模板自動生成復(fù)用 channel 的 client 代碼,調(diào)用時就不用再考慮 channel 復(fù)用問題 卖氨;

  5. 最終通過 dotnet builddotnet nuget push 自動將生成的 NuGet Package 推送到私有倉庫会烙;

  6. 刪除臨時項(xiàng)目。

使用方法

  1. 下載最新 GrpcProtoToNuGetPackageTemplate.zip ASP.NET 的項(xiàng)目模板筒捺;

  2. 解壓 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 .

  3. 執(zhí)行 nuget pack Grpc.Proto.To.NuGet.Package.nuspecnuget 如果不存在村斟,需要下載并將 nuget.exe 添加到環(huán)境變量) 生成 Grpc.Proto.To.NuGet.Package.1.0.0.nupkg贫导;

  4. 執(zhí)行 dotnet new -i Grpc.Proto.To.NuGet.Package.1.0.0.nupkg 進(jìn)行模板安裝;

  5. 安裝成功后蟆盹,可通過 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

  6. 下載最新版 GrpcProtoToNuGetPackage.vsix峰档,在關(guān)閉所有 VS 窗口下安裝此插件;

  7. 安裝成功后寨昙,VS 中打開含 proto 接口定義文件的項(xiàng)目(我們目前是將所有 gRPC 服務(wù)按文件夾存放到一個公共項(xiàng)目中讥巡,統(tǒng)一維護(hù));

  8. protos 文件夾右鍵選擇 Grpc Proto To NuGet Package舔哪,如下:

  9. 點(diǎn)擊后會彈出配置窗口欢顷,設(shè)置 NuGet Package 要推送到的 源地址APIKey(只需首次設(shè)置)

    可在 https://www.nuget.org 官網(wǎng)注冊賬號,并創(chuàng)建 API Key 進(jìn)行測試捉蚤,不過這樣是推送到公共平臺上

  10. 設(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)目查看具體問題。

  11. 執(zhí)行,注意執(zhí)行結(jié)果內(nèi)的輸出日志胧卤,確保推送到遠(yuǎn)端倉庫 OK

  12. 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 步:

  1. 安裝 GrpcProtoToNuGetPackageTemplate 項(xiàng)目模板推捐;
  2. 安裝 Grpc Proto To NuGet Package VS 插件;
  3. 配置私有 NuGet 倉庫侧啼;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市堪簿,隨后出現(xiàn)的幾起案子痊乾,更是在濱河造成了極大的恐慌,老刑警劉巖椭更,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哪审,死亡現(xiàn)場離奇詭異,居然都是意外死亡虑瀑,警方通過查閱死者的電腦和手機(jī)湿滓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舌狗,“玉大人叽奥,你說我怎么就攤上這事⊥词蹋” “怎么了朝氓?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長主届。 經(jīng)常有香客問我赵哲,道長,這世上最難降的妖魔是什么君丁? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任枫夺,我火速辦了婚禮,結(jié)果婚禮上绘闷,老公的妹妹穿的比我還像新娘橡庞。我一直安慰自己,他們只是感情好簸喂,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布毙死。 她就那樣靜靜地躺著,像睡著了一般喻鳄。 火紅的嫁衣襯著肌膚如雪扼倘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天,我揣著相機(jī)與錄音再菊,去河邊找鬼爪喘。 笑死,一個胖子當(dāng)著我的面吹牛纠拔,可吹牛的內(nèi)容都是我干的秉剑。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼稠诲,長吁一口氣:“原來是場噩夢啊……” “哼侦鹏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起臀叙,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤略水,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后劝萤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渊涝,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年床嫌,在試婚紗的時候發(fā)現(xiàn)自己被綠了跨释。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡厌处,死狀恐怖鳖谈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阔涉,我是刑警寧澤皂股,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布铃绒,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏讹蘑。R本人自食惡果不足惜癣朗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一碌尔、第九天 我趴在偏房一處隱蔽的房頂上張望苍匆。 院中可真熱鬧,春花似錦函荣、人聲如沸显押。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乘碑。三九已至,卻和暖如春金拒,著一層夾襖步出監(jiān)牢的瞬間兽肤,已是汗流浹背套腹。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留资铡,地道東北人电禀。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像笤休,于是被迫代替她去往敵國和親尖飞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容