【gin】gin中使用protbuf消息传输go案例

devtools/2025/1/21 13:52:47/

在 Gin 中使用 Protobuf 进行高效消息传输

Protobuf(Protocol Buffers)是一种高效的二进制序列化协议,广泛用于高性能场景的数据传输。相比 JSON,Protobuf 具有更小的体积和更快的解析速度,非常适合服务间通信或前后端交互。


为什么选择 Protobuf?

特性JSONProtobuf
体积大小较大(文本格式)较小(二进制格式)
解析速度较慢较快
跨语言支持较弱强(支持多种语言)
定义结构动态(无强类型约束)静态(Schema 定义)

实现步骤

1. 准备工作

安装 Protobuf 编译工具

确保已安装 protoc 编译器以及用于生成 Go 代码的插件。

# 安装 protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-gogo install google.golang.org/protobuf/cmd/protoc-gen-go-grpc

验证安装是否成功:

protoc --version
定义 .proto 文件

创建一个 message.proto 文件,用于定义数据结构:

syntax = "proto3";
package example;// 定义用户信息
message User {string name = 1;int32 age = 2;
}
生成 Go 代码

运行以下命令生成 Protobuf 的 Go 文件:

protoc --go_out=. message.proto

生成的文件会包含在当前目录,通常为 message.pb.go,它是我们操作 Protobuf 消息的核心文件。


2. 在 Gin 中集成 Protobuf

初始化项目

创建一个简单的 Gin 项目,目录结构如下:

project/
|-- main.go
|-- message.proto
|-- message.pb.go
编写代码

main.go 文件中编写代码,实现 Protobuf 消息的序列化和返回。

package mainimport ("github.com/gin-gonic/gin""google.golang.org/protobuf/proto""net/http"// 引入生成的 Protobuf 文件pb "path/to/generated/proto"
)func main() {r := gin.Default()// Protobuf 消息响应r.GET("/protobuf", func(c *gin.Context) {// 构造 User 数据user := &pb.User{Name: "Alice",Age: 25,}// 序列化为二进制数据data, err := proto.Marshal(user)if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})return}// 设置返回头,并返回二进制数据c.Data(http.StatusOK, "application/x-protobuf", data)})// 启动服务r.Run(":8080")
}

3. 测试 Protobuf 接口

使用 cURL 测试

运行以下命令,获取 Protobuf 响应并保存为文件:

curl -X GET http://localhost:8080/protobuf --output user.bin
解析二进制文件

如果客户端也是 Go 服务,可以使用以下代码解析 user.bin 文件:

package mainimport ("fmt""io/ioutil""google.golang.org/protobuf/proto"pb "path/to/generated/proto"
)func main() {// 读取二进制文件data, _ := ioutil.ReadFile("user.bin")// 解析 Protobuf 数据user := &pb.User{}proto.Unmarshal(data, user)// 输出结果fmt.Println("Name:", user.Name)fmt.Println("Age:", user.Age)
}

4. 核心原理

操作方法描述
序列化proto.Marshal将结构体转换为二进制数据
反序列化proto.Unmarshal将二进制数据转换为结构体
响应 Protobufc.Data设置响应头并返回二进制数据
客户端解析使用生成的 message.pb.go调用反序列化方法解析数据

总结

  1. 定义 Protobuf Schema:通过 .proto 文件定义数据结构。
  2. 生成代码:使用 protoc 工具生成 Go 的 Protobuf 文件。
  3. 集成到 Gin:通过 Gin 的 c.Data 方法返回 Protobuf 数据。
  4. 客户端解析:使用生成的 Go 文件进行反序列化,恢复原始数据。

https://github.com/0voice


http://www.ppmy.cn/devtools/152362.html

相关文章

车载测试和相关面试

资源放下面啦! 记得关注❤️~持续分享更多资源 永久链接:https://pan.quark.cn/s/cf64f687a12f

179最大数(贪心算法)分析+源码+证明

文章目录 题目题目分析算法原理 源码证明 思考 题目 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 题目分…

SpringBoot2 + Flowable(UI)

文章目录 引言I 技术栈软件架构基于 Vue.js 和 Element UI 的后台管理系统工程结构II 依赖rest,logic,conf 的依赖工作流flowable jar包flowable-ui所需jar包III 配置jdbc 配置 nullCatalogMeansCurrent = true引言 I 技术栈 软件架构 前端基于vue 、element-ui框架分模块设…

Web开发 -前端部分-CSS-2

一 长度单位 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

计算机毕业设计Django+LSTM模型弹幕情感分析 B站视频数据可视化 B站爬虫 机器学习 深度学习 NLP自然语言处理 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

完美解决phpstudy安装后mysql无法启动

phpstudy数据库无法启动有以下几个原因。 **一、**自己在电脑上安装了MySQL数据库,MySQL的服务名为MySQL,这会与phpstudy的数据库的服务名发生冲突&#xff0c;从而造成phpstudy中的数据库无法启动&#xff0c;这时我们只需要将自己安装的MySQL的服务名改掉就行。 但是&#…

【Linux】gawk编辑器二

一、变量 gawk编程语言支持两种变量&#xff1a;内建变量和自定义变量。 1、内建变量 gawk使用内建变量来引用一些特殊的功能。 字段和记录分隔符变量 数据字段变量 此变量允许使用美元符号&#xff08;$&#xff09;和字段在记录中的位置值来引用对应的字段。要引用记录…

string底层实现细节

一、部分代码展示 #pragma once #include<cstring> #include<cassert> #include<iostream> using namespace std; namespace bit {class string{public:// 迭代器类指针// 范围for就是在编译时替换成迭代器遍历&#xff0c;*it返回给chtypedef char* iterat…