元数据
简介
元数据是用来描述数据的数据(Data that describes other data)。
Vine 中的元数据统一封装在 context.Context
中。通过 wrapper 的特性使我们可以在无入侵的情况下修改元数据信息。
metadata
metadata
模块用于 Vine 元数据的操作,支持的操作如下:
import (
"context"
"github.com/vine-io/vine/util/context/metadata"
)
func main() {
// 从 ctx 获取 key
val, ok := metadata.Get(ctx, "key")
// 修改 ctx 中的 key
metadata.Set(ctx, "key", "value")
// 删除 ctx 中的 key
metadata.Delete(ctx, "key")
// 获取 ctx 中的元数据
md, _ := metadata.FromContext(ctx)
// 封装 md
ctx = metadata.NewContext(ctx, md)
// 完整拷贝元数据
md = metadata.Copy(md)
// 合并 ctx 中的元数据
ctx = metadata.MergeContext(ctx, md, true)
}
使用
在有 ctx 作为入参的地方都可以使用 metadata。如果不希望破坏业务代码,推荐在 wrapper 中使用:
func CallWrapper() client.CallWrapper {
return func(fn client.CallFunc) client.CallFunc {
return func(ctx context.Context, node *registry.Node, req client.Request, rsp interface{}, opts client.CallOptions) error {
md, _ := metadata.FromContext(ctx)
// 追加 client=wrapper
md.Set("client", "wrapper")
ctx = metadata.NewContext(ctx, md)
return fn(ctx, node, req, rsp, opts)
}
}
}
func HandlerWrapper() server.HandlerWrapper {
return func(fn server.HandlerFunc) server.HandlerFunc {
return func(ctx context.Context, req server.Request, rsp interface{}) error {
val, _ := metadata.Get(ctx, "client")
// 获取 client
fmt.Println("client: ", val)
return fn(ctx, req, rsp)
}
}
}
最后修改 September 8, 2021: metadata (d8a4331)