gRPC之.Net6中的客户端和服务端共用proto协议文件
1、说明
在上一篇文章gRPC之.Net6中的初步使用介绍中,我们简单的介绍了gRPC在服务端、客户端以及Web项目中的使用。
有一个问题,不知道大家发现没有,就是不管在服务端项目还是客户端项目中,我们都需要创建相同的proto协议文件
,这样就会显得很麻烦,有没有一种办法只创建一次proto协议文件
呢?答案是肯定的:有。
在介绍实现之前,建议大家先查看一下前一篇文章gRPC之.Net6中的初步使用介绍,方便后面关联性的讲解。
2、实现
2.1、新建类库项目
首先我们新建一个名称为Quber.Grpc.Common
的类库项目,目的就是用于存放proto协议文件
和协议文件生成的对应类文件
,如下图所示:
2.2、添加引用
接下来我们在Quber.Grpc.Common
的类库项目中分别添加如下引用:
Google.Protobuf
Grpc.Core.Api
Grpc.Tools
2.3、创建proto协议文件
我们在Quber.Grpc.Common
类库项目中新建一个文件夹Protos
,用于存放各种proto协议文件
,然后我们把Quber.Grpc.Service
项目中的user.proto协议文件
复制过来,复制过来后,将user.proto
协议文件中的命名空间
修改为Quber.Grpc.Common.Protos
(和该类库保持一致),如下图所示:
2.4、修改协议文件属性
鼠标右键user.proto协议文件
,选择属性(或者鼠标选中user.proto协议文件
,然后按ALT+Enter快捷键打开文件属性窗体),在打开的属性窗体中,将Build Action
选项设置为Protobuf compiler
,将gRPC Stub Classes
选项设置为Client and Server
,然后点击应用确定即可,如下图所示:
此时,我们双击Quber.Grpc.Common
类库项目,在编辑文件中,我们会发现有一个Protobuf
节点设置,并且该节点中的GrpcServices
属性值为Both
(Both
表示我们刚才选择的Client and Service
,Client
表示客户端,Service
表示服务端),如下图所示:
注意:如果项目的编辑文件中,没有Protobuf
节点设置,请手动增加进去,不然到时候在生成的时候不会生成协议文件
对应的类文件
2.5、生成项目
此时我们重新生成下Quber.Grpc.Common
类库项目,会发现在obj\Debug\net6.0\Protos
目录下生成了user.proto协议文件
对应的2个类文件,如下图所示:
2.6、改造服务端和客户端项目
改造
Quber.Grpc.Service
项目在
Quber.Grpc.Service
项目中,我们添加对Quber.Grpc.Common
类库项目的引用,如下图所示:然后我们将
Quber.Grpc.Service
项目中的整个Protos
文件夹删除掉,如下图所示:修改
UserService.cs
服务文件中的命名空间,如下图所示:此时我们注意到
User.UserBase
、UserInfoResult
和UserInfoRequest
都来自我们新建的Quber.Grpc.Common
类库项目。运行
Quber.Grpc.Service
项目,如下图所示:如上图所示,
Quber.Grpc.Service
服务端就运行成功了。改造
Quber.Grpc.Client
项目在
Quber.Grpc.Client
项目中,我们添加对Quber.Grpc.Common
类库项目的引用,如下图所示:然后我们将
Quber.Grpc.Client
项目中的整个Protos
文件夹删除掉,如下图所示:修改服务文件
UserTest.cs
和UserTestIoc.cs
以及启动文件Program.cs
中的命名空间,如下图所示:此时我们注意到
User.UserClient
和UserInfoRequest
都来自我们新建的Quber.Grpc.Common
类库项目。运行
Quber.Grpc.Client
项目,如下图所示:如上图所示,
Quber.Grpc.Client
客户端就运行成功了。
同理,我们可以将Quber.Grpc.Web
项目也按照上述说明进行调整,此处就不一一演示了。
通过上述步骤的演示,我们就达到了客户端和服务端公用一份proto协议文件
的目的,就不用在每个项目中新建相同的proto协议文件
了,后期只需要维护一份proto协议文件
即可。
gRPC之.Net6中的客户端和服务端共用proto协议文件的更多相关文章
- Socket实例之客户端向服务端数据库上传文件UI版
http://blog.csdn.net/su20145104009/article/details/52843735 首先实现分析: 1用户注册 客户单选择‘用户注册’,提示要输入用户名,密码,确认 ...
- Netty4 学习笔记之二:客户端与服务端心跳 demo
前言 在上一篇Netty demo 中,了解了Netty中的客户端和服务端之间的通信.这篇则介绍Netty中的心跳. 之前在Mina 中心跳的使用是通过继承 KeepAliveMessageFacto ...
- javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url
javaweb项目中有很多场景的路径客户端的POST/GET请求,服务器的请求转发,资源获取需要设置路径等这些路径表达的含义都有不同,所以想要更好的书写规范有用的路径代码 需要对路径有一个清晰地认知 ...
- node.js中ws模块创建服务端和客户端,网页WebSocket客户端
首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...
- 在HTTP通讯过程中,是客户端还是服务端主动断开连接?
比如说:IE访问IIS,获取文件,肯定是要建立一个连接,这个连接在完成通讯后,是客户端Close了连接,还是服务端Close了连接.我用程序测模拟IE和IIS,都没有收到断开连接的消息,也就是都没有触 ...
- gRPC (1):入门及服务端创建和调用原理
1. RPC 入门 1.1 RPC 框架原理 RPC 框架的目标就是让远程服务调用更加简单.透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP).序列化方式(XML/Json/ 二进制)和 ...
- TCP学习之三:客户端、服务端同步传输字符串
参考学习张子阳大神的博客:http://www.cnblogs.com/JimmyZhang/category/101698.html 一个客户端.发送一条消息 客户端: 服务端: 注意:Networ ...
- 客户端向服务端传送特殊字符解决方法(检测到有潜在危险的 Request.Form 值)
当客户端向服务端传输特殊字符时报错,错误信息如下图:
- webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成
首先到CXF官网及spring官网下载相关jar架包,这个不多说.webservice是干嘛用的也不多说. 入门例子 模拟新增一个用户,并返回新增结果,成功还是失败. 大概的目录如上,很简单. Res ...
- SignalR 实现web浏览器客户端与服务端的推送功能
SignalR 是一个集成的客户端与服务器库,基于浏览器的客户端和基于 ASP.NET 的服务器组件可以借助它来进行双向多步对话. 换句话说,该对话可不受限制地进行单个无状态请求/响应数据交换:它将继 ...
随机推荐
- 你不知道的JavaScript--作用域
用简单的代码 展示代码的魅力 1.在浏览器里,在全局范围内,this等价于windo ...
- python 列表中随机抽取多个数
方法一:[random.randint(0,100) for _ in range(2)]输出: [34, 44]方法二:list中随机去取K个数list=[1,2.3,......] random. ...
- sublime Vue、ejs、less、scss高亮展示
sublime中默认不支持ejs.vue.less.scss等文件高亮展示.解决办法可以增加对应插件: 一.安装: 1.打开sublime 2.点击 preferences ->Browse ...
- Docker基本命令之 镜像管理
镜像管理 docker常用基础命令: 查看docker版本信息:docker version 查看docker系统信息:docker info docker服务相关: 查看docker服务:syste ...
- Java基础|01.基础语法(1)
目录 00x1 基本语法 1.类的语法 2.对象的语法 3.方法的声明 4.小例子 00x2 类和对象的关系 1.堆.栈和元空间 2.基本数据类型和引用数据类型的区别 3. 空对象(null) 00x ...
- 音速启动 Vstart 5.7 win10手动移除后台设置主页
Vstart 用了快12年了,用Wireshark跟踪确实会访问广告页面,也会去上传数据.还会悄悄设置主页 ,所以在Win10上老是被干掉 也想着换 CLaunch 确实不喜欢. Rolan 买了一年 ...
- Jetpack compose学习笔记之ConstraintLayout(布局)
一,简介 Jetpack compose中没有提供ConstraintLayout支持,所以需要添加下面的依赖来导入. // build.gradle implementation "and ...
- js 原生数据类型判断
之前一直使用的jquery的数据类型判断,比如:isArray()等,今天看到了一个判断数据类型的简单的原生方法,分享给大家 Object.prototype.toString 方法返回对象的类型字符 ...
- vm 16 player安装与网络配置
1.密钥: FA1M0-89YE3-081TQ-AFNX9-NKUC0 2.安装步骤: xshell6,要先右键管理员运行绿化.bat,再双击.exe 3.一般的虚拟机,需要win上的v8适配器的ip ...
- java_web----1
一.HTML 1.网页的构成 结构:HTML 超文本标记语言 标签语言 标签写法: <标签名> </标签名> <标签名/> 表现:CSS 行为:JavaScrip ...