VS 扩展开发:Grpc Proto To NuGet Package

一直以来我们使用 gRPC 来进行微服务开发,对 gRPC 有过了解应该清楚它依赖 proto 接口定义文件来实现的,在进行服务调用之前,需要先通过 proto 文件来生成当前服务使用语言的代码,然后就可以实现调用本地方法一样调用远程服务。(.NET Core 3.0 开始已支持不用手动生成代码就可以调用方法,但在多语言的微服务开发中,proto 文件的维护还是比较倾向我们目前的方式

在 .NET 开发中,我们之前的方式还是根据 proto 文件手动生成代码,接着生成 NuGet Package ,然后推送到自己的私有 NuGet 仓库,最后在服务内进行 NuGet Package 安装来引用,这样不至于需要依赖此服务的服务每次都 copy 代码,目的是在服务引用上简化一些步骤。

但问题又来了,要最终实现推送到自己的私有 NuGet 仓库的步骤实在太多,这样依然效率低下,最后我们决定还是自己开发一个 VS 插件 Grpc Proto To NuGet Package ,功能就是一键生成 NuGet Package 并发布到私有仓库。

实现方案

  1. 创建 gRPC 接口生成的项目模板,关于 .NET 项目模板创建可参考文章:ASP.NET 自定义项目模板

  2. 创建 VS 扩展插件 Grpc Proto To NuGet Package

  3. 右键选中 proto 接口定义文件所在的文件夹(所有 proto 文件中定义的 package 名暂必须一致,公共 proto 文件暂只能放在根目录的 common 文件夹下),在右键菜单中点击 Grpc Proto To NuGet Package,首次需要配置私有 NuGet 仓库源地址和 API Key,然后根据 package 名自动创建基于项目模板的临时项目,同时会把当前选中文件夹内的 proto 文件复制到临时项目中,执行代码生成命令;

  4. 介于 gRPC 客户端调用需要对 channel 进行复用,所以同时会基于 T4 模板自动生成复用 channel 的 client 代码,调用时就不用再考虑 channel 复用问题 ;

  5. 最终通过 dotnet builddotnet nuget push 自动将生成的 NuGet Package 推送到私有仓库;

  6. 删除临时项目。

使用方法

  1. 下载最新 GrpcProtoToNuGetPackageTemplate.zip ASP.NET 的项目模板;

  2. 解压 GrpcProtoToNuGetPackageTemplate.zip,在安装之前最好对以下文件进行必要的修改,主要是团队相关信息:

    Content/.template.config/template.json: author
    Grpc.Proto.To.NuGet.Package.nuspec: authors
    GrpcProtoToNuGetPackage.csproj: Authors、Company、RepositoryUrl,其他看情况修改如:TargetFrameworks .

  3. 执行 nuget pack Grpc.Proto.To.NuGet.Package.nuspecnuget 如果不存在,需要下载并将 nuget.exe 添加到环境变量) 生成 Grpc.Proto.To.NuGet.Package.1.0.0.nupkg

  4. 执行 dotnet new -i Grpc.Proto.To.NuGet.Package.1.0.0.nupkg 进行模板安装;

  5. 安装成功后,可通过 dotnet new -u 进行查看现有的项目模板,如下:Grpc.Proto.To.NuGet.Package 即安装的项目模板,如果需要卸载,执行 dotnet new -u Grpc.Proto.To.NuGet.Package

  6. 下载最新版 GrpcProtoToNuGetPackage.vsix,在关闭所有 VS 窗口下安装此插件;

  7. 安装成功后,VS 中打开含 proto 接口定义文件的项目(我们目前是将所有 gRPC 服务按文件夹存放到一个公共项目中,统一维护);

  8. protos 文件夹右键选择 Grpc Proto To NuGet Package,如下:

  9. 点击后会弹出配置窗口,设置 NuGet Package 要推送到的 源地址APIKey(只需首次设置)

    可在 https://www.nuget.org 官网注册账号,并创建 API Key 进行测试,不过这样是推送到公共平台上

  10. 设置 NuGet Package 包名和版本(包名默认是 proto 文件定义的 package 名,版本号默认是当前最大版本的 revision 位加 1),也可完全自定义

    执行过程中使用的资源文件会暂存到 C:\TempGrpcNuGet 目录下。首次会创建 repository.json 保存 NuGet 仓库的配置信息,接下来每次会根据包名创建一个临时项目用于生成对应 NuGet Package,如果有问题,一般是因不符合规范导致编译不通过,这时候可在临时项目中通过 dotnet build 进行编译或通过 VS 添加现有项目查看具体问题。

  11. 执行,注意执行结果内的输出日志,确保推送到远端仓库 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);
    }
    

总结

以上主要是实现方案及使用方法的具体说明,实际使用 Grpc Proto To NuGet Package 只需如下 3 步:

  1. 安装 GrpcProtoToNuGetPackageTemplate 项目模板;
  2. 安装 Grpc Proto To NuGet Package VS 插件;
  3. 配置私有 NuGet 仓库;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容