我目前正在开发一个项目,需要从 Go 结构生成 Avro 架构文件。我想知道是否有任何现有的解决方案或库可以帮助我实现这一目标。
理想情况下,我希望找到一种基于 Go 中定义的结构自动生成 Avro 模式的方法。这将大大简化单独定义和维护模式的过程。
如果有人对如何完成此任务有任何见解、建议或示例代码片段,我将非常感谢您的帮助!
示例: 例如,考虑以下 Go 结构:
type User struct {
ID int `avro:"id" json:"id"`
Name string `avro:"name" json:"name"`
Age int `avro:"age" json:"age"`
Email string `avro:"email" json:"email"`
Timestamp int64 `avro:"timestamp" json:"timestamp"`
}
我想生成一个 Avro 架构文件,自动反映此 Go 结构的结构和字段类型。这将使我能够与其他系统共享架构。
任何有关如何实现这一目标的指导或建议将不胜感激。预先感谢您的帮助!
我知道这个问题有点老了,但我自己也一直在努力解决这个问题,并且它已经被查看了数百次。
有两个项目您应该看看。首先,要回答您的问题,您可以使用 github.com/wirelessr/avroschema.
从结构生成 avro 架构。例如:
import "github.com/wirelessr/avroschema"
type User struct {
ID int `avro:"id" json:"id"`
Name string `avro:"name" json:"name"`
Age int `avro:"age" json:"age"`
Email string `avro:"email" json:"email"`
Timestamp int64 `avro:"timestamp" json:"timestamp"`
}
// ...
avroschema.Reflect(&User{})
此外,一旦您拥有了 avro 架构,请查看 github.com/hamba/avro,以使用新架构将结构体实例与二进制 avro 进行序列化。
来自他们的自述文件:
type SimpleRecord struct {
A int64 `avro:"a"`
B string `avro:"b"`
}
schema, err := avro.Parse(`{
"type": "record",
"name": "simple",
"namespace": "org.hamba.avro",
"fields" : [
{"name": "a", "type": "long"},
{"name": "b", "type": "string"}
]
}`)
if err != nil {
log.Fatal(err)
}
in := SimpleRecord{A: 27, B: "foo"}
data, err := avro.Marshal(schema, in)
if err != nil {
log.Fatal(err)
}
fmt.Println(data)
// Outputs: [54 6 102 111 111]
out := SimpleRecord{}
err = avro.Unmarshal(schema, data, &out)
if err != nil {
log.Fatal(err)
}
fmt.Println(out)
// Outputs: {27 foo}