GLS 用于存储 goroutine 内的上下文信息,作用类似于 context。相比 context 有如下优势:
框架目前主要使用 GLS 进行 context 备份,以避免用户误传 context 导致链路透传信息(如 logid、metainfo 等)丢失
svr := xxx.NewServer(new(XXXImpl), server.WithContextBackup(true, true))
CLOUDWEGO_SESSION_CONFIG_KEY``=[{是否开启异步透传}][,{全局分片数}][,{GC间隔}]
,三个选项都为可选,空表示使用默认值true,10,1h
表示 开启异步 + 分片 10+1 小时 GC 间隔client.``WithContextBackup``(handler)
;func(prev, cur context.Context) (ctx context.Context, backup bool)
var expectedKey interface{}
cli := client.New(serverName, client.WithContextBackup(func(prev, cur context.Context) (ctx context.Context, backup bool) {
if v := cur.Value(expectedKey); v != nil {
// expectedKey exists, no need for recover context
return cur, false
}
// expectedKey doesn't exists, need recover context from prev
ctx = context.WithValue(cur, expectedKey, prev.Value(expectedKey))
return ctx, true
})