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 main

import (
	"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.UnimplementedVoiceWakeServiceServerwake_grpc3.UnimplementedFaceWakeServiceServer 对象
  • 2)实现 .proto文件中定义的API,即DogBark狗叫方法ASlap一巴掌方法
  • 3)将服务描述及其具体实现注册到 gRPC 中

四、编写Client客户端

新建client目录,新建main.go文件
目录结构如下

编写clinet/main.go文件

package main

import (
	"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.DogBarkfaceClient.ASlap

五、测试

server目录下,启动服务端

go run main.go

clinet目录下,启动客户端

go run main.go

服务端运行结果

客户端运行结果

六、示例代码

go_grpc_study:grpc学习golang版


完成ヾ(◍°∇°◍)ノ゙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/749529.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最佳Google Chrome扩展和Mozilla Firefox扩展自动解决验证码

在这个信息爆炸的时代,我们每天都要处理大量的在线内容,验证码已成为不可避免的挑战。尽管它们旨在保护网站安全,但也常常成为我们获取信息的障碍。那么,有没有更简单的方法绕过这些验证码呢?答案是肯定的。通过使用一…

恭喜朱雀桥的越南薇妮她牌NFC山竹汁饮料,成为霸王茶姬奶茶主材

朱雀桥NFC山竹汁饮料:荣登霸王茶姬奶茶主材,非遗传承的天然之选 近日,据小编了解到:霸王茶姬欣喜地宣布,成功与朱雀桥达成合作越南薇妮她VINUT牌NFC山竹汁饮料。这款商超产品凭借其卓越的品质与独特的口感&#xff0c…

小项目——MySQL集训(学生成绩录入)

ddl语句 -- 创建学生信息表 CREATE TABLE students (student_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 学生ID,name VARCHAR(50) NOT NULL COMMENT 学生姓名,gender ENUM(男, 女) NOT NULL COMMENT 性别,class VARCHAR(50) NOT NULL COMMENT 班级,registration_date DATE CO…

【Termius】详细说明MacOS中的SSH的客户端利器Termius

希望文章能给到你启发和灵感~ 如果觉得有帮助的话,点赞+关注+收藏支持一下博主哦~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境二、软件的安装2.1 Termius界面介绍2.1.1 Hosts 主机列表2.1.2 SFTP 文件传输2.1.3 Port ForWarding 端口转发2.1.4 Snippets 片…

想要打造高效活跃的私域社群,这些技巧要知道

对一些企业来说“做社群等于做私域”。 在腾讯提到的私域转化场景中,社群与小程序、官方导购三者并列。 社群连接着品牌和群内用户。品牌通过圈住更多用户,来持续免费触达用户实现变现,用户则是从品牌方手中直接获取更多服务和优惠。那么&a…

LabVIEW中卡尔曼滤波的作用与意义

卡尔曼滤波(Kalman Filter)是一种在控制系统和信号处理领域广泛应用的递推滤波算法,能够在噪声环境下对动态系统的状态进行最优估计。其广泛应用于导航、目标跟踪、图像处理、经济预测等多个领域。本文将详细介绍卡尔曼滤波在LabVIEW中的作用…

手机越用越慢?试试这4个秘籍,让手机流畅如新

智能手机作为日常生活的得力助手,最初总是以惊人的速度和流畅性给我们留下深刻印象。 但你有没有发现,随着时间的推移,手机似乎开始变得不那么敏捷,甚至出现了反应迟缓和卡顿的情况? 别让这个问题困扰你,下面是四个关…

基于springboot、vue影院管理系统

设计技术: 开发语言:Java数据库:MySQL技术:SpringbootMybatisvue 工具:IDEA、Maven、Navicat 主要功能: 影城管理系统的主要使用者分为管理员和用户, 实现功能包括管理员: 首页…

从一道算法题开始,爱上Python编程

Python是一门简单易学、高效强大的编程语言,许多人因为它的便捷性和广泛应用而爱上编程。今天,我将通过一道有趣的算法题,带领大家一步步写出Python代码,并最终解决问题。希望通过这篇文章,能激发大家对Python编程的兴…

vue2+webpack 和 vite+vue3 配置获取环境变量(补充)

相关涉及知识点可看小编该文章: nginx: 部署前端项目的详细步骤(vue项目build打包nginx部署)_前端工程打包部署到nginx-CSDN博客 1.vue2webpack 我们通常会在项目中看到这么两个文件(没有则自己创建,文件名:.env.***) …

WITS核心价值观【创新】篇|从财务中来,到业务中去

「客尊」、「诚信」、「创新」 与「卓越」 是纬创软件的核心价值观。我们秉持诚信态度,致力于成为客户长期且值得信赖的合作伙伴。持续提升服务厚度,透过数字创新实践多市场的跨境交付,助客户保持市场领先地位。以追求卓越的不懈精神&#xf…

C++项目实践学习笔记---DLL

linux守护进程 守护进程或精灵进程(Daemon):以后台服务方式运行的进程,它们不占用终端(Shell),因此不会受终端输入或其他信号(如中断信号)的干扰守护进程有如下特点。 &…

如何做好新闻软文宣发媒体资源筛选?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传加速季,100万补贴享不停,一手媒体资源,全国100城线下落地执行。详情请联系胡老师。 新闻软文宣发是指企业通过创造或利用新闻事件&#xff0c…

【JAVA多线程】JMM,成体系聊一下JAVA线程安全问题

目录 1.什么是JMM 2.现代计算机架构 3.线程安全理论 3.1.造成线程安全问题的原因 3.1.1.内存不可见 3.1.2.重排序 3.2.解决思路 3.2.1.as-if-serial 3.2.2.happen-before 4.线程安全实现 4.1.Synchronized 4.2.volatile 1.什么是JMM JMM,全称为Java Me…

胶质瘤的发病原因及诊断方式有哪些?

胶质瘤,这个听起来有些陌生的名词,实际上是一种起源于神经胶质细胞的常见脑肿瘤。它的发病原因复杂,涉及遗传、环境、年龄及感染等多种因素。 首先,遗传因素在胶质瘤的发病中占据一席之地。某些遗传性疾病,如结节性硬化…

【代码阅读】SSC:Semantic Scan Context for Large-Scale Place Recognition

一、主函数 官方开源的代码提供了四个主函数,其中eval_pair.cpp和eval_top1.cpp是一组,分别用于计算两帧的相似度分数以及一帧点云在所有的51帧点云中相似度最高的25帧的相似度分数。eval_seq.cpp是在eval_top1.cpp的基础上,给了一堆序列&am…

【Java Web】会话管理

目录 一、为什么需要会话管理? 二、会话管理机制 三、Cookie概述 四、HttpSession概述 4.1 HttpSession时效性 一、为什么需要会话管理? HTTP协议在设计之初就是无状态的,所谓无状态就是在浏览器和服务器之间的通信过程中,服务器并…

简过网:上万元的学费,考公到底要不要报个培训班?

考公报不报班一直是很多朋友比较纠结一件事,报班了学费太贵,不报班又怕考不上,如果你也有这种困扰,那么,不妨看看这篇文章! 首先,对于报班VS自学这个问题,小编的建议是:…

LICEcap-开源GIF 屏幕录制工具

LICEcap-开源GIF 屏幕录制工具 开源GIF 屏幕录制工具 下载可以访问:https://www.cockos.com/licecap/ 点击Record,开始录制 点击Stop,停止录制 点击Record,进入该页面 display in animation(在动画中显示) …

240627_昇思学习打卡-Day9-ResNet50图像分类

240627_昇思学习打卡-Day9-ResNet50图像分类 文章目录 240627_昇思学习打卡-Day9-ResNet50图像分类前言残差网络Residual Block代码实现Bottleneck Block代码实现 BN层(Batch Normalization)构建ResNet50网络数据集准备与加载模型训练与评估可视化模型预…