• gRPC之.Net6中的客户端和服务端共用proto协议文件


    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协议文件即可。

  • 相关阅读:
    浅析Java设计模式【3.6】——模板方法
    面试-Java【之】HashMap原理,源码逐行分析,理论总结(变量、常量、数据结构、Node、TreeNode、初始化、添加、查询、更新、删除)
    【Maven】VSCode Java+Maven 环境配置
    微软放弃“封禁”商业开源!
    【面试:并发篇39:多线程:线程池】ThreadPoolExecutor类-提交、停止
    Ubuntu下Qt creator不能输入中文解决方法
    概率论和数理统计(三)数理统计基本概念
    【信息系统项目管理师】 学习笔记 第1章 信息化发展
    正则系列之断言Assertions
    说透常见设计模式之代理模式
  • 原文地址:https://www.cnblogs.com/qubernet/p/17214011.html