grpc学习golang版( 五、多proto文件示例 )
系列文章目录
第一章 grpc基本概念与安装
第二章 grpc入门示例
第三章 proto文件数据类型
第四章 多服务示例
第五章 多proto文件示例
第六章 服务器流式传输
第七章 客户端流式传输
第八章 双向流示例
文章目录
- 一、前言
- 二、定义proto文件
- 2.1 公共proto文件
- 2.2 语音唤醒proto文件
- 2.3 人脸唤醒proto文件
- 2.4 生成go代码
- 2.5 注意
- 三、编写server服务端
- 四、编写Client客户端
- 五、测试
- 六、示例代码
一、前言
当项目大起来之后,会有很多个service,rpc,message(即服务,方法,结构体),这样阅读起来又困难,不同的业务服务都写在一个文件,又容易导致开发人员混乱。所以我们会需要将不同服务放在不同的proto文件中。同时也可以放一些公共的proto文件。最主要的目的就是方便阅读,查找,使用。本质其实是生成的go文件放在同一个包下。
二、定义proto文件
这里还是以唤醒服务为例,定义2个服务,语音唤醒、人脸唤醒。我们都知道,唤醒服务入参需要一个人名name,出参的时候会有声音sound。这些就可以放在公共的proto里面,他们都是语音唤醒、人脸唤醒的共同内容
2.1 公共proto文件
新建common.proto文件
// 指定proto版本
syntax = "proto3";
// 指定默认包名
package wake_grpc;// 指定golang包名
option go_package = "/wake_proto";//请求参数
message Request{string name = 1;
}
//响应参数
message Response{string sound = 1;
}
2.2 语音唤醒proto文件
前面我们说过,唤醒,不仅有语音唤醒,还有 人脸唤醒,这些都属于唤醒的服务。语音唤醒服务又分,狗叫声唤醒、猫叫声唤醒、坤叫声唤醒。所以这里我们把他们(即语音唤醒、人脸唤醒)拆分开,不同业务做细分。
新建voice_wake.proto文件。关键词import引入公共proto文件
// 指定proto版本
syntax = "proto3";
// 指定默认包名
package wake_grpc;
// 指定golang包名
option go_package = "/wake_proto";
//引入公共proto文件
import "common.proto";//语音唤醒服务
service VoiceWakeService {//狗叫rpc DogBark(Request)returns(Response){}
}
2.3 人脸唤醒proto文件
正如我前面所说,把人脸唤醒也拆分出来,不同业务做细分。
新建face_wake.proto文件。关键词import引入公共proto文件
// 指定proto版本
syntax = "proto3";
// 指定默认包名
package wake_grpc;
// 指定golang包名
option go_package = "/wake_proto";
//引入公共proto文件
import "common.proto";//人脸唤醒服务
service FaceWakeService {//一巴掌rpc ASlap(Request)returns(Response){}
}
目录结构变更后为

2.4 生成go代码
在go_grpc_study/example_3/grpc_proto目录下新建Terminal,执行生成文件,命令如下
protoc --go_out=. --go-grpc_out=. ./common.proto
protoc --go_out=. --go-grpc_out=. ./voice_wake.proto
protoc --go_out=. --go-grpc_out=. ./face_wake.proto
目录结构变更后为

2.5 注意
voice_wake.proto文件、face_wake.proto文件必须得加上package,并且要和import的package相同
还有值得一提的是,voice_wake.proto文件、face_wake.proto文件引入公共proto时,golang编译器会报红色警告。但
不影响后续的使用!
不影响后续的使用!
不影响后续的使用!
如下face_wake.proto文件,有知道如何解决报红色警告的,也可以评论留言。

三、编写server服务端
新建server目录,新建main.go文件
目录结构如下

编写server/main.go文件
package mainimport ("context""fmt"wake_grpc3 "go_grpc_study/example_3/grpc_proto/wake_proto""google.golang.org/grpc""google.golang.org/grpc/grpclog""net"
)// 新版本 gRPC 要求必须嵌入 UnimplementedGreeterServer 结构体
type VoiceWakeServer struct {wake_grpc3.UnimplementedVoiceWakeServiceServer
}
type FaceWakeServer struct {wake_grpc3.UnimplementedFaceWakeServiceServer
}func (VoiceWakeServer) DogBark(ctx context.Context, request *wake_grpc3.Request) (pd *wake_grpc3.Response, err error) {fmt.Println("语音唤醒入参:", request.Name)pd = new(wake_grpc3.Response)pd.Sound = "汪汪汪~"return
}func (FaceWakeServer) ASlap(ctx context.Context, request *wake_grpc3.Request) (pd *wake_grpc3.Response, err error) {fmt.Println("人脸唤醒入参:", request.Name)pd = new(wake_grpc3.Response)pd.Sound = "塞班~"return
}func main() {// 监听端口listen, err := net.Listen("tcp", ":8080")if err != nil {grpclog.Fatalf("Failed to listen: %v", err)}// 创建一个gRPC服务器实例。s := grpc.NewServer()// 将server结构体注册为gRPC服务。wake_grpc3.RegisterVoiceWakeServiceServer(s, &VoiceWakeServer{})wake_grpc3.RegisterFaceWakeServiceServer(s, &FaceWakeServer{})fmt.Println("grpc server running :8080")// 开始处理客户端请求。err = s.Serve(listen)
}
具体步骤如下:
- 1)定义2个结构体,结构体名称无所谓,必须包含
wake_grpc3.UnimplementedVoiceWakeServiceServer、wake_grpc3.UnimplementedFaceWakeServiceServer对象 - 2)实现 .proto文件中定义的API,
即DogBark狗叫方法,ASlap一巴掌方法 - 3)将服务描述及其具体实现注册到 gRPC 中
四、编写Client客户端
新建client目录,新建main.go文件
目录结构如下

编写clinet/main.go文件
package mainimport ("context""fmt"wake_grpc3 "go_grpc_study/example_3/grpc_proto/wake_proto""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""log"
)func main() {addr := ":8080"// 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。// 此处使用不安全的证书来实现 SSL/TLS 连接conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err))}defer conn.Close()voiceClient := wake_grpc3.NewVoiceWakeServiceClient(conn)res, err := voiceClient.DogBark(context.Background(), &wake_grpc3.Request{Name: "王五",})fmt.Println(res, err)faceClient := wake_grpc3.NewFaceWakeServiceClient(conn)res, err = faceClient.ASlap(context.Background(), &wake_grpc3.Request{Name: "赵6",})fmt.Println(res, err)
}
具体步骤如下:
- 1)首先使用 grpc.Dial() 与 gRPC 服务器建立连接
- 2)使用
wake_grpc3.NewVoiceWakeServiceClient(conn)、wake_grpc3.NewFaceWakeServiceClient(conn)初始化客户端 - 3)通过客户端调用
ServiceAPI方法voiceClient.DogBark、faceClient.ASlap
五、测试
在server目录下,启动服务端
go run main.go
在clinet目录下,启动客户端
go run main.go
服务端运行结果

客户端运行结果

六、示例代码
go_grpc_study:grpc学习golang版
完成ヾ(◍°∇°◍)ノ゙
相关文章:
grpc学习golang版( 五、多proto文件示例 )
系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件2.1 公共proto文件2.2 语音唤醒proto文…...
LeetCode 106 从中序与后序遍历序列构造二叉树
根据中序遍历和后序遍历的性质,还原二叉树,详细见注释 TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {//空,直接返回nullif(inorder.size() 0) return nullptr;//一个,返回一个nod…...
Vue Router的深度解析
引言 在现代Web应用开发中,客户端路由已成为实现流畅用户体验的关键技术。与传统的服务器端路由不同,客户端路由通过JavaScript在浏览器中控制页面内容的更新,避免了页面的全量刷新。Vue Router作为Vue.js官方的路由解决方案,以其…...
YOLO-V2
一、V2版本细节升级 1、YOLO-V2: 更快!更强 1.1 做的改进内容 1. YOLO-V2-Batch Normalization V2版本舍弃Dropout,卷积后每一层全部加入Batch Normalization网络的每一层的输入都做了归一化,收敛相对更容易经过Batch Norma…...
pmp考试的通过标准是什么?
PMP考试的是否通过并不是依据类似其他考试的数值成绩,是通过考生收到邮件通知后去主动查询具体的页面得知的。查询页除了电子证书的下载方式,还有成绩报告单的选项以及成绩饼状图,具体如下: 页面中显示“PASS”表示考试通过。 显…...
不懂PyQt5垂直布局?只需3分钟即可学会
PyQt5中实现垂直布局,主要使用QVBoxLayout类。该布局管理器将子控件垂直排列,并可以根据需要自动调整大小。使用QVBoxLayout可以方便地构建从上到下排列的界面元素。 import sys from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget, QPus…...
从零开始实现大语言模型(二):文本数据处理
1. 前言 神经网络不能直接处理自然语言文本,文本数据处理的核心是做tokenization,将自然语言文本分割成一系列tokens。 本文介绍tokenization的基本原理,OpenAI的GPT系列大语言模型使用的tokenization方法——字节对编码(BPE, byte pair en…...
生物分子生物学实验过程的自动化与智能监控系统设计
开题报告:生物分子生物学实验过程的自动化与智能监控系统设计 一、引言 随着生物科学技术的飞速发展,生物分子生物学实验在科研、医疗、农业等领域的应用日益广泛。然而,传统的生物分子生物学实验过程大多依赖于人工操作,存在操…...
linux的shell脚本编程详解
Shell 脚本是一种用于自动化任务的脚本语言,在 Linux 和其他类 Unix 操作系统中非常流行。它通常用于任务自动化、系统管理和批处理。编写 Shell 脚本并使其自动化编译过程(例如使用 gcc 编译 C/C 程序)是一种常见的任务。 以下是一个详细的…...
Redis 7.x 系列【11】数据类型之位图(Bitmap)
有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 基本命令2.1 SETBIT2.2 GETBIT2.3 BITCOUNT2.4 BITPOS2.5 BITFIELD2.6 BITF…...
如何评定旅游卡的品质与服务?
评定旅游卡的品质与服务,可以从以下几个关键方面进行综合考量: 公司实力与资质:选择有实力、资质齐全的公司发行的旅游卡。查看公司背景,确认其是否长期稳定运营,是否具有旅游行业的专业资质,如旅行社许可证…...
适合学生暑假适用的护眼大路灯有哪些?五款好用护眼灯分享!
在护眼领域,护眼大路灯已经成为越来越多人的选择。这种具备实力的工具可以有效地缓解用眼疲劳、改善光线环境,是学生党和办公族的必备神器。然而,市面上的护眼大路灯品牌众多,如何选择一款性价比高、品质优良的产品呢?…...
linux服务器 部署jenkins
在 Linux 服务器上部署 Jenkins 通常包括以下几个步骤: 更新系统软件包: sudo apt update sudo apt upgrade 安装 Java: Jenkins 需要 Java 运行时环境。推荐使用 OpenJDK 11。 sudo apt install openjdk-11-jdk 添加 Jenkins 软件源并导入…...
电商控价:系统监测的必要性与优势
在品牌的发展进程中,会遭遇各种各样的渠道问题,控价乃是其中颇为关键的一环。品牌进行控价的目的无疑是为了妥善治理低价链接,低价链接的发现途径可以是人工,也可以是系统。力维网络在为上百个品牌提供服务的过程中察觉到…...
港股下半年能恢复上涨趋势吗?
今日港股两大指数涨跌不一,早盘盘初恒指冲高,涨幅一度扩大至1%。截至收盘,香港恒生指数涨0.57%。板块方面,电力、航空、石油、内险股、燃料电池、环保等板块涨幅居前;互动媒体与服务、生物科技、汽车零部件、新经济概念…...
软件测试项目实战:银行贷款业务测试介绍-2
1、利息计算 正常利息贷款本金*借款天数*贷款年利率/360 罚息逾期本金*逾期天数*逾期年利率/360 复利逾期利息*逾期天数*逾期年利率/360 2、贷款五级分类 正常贷款:正常及逾期60天以内 关注贷款:逾期60天及以上,不足90天 次级贷款࿱…...
如何将Hive表的分区字段插入PG表对应的时间戳字段?
文章目录 1、背景描述2、场景分析 1、背景描述 数据仓库的建设通常是为业务和决策服务的。在数仓开发的应用层阶段,BI可以直接从主题层/业务层取数,而前端需要根据具体的作图需求通过后端查询数据库 作图的指标需要根据主题层/业务层做查询计算…...
Spring Boot与MyBatis的集成应用
Spring Boot与MyBatis的集成应用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来聊聊Spring Boot与MyBatis的集成应用。MyBatis是一款优秀的持久层框…...
在昇腾服务器上使用llama-factory对baichuan2-13b模型进行lora微调
什么是lora微调 LoRA 提出在预训练模型的参数矩阵上添加低秩分解矩阵来近似每层的参数更新,从而减少适配下游任务所需要训练的参数。 环境准备 这次使用到的微调框架是llama-factory。这个框架集成了对多种模型进行各种训练的代码,少量修改就可使用。 …...
Kafka 管理TCP连接
生产者管理TCP连接 Kafka生产者程序概览 Kafka的Java生产者API主要的对象就是KafkaProducer。通常我们开发一个生产者的步骤有4步: 第1步:构造生产者对象所需的参数对象。 第2步:利用第1步的参数对象,创建KafkaProducer对象实例…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...
