Go 语言中常用的序列化方式有很多,其中 Google 的 Protocol Buffers(简称 Protobuf)是一种高效、可扩展和跨平台的序列化格式,被广泛应用于分布式系统中。在本篇博客中,我们将介绍如何使用 Go 语言的 Protobuf 库来序列化数据。
在开始之前,我们需要先安装 Protobuf 编译器。你可以从 官网 上下载对应操作系统的编译器版本,并按照官方文档进行安装。
tag.proto文件内容如下:
syntax = "proto3";
package proto;
// 添加下面的go_package,分号前表示生成的**.pb.go文件的存放地址(会自动生成目录),分号后表示*.pb.go文件所属的包名
option go_package = "/modules/agent/builder/dcs";
message param {
string name = 1;
string time = 2;
string value = 3;
}
message interface_param {
repeated param Param = 1;
}
如何根据上面的tag.proto 自动生成tag.pg.go 文件呢
如果您想在golang中导入tag.pb.go文件,可以使用以下步骤:
确保您已经安装了gRPC和protobuf编译器。如果没有安装,可以通过以下命令进行安装:
go get github.com/Shopify/sarama
go get -u google.golang.org/grpc
go get google.golang.org/protobuf
go get -u github.com/golang/protobuf/protoc-gen-go
protoc --go_out=. --plugin=protoc-gen-go="D:\\Program Files\\Go\\code\\bin\\protoc-gen-go.exe" data.proto
如何序列化protbuf 发送kafka呢
send_kafka.go
package main
import (
"awesomeProject/modules/agent/builder/dcs"
"fmt"
"github.com/Shopify/sarama"
"github.com/golang/protobuf/proto"
"time"
)
func main() {
// 获取当前时间并格式化为指定的字符串
kfk_time := time.Now().Format("20060102150405")
fmt.Println(kfk_time)
// 创建一个param对象
p := &dcs.Param{
Name: "longkui_count",
Time: kfk_time,
Value: "123.45",
}
// 序列化param对象
data, err := proto.Marshal(p)
if err != nil {
// 错误处理
fmt.Println("Failed to marshal param:", err)
return
}
// 创建Kafka生产者
producer, err := sarama.NewSyncProducer([]string{
"kafka1:9092"}, nil)
if err != nil {
// 错误处理
fmt.Println("Failed to create Kafka producer:", err)
return
}
defer producer.Close()
// 构造消息
message := &sarama.ProducerMessage{
Topic: "test-topic",
Value: sarama.ByteEncoder(data),
}
// 发送消息
_, _, err = producer.SendMessage(message)
if err != nil {
// 错误处理
fmt.Println("Failed to send message to Kafka:", err)
return
}
fmt.Println("Message sent to Kafka.")
}