欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 【gin】gin中使用protbuf消息传输go案例

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

2025/4/21 23:08:15 来源:https://blog.csdn.net/m0_74282926/article/details/145246110  浏览:    关键词:【gin】gin中使用protbuf消息传输go案例

在 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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词