当前位置: 首页 > news >正文

grpc学习golang版( 四、多服务示例)

系列文章目录
第一章 grpc基本概念与安装
第二章 grpc入门示例
第三章 proto文件数据类型
第四章 多服务示例


文章目录

  • 一、前言
  • 二、定义proto文件
  • 三、编写server服务端
  • 四、编写Client客户端
  • 五、测试
  • 六、示例代码


一、前言

多服务,即一个rpc提供多个服务给外界调用。好比唤醒服务,可以有语音唤醒人脸唤醒触摸唤醒人体唤醒。以此为基础,做一个示例。

二、定义proto文件

这里定义2个服务,一个语音唤醒服务,人脸唤醒服务。语音唤醒服务又包含各种各样的方法,比如狗叫坤叫,狗会汪汪汪叫,猫会喵喵喵叫,坤会???,这里以狗叫为例。人脸唤醒又包含各种各样的方法,比如一耳光一巴掌,毕竟没几个人挨一巴掌还没醒的,这里以一巴掌为例。

新建wake.proto文件示例如下:

// 指定proto版本
syntax = "proto3";package wake_grpc;     // 指定默认包名// 指定golang包名
option go_package = "/wake_proto";//语音唤醒服务
service VoiceWakeService {//狗叫rpc DogBark(Request)returns(Response){}
}//人脸唤醒服务
service FaceWakeService {//一巴掌rpc ASlap(Request)returns(Response){}
}//请求参数
message Request{string name = 1;
}
//响应参数
message Response{string sound = 1;
}

go_grpc_study/example_2/grpc_proto目录下新建Terminal,执行生成文件,命令如下

protoc --go_out=. --go-grpc_out=. ./wake.proto

目录结构变更后为

三、编写server服务端

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

编写server/main.go文件

package mainimport ("context""fmt"wake_grpc2 "go_grpc_study/example_2/grpc_proto/wake_proto""google.golang.org/grpc""google.golang.org/grpc/grpclog""net"
)// 新版本 gRPC 要求必须嵌入 UnimplementedGreeterServer 结构体
type VoiceWakeServer struct {wake_grpc2.UnimplementedVoiceWakeServiceServer
}
type FaceWakeServer struct {wake_grpc2.UnimplementedFaceWakeServiceServer
}func (VoiceWakeServer) DogBark(ctx context.Context, request *wake_grpc2.Request) (pd *wake_grpc2.Response, err error) {fmt.Println("语音唤醒入参:", request.Name)pd = new(wake_grpc2.Response)pd.Sound = "汪汪汪~"return
}func (FaceWakeServer) ASlap(ctx context.Context, request *wake_grpc2.Request) (pd *wake_grpc2.Response, err error) {fmt.Println("人脸唤醒入参:", request.Name)pd = new(wake_grpc2.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_grpc2.RegisterVoiceWakeServiceServer(s, &VoiceWakeServer{})wake_grpc2.RegisterFaceWakeServiceServer(s, &FaceWakeServer{})fmt.Println("grpc server running :8080")// 开始处理客户端请求。err = s.Serve(listen)
}

具体步骤如下:

  • 1)定义2个结构体,结构体名称无所谓,必须包含pb.UnimplementedGreeterServer 对象
  • 2)实现 .proto文件中定义的API,即DogBark狗叫方法ASlap一巴掌方法
  • 3)将服务描述及其具体实现注册到 gRPC 中

四、编写Client客户端

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

编写clinet/main.go文件

package mainimport ("context""fmt"wake_grpc2 "go_grpc_study/example_2/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_grpc2.NewVoiceWakeServiceClient(conn)res, err := voiceClient.DogBark(context.Background(), &wake_grpc2.Request{Name: "张三",})fmt.Println(res, err)faceClient := wake_grpc2.NewFaceWakeServiceClient(conn)res, err = faceClient.ASlap(context.Background(), &wake_grpc2.Request{Name: "李四",})fmt.Println(res, err)
}

具体步骤如下:

  • 1)首先使用 grpc.Dial() 与 gRPC 服务器建立连接
  • 2)使用 wake_grpc2.NewVoiceWakeServiceClient(conn)、wake_grpc2.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版( 四、多服务示例)

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写Client客户端五、测试六、示例代码 一、前言 多服务,即一个rpc提供多个服务给外界调用…...

Linux安装jdk17

我们进入到cd /usr/lib/下然后创建一个jdk17的文件夹 mkdir jdk17 进入到jdk17目录下 下载jdk17包 上传到Linux 解压jar包 tar -zxvf jdk-17_linux-x64_bin.tar.gz压解完毕后 配置环境变量 vim/etc/profilei 修改 esc 退出 :wq保存 export JAVA_HOME/usr/lib/jdk17/jdk-1…...

Java家教系统小程序APP公众号h5源码

让学习更高效,更便捷 🌟 引言:家教新选择,小程序来助力 在快节奏的现代生活中,家长们越来越注重孩子的教育问题。然而,如何为孩子找到一位合适的家教老师,成为了许多家长头疼的问题。现在&…...

PHP入门

一、环境搭建 无脑: 小皮面板(phpstudy) - 让天下没有难配的服务器环境!phpStudy官网2019正式推出phpStudy V8.0版本PHP集成环境,支持Windows与Linux系统,支持WEB面板操作管理,一键网站开发环境搭建配置,…...

docker ce的使用介绍

docker docker17.03以后 docker ce,社区免费版,vscode的docker插件使用的该版本(默认windows只支持windows容器,linux支持linux容器)docker ee,企业版本 docker17.03以前 docker toolbox,基于…...

SpringCloud Alibaba Sentinel 流量控制之流控模式实践总结

官网文档:https://sentinelguard.io/zh-cn/docs/flow-control.html wiki地址:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6 本文版本:spring-cloud-starter-alibaba:2.2.0.RELEASE 如下图所…...

【高考志愿】电子科学与技术

高考志愿选择电子科学与技术专业,无疑是向着科技创新的前沿迈出坚定步伐的明智之选。这一专业以其深厚的理论基础、前沿的技术应用和广泛的就业前景,吸引了众多有志于投身科技领域的学子。 首先,电子科学与技术专业所涵盖的内容丰富而深入。它…...

2024.06.26【读书笔记】|医疗科技创新流程(前言)【AI增强版】

目录 《BIODESIGN》第二版前言详细总结前言概述新增重要内容价值导向 (Value Orientation)全球视角 (Global Perspectives)更好的教学和学习方法 (Better Ways to Teach and Learn)全新视频集合 (New Videos)扩展的“实地”案例研究 (Expanded “From the Field” Case Studies…...

kubernetes Job yaml文件解析

一、yaml文件示例 apiVersion: batch/v1 kind: Job metadata:name: test-jobnamespace: mtactor spec:completions: 3parallelism: 1backoffLimit: 5activeDeadlineSeconds: 100template:spec:containers:- name: test-jobimage: centoscommand: ["echo","test…...

php goto解密脚本源码

php goto解密脚本源码 源码下载:https://download.csdn.net/download/m0_66047725/89426171 更多资源下载:关注我。...

2023: 芒种集•序言

2023: 芒种集•序言 2023: 芒种集•序言 从西南旅游回来,一直忙着整理游记“2024:追寻红色足迹”,之后又应初建平索要刘桂蓉遗作“我们一起走过”,于是把“别了,老屋”和诗作“二月”一并合编,把我写的悼念…...

Camera定制修改

需求: Android13 MtkCamera右上角的前后摄切换点击范围小导致经常点击无反应,需增大view宽度 跟踪代码可找到对应资源文件:vendor\mediatek\proprietary\packages\apps\Camera2\feature\setting\cameraswitcher\res\ 根据vendor\mediatek\…...

LeetCode 算法:验证二叉搜索树 c++

原题链接🔗:验证二叉搜索树 难度:中等⭐️⭐️ 题目 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于…...

SpringBoot优点达项目实战:获取系统配置接口(三)

SpringBoot优点达项目实战:获取系统配置接口(二) 文章目录 SpringBoot优点达项目实战:获取系统配置接口(二)1、查看接口2、查看数据库3、代码实现1、创建实体类SysConfig2、创建返回数据的vo3、创建control…...

【C语言】字符/字符串+内存函数

目录 Ⅰ、字符函数和字符串函数 1 .strlen 2.strcpy 3.strcat 4.strcmp 5.strncpy 6.strncat 7.strncmp 8.strstr 9.strtok 10.strerror 11.字符函数 12. 字符转换函数 Ⅱ、内存函数 1 .memcpy 2.memmove 3.memcmp Ⅰ、字符函数和字符串函数 1 .strlen 函数原型:…...

上下文管理器在Python中的妙用

更多Python学习内容:ipengtao.com Python上下文管理器是一个非常强大的工具,它能够帮助开发者在特定代码块前后自动执行特定的操作,常用于资源管理,如文件操作、数据库连接和锁定等。本文将详细介绍Python上下文管理器的概念、使用…...

【PWN · TcachebinAttack | UAF】[2024CISCN · 华中赛区] note

一道简单的tcache劫持 一、题目 二、思路 存在UAF,libc版本2.31,经典菜单题 1.通过unsorted-bin-attack来leak-libc 2.通过uaf打tcache-bin-attack劫持__free_hook实现getshell 三、EXP from pwn import * context(archamd64,log_leveldebug)ioproce…...

Java数据脱敏

数据脱敏 敏感数据在存储过程中为是否为明文, 分为两种 落地脱敏: 存储的都是明文, 返回之前做脱敏处理不落地脱敏: 存储前就脱敏, 使用时解密, 即用户数据进入系统, 脱敏存储到数据库中, 查询时反向解密 落地脱敏 这里指的是数据库中存储的是明文数据, 返回给前端的时候脱…...

【Java Web】三大域对象

目录 一、域对象概述 二、三大域对象 三、域对象使用相关API 一、域对象概述 一些可用于存储数据和传递数据的对象被称为域对象,根据传递数据范围的不同,我们称之为不同的域,不同的域对象代表不同的域,共享数据的范围也不同。 二、…...

【Linux】进程信号_3

文章目录 八、进程信号2. 信号的保存3. 信号的处理 未完待续 八、进程信号 2. 信号的保存 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

12.找到字符串中所有字母异位词

🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...