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对象实例…...
 
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
 
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
 
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
 
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
 
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
 
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
