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

golang grpc初体验

grpc 是一个高性能、开源和通用的 RPC 框架,面向服务端和移动端,基于 HTTP/2 设计。目前支持c、java和go,分别是grpc、grpc-java、grpc-go,目前c版本支持c、c++、node.js、ruby、python、objective-c、php和c#。grpc官网 grpc-go
在这里插入图片描述
ProtoBuf(全称Protocol Buffer)是数据结构序列化和反序列化框架,ProtoBuf是Google推出的一款轻量高效的数据化数据存储格式,性能比json、xml强,ProtoBuf经历了ProtoBuf2和ProtoBuf3,ProtoBuf3比ProtoBuf简化了很多,目前主流的是ProtoBuf3.
优点:
1.性能:压缩性好、序列化和反序列化快(比xml和json快2-100倍)、传输速度快
2.便捷性:使用简单(自动生成序列化和反序列化代码)、维护成本低(只支持proto文件)、向后兼容(不必破坏旧格式)、加密型号
3.跨语言:跨平台、支持各种主流语言
缺点:
1.通用性差:json可以任何语言都支持,但是protobuf需要专门的解析库
2.自解释性差:只有通过proto文件才能了解数据结构
protoBuf安装并配置环境变量官网
1.编辑环境变量文件‌:vim ~/.zshrc
‌2.添加环境变量‌:

export PATH="$PATH:/usr/local/go/src/GolangStudy/protoc-28.2-osx-x86_64/bin"

3.使配置生效‌:保存并关闭编辑器后,在终端中输入source ~/.zshrc
命令,使更改生效。
4.验证

 protoc --version

安装protoBuf的go依赖包

go get github.com/golang/protobuf/protoc-gen-go

helloworld.proto

syntax = "proto3";// 生成 proto 文件所在包路径
package protos;
// 影响go文件生成位置和包名
option go_package = "GolangStudy/Introduction/grpc/protos";
message HelloRquest{string name=1;//1是编号不是值
}

项目目录结构
在这里插入图片描述
转换命令(第一种命令使用grpc,会比第二种多很多)

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld.proto 
protoc --go_out=/usr/local/go/src/GolangStudy/GolangStudy --proto_path=/usr/local/go/src/GolangStudy/GolangStudy/Introduction/grpc/protos --go_opt=module=GolangStudy helloworld.proto

调用并比较跟json格式的区别

package mainimport ("GolangStudy/Introduction/grpc/protos""encoding/json""fmt""github.com/golang/protobuf/proto"
)type Hello struct {Name string `json:"name"`
}func main() {req := protos.HelloRquest{Name: "bobby",}jsonStruct := Hello{Name: "bobby"}jsonRsp, _ := json.Marshal(jsonStruct)fmt.Println(len(string(jsonRsp)))rsp, _ := proto.Marshal(&req)fmt.Println(len(string(rsp)))
}

json长度是15,而protobuf长度是7

grpc四种数据流

简单模式(simple rpc):客户端发起一次请求,服务端响应一个数据
服务端数据流模式(server-side streaming rpc):客户端发起一次请求,服务端返回一段连续的数据流。(客户端向服务端发送一个股票代码,服务端就把该股票的实时数据源源不断的返回给客户端)
客户端数据流模式(client-side streaming rpc):客户端源源不断的项向服务端发送数据流,而在发送结束后,由服务器返回一个响应(物流网终端向服务器报送数据)
双向数据流模式(bidirectional streaming rpc):客户端和服务端都可以向双方发送数据流,双方的数据可以同时互相发送,可以实现实时交互(聊天机器人)

grpc简单模式

目录结构
在这里插入图片描述

proto代码

syntax = "proto3";// 生成proto文件所在包路径
package protos;
option go_package = ".;proto";
// 影响go文件生成位置和包名
service Greeter{rpc SayHello(HelloRquest)returns(HelloReply);//hello接口
}
message HelloRquest{string name=1;//1是编号不是值
}
message HelloReply{string message=1;
}

生成go文件

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld.proto

使用接口删除这一行(可能是生成方式的问题)
在这里插入图片描述
server端

package mainimport ("GolangStudy/Introduction/grpc/example2/proto""context""net""google.golang.org/grpc"
)type Server struct {
}func (s *Server) SayHello(ctx context.Context, request *proto.HelloRquest) (*proto.HelloReply, error) {return &proto.HelloReply{Message: "helo" + request.Name,}, nil
}
func main() {g := grpc.NewServer()proto.RegisterGreeterServer(g, &Server{})lis, err := net.Listen("tcp", "0.0.0.0:8080")if err != nil {panic("failed to listen:" + err.Error())}err = g.Serve(lis)if err != nil {panic("failed to start ")}
}

client端

package mainimport ("GolangStudy/Introduction/grpc/example2/proto""context""fmt""google.golang.org/grpc"
)func main() {conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())if err != nil {panic(err)}defer conn.Close()c := proto.NewGreeterClient(conn)r, err := c.SayHello(context.Background(), &proto.HelloRquest{Name: "bobby",})if err != nil {panic(err)}fmt.Println(r.Message)
}

grpc流模式

proto

syntax = "proto3";// 生成proto文件所在包路径
package protos;
option go_package = ".;proto";
// 影响go文件生成位置和包名
service Greeter{rpc GetStream(StreamReqData)returns(stream SteramResData);//服务端流模式rpc PostStream(stream StreamReqData)returns(stream SteramResData);//客户端流模式rpc AllStream(stream StreamReqData)returns(stream SteramResData);//双向流模式
}
message StreamReqData{string data=1;
}
message SteramResData{string data=1;
}

生成go文件

 protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative stream.proto

删除
在这里插入图片描述
server

package mainimport ("GolangStudy/Introduction/grpc/stream_grpc_test/proto""fmt""net""sync""time""google.golang.org/grpc"
)const PORT = ":50052"type server struct {
}func (s *server) GetStream(req *proto.StreamReqData, res proto.Greeter_GetStreamServer) error {i := 0for {i++_ = res.Send(&proto.SteramResData{Data: fmt.Sprintf("%v", time.Now().Unix()),})time.Sleep(time.Second)if i > 10 {break}}return nil
}
func (s *server) PostStream(cliStr proto.Greeter_PostStreamServer) error {for {if a, err := cliStr.Recv(); err != nil {fmt.Println(err)break} else {fmt.Println(a.Data)}}return nil
}
func (s *server) AllStream(allStr proto.Greeter_AllStreamServer) error {wg := sync.WaitGroup{}wg.Add(2)go func() {defer wg.Done()for {data, _ := allStr.Recv()fmt.Println("收到客户端消息:" + data.Data)}}()go func() {defer wg.Done()for {allStr.Send(&proto.SteramResData{Data: "我是服务器",})time.Sleep(time.Second)}}()wg.Wait()return nil
}
func main() {lis, err := net.Listen("tcp", PORT)if err != nil {panic(err)}s := grpc.NewServer()proto.RegisterGreeterServer(s, &server{})err = s.Serve(lis)if err != nil {panic("failed to start ")}
}

client

package mainimport ("GolangStudy/Introduction/grpc/stream_grpc_test/proto""context""fmt""sync""time""google.golang.org/grpc"
)func main() {conn, err := grpc.Dial("127.0.0.1:50052", grpc.WithInsecure())if err != nil {panic(err)}defer conn.Close()//服务端流模式// c := proto.NewGreeterClient(conn)// res, _ := c.GetStream(context.Background(), &proto.StreamReqData{Data: "mooc"})// for {// 	a, err := res.Recv() //socket编程send recv// 	if err != nil {// 		fmt.Println(err)// 		break// 	}// 	fmt.Println(a)// }// //客户端流模式// c := proto.NewGreeterClient(conn)// putS, _ := c.PostStream(context.Background())// i := 0// for {// 	i++// 	_ = putS.Send(&proto.StreamReqData{// 		Data: fmt.Sprintf("mooc%d", i),// 	})// 	time.Sleep(time.Second)// 	if i > 10 {// 		break// 	}// }//双向流模式c := proto.NewGreeterClient(conn)allStr, _ := c.AllStream(context.Background())wg := sync.WaitGroup{}wg.Add(2)go func() {defer wg.Done()for {data, _ := allStr.Recv()fmt.Println("收到服务器消息:" + data.Data)}}()go func() {defer wg.Done()for {allStr.Send(&proto.StreamReqData{Data: "我是客户端",})time.Sleep(time.Second)}}()wg.Wait()
}

相关文章:

golang grpc初体验

grpc 是一个高性能、开源和通用的 RPC 框架,面向服务端和移动端,基于 HTTP/2 设计。目前支持c、java和go,分别是grpc、grpc-java、grpc-go,目前c版本支持c、c、node.js、ruby、python、objective-c、php和c#。grpc官网 grpc-go P…...

基于小程序+Vue + Spring Boot的进销存库存出库入库统计分析管理系统

目录 一、项目背景及需求分析 1. 项目背景 2. 需求分析 二、系统架构设计 1. 技术选型 2. 模块划分 三、数据库设计数据库表结构 四、前端实现 五、后端实现 1. RESTful API设计 2. 数据库操作 六、安全性和性能优化 1. 安全性 2. 性能优化 七、测试与部署 1. …...

【数据结构与算法】时间复杂度和空间复杂度例题

文章目录 时间复杂度常数阶时间O(1)对数阶时间O(logN)线性阶时间O(n)线性对数阶时间O(nlogN)平方阶时间O(n*n) 空间复杂度常量空间O(1)线性空间O(n)二维空间O(n*n)递归空间 时间复杂度 常数阶时间O(1) 代码在执行的时候,它消耗的时间并不随着某个变量的增长而增长…...

停止模式下USART为什么可以唤醒MCU?

在MCU的停止模式下,USART之类的外设时钟是关闭的,但是USART章节有描述到在停止模式下可以用USART来对MCU进行唤醒: 大家是否会好奇在外设的时钟被关闭的情况下,USART怎么能通过接收中断或者唤醒事件对MCU进行唤醒的呢&#xff1…...

Web安全 - 路径穿越(Path Traversal)

文章目录 OWASP 2023 TOP 10导图定义路径穿越的原理常见攻击目标防御措施输入验证和清理避免直接拼接用户输入最小化权限日志监控 ExampleCode漏洞代码:路径穿越攻击案例漏洞说明修复后的安全代码代码分析 其他不同文件系统下的路径穿越特性Windows系统类Unix系统&a…...

JSR303微服务校验

一.创建idea 二.向pom.xml添加依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.7.RELEASE</version></parent><properties><java.vers…...

56. QTreeWidget的基本使用

1. 说明 在软件开发中会遇到将数据信息制作成一种树目录的形式进行展示,那么此时就可以借助QT提供的QTreeWidget控件来实现这种需求,本篇博客会做一个案例简要说明这个控件的基本使用方法,博客中代码能够实现的功能是将此项目代码所在文件夹中的内容展示出来,如下图所示:…...

领域偏移:协变量移位下的域自适应

现在我们将焦点转移到一种叫做协变量转移的扰动上。我们在一个分类或回归设置中工作&#xff0c;我们希望从x预测y&#xff0c;并假设p≈(y | x)和p∗(y | x)是相同的(标记函数在训练和测试之间不会改变) 假设 (Covariate Shift)。对于列车分布p~和检验分布p∗&#xff0c;我们…...

前端开发技术框架选型

一、引言 在前端开发领域&#xff0c;技术框架的选择对于项目的成功至关重要。一个优秀的前端框架不仅可以提高开发效率&#xff0c;还能确保项目的稳定性和可扩展性。而不同的框架具有不同的特点和优势&#xff0c;能够满足不同项目的需求。下面将对目前主流的前端开发技术框…...

/etc/init.d/mysql

Since you’ve installed MySQL from source, you’ll need to create a custom init script to manage the MySQL server (start, stop, status) similarly to a service. Here’s a simple init.d script template for MySQL that you can use. This script assumes MySQL is…...

Qt_线程介绍与使用

目录 1、QThread常用API 2、Qt线程安全 3、使用线程QThread 4、connect函数的第五个参数 5、Qt互斥锁 5.1 QMutexLocker 6、条件变量 7、信号量 结语 前言&#xff1a; 线程是应用程序开发非常重要的概念&#xff0c;在Qt中&#xff0c;用QThread类来实现多线程&a…...

通讯方面的数据,人工智能 机器学习的时候,因为数字都接近于一,数据归一化的一种方法,做了一个简化版本的Z-score标准化

这个表达式实现了一种形式的数据归一化&#xff0c;它将张量x中的每个元素除以x的标准差的估计值。这种处理方式可以使得变换后的数据具有单位标准差&#xff08;假设数据已经是零均值或者在计算过程中考虑了均值&#xff09;。具体来说&#xff0c;它是基于以下步骤进行的&…...

python itertools模块介绍

itertools 是 Python 内建的一个高效处理迭代器的模块&#xff0c;提供了创建复杂迭代器的函数工具。它包含一系列用于迭代、组合、排列、过滤等功能的迭代器构建工具&#xff0c;常用于数据处理和算法设计。下面是 itertools 模块中一些常见的函数介绍&#xff1a; 1. 无限迭…...

【分布式微服务云原生】5分钟深入剖析Kafka:Leader与Follower分区的秘密及负载均衡的艺术

深入剖析Kafka&#xff1a;Leader与Follower分区的秘密及负载均衡的艺术 摘要&#xff1a; Apache Kafka作为当前最流行的分布式流处理平台之一&#xff0c;其内部的分区机制和消费者组的负载均衡策略是实现高吞吐量和高可靠性的关键。本文将深入探讨Kafka中Leader分区与Follo…...

在线代码编辑器

在线代码编辑器 文章说明前台核心代码后台核心代码效果展示源码下载 文章说明 采用Java结合vue3设计实现的在线代码编辑功能&#xff0c;支持在线编辑代码、运行代码&#xff0c;同时支持导入文件&#xff0c;支持图片识别&#xff0c;支持复制代码&#xff0c;可将代码导出为图…...

深入了解 MPlayer:Linux 系统中的多功能多媒体播放器

文章目录 深入了解 MPlayer&#xff1a;Linux 系统中的多功能多媒体播放器一、MPlayer 的安装二、MPlayer 的基本使用三、MPlayer 音频功能详解1. 支持的音频格式2. 调整音频输出设备3. 使用音频滤镜和效果4. 音频输出格式转换5. 多声道与环绕声支持6. 音频控制&#xff1a;播放…...

Netty系列-7 Netty编解码器

背景 netty框架中&#xff0c;自定义解码器的起点是ByteBuf类型的消息, 自定义编码器的终点是ByteBuf类型。 1.解码器 业务解码器的起点是ByteBuf类型 netty中可以通过继承MessageToMessageEncoder类自定义解码器类。MessageToMessageEncoder继承自ChannelInboundHandlerAdap…...

OpenHarmony标准系统上实现对rk系列芯片NPU的支持(npu使用)

在上篇文章中&#xff0c;我们学习了移植rk的npu驱动到OpenHarmony提供的内核。本文我们来学习如何在OpenHarmony标准系统rk系列芯片如何使用npu OpenHarmony RK系列芯片运行npu测试用例 在移植npu驱动到OpenHarmony之后&#xff0c;来运行npu样例进行简单测试 1.O 测试准备…...

大表性能优化的关键技术

1 引言 在现代企业应用中,随着数据量的不断增长,大表的性能优化成为数据库管理的重要环节。本文将探讨大表性能优化的关键技术,包括索引优化、查询优化、分区分表、读写分离以及缓存策略等方面。通过综合运用这些技术,可以显著提升大表的处理效率和响应速度,确保系统的稳…...

广联达 Linkworks办公OA Service.asmx接口存在信息泄露漏洞

漏洞描述 广联达科技股份有限公司以建设工程领域专业应用为核心基础支撑&#xff0c;提供一百余款基于“端云大数据”产品/服务&#xff0c;提供产业大数据、产业新金融等增值服务的数字建筑平台服务商。广联达OA存在信息泄露漏洞&#xff0c;由于某些接口没有鉴权&#xff0c…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

【QT控件】显示类控件

目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏&#xff1a;QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...

6.9本日总结

一、英语 复习默写list11list18&#xff0c;订正07年第3篇阅读 二、数学 学习线代第一讲&#xff0c;写15讲课后题 三、408 学习计组第二章&#xff0c;写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语&#xff1a;复习l默写sit12list17&#…...