【发布时间】:2020-03-06 18:05:34
【问题描述】:
当一个 golang gRPC 服务器调用一个处理函数时,传递的 ctx 值是从这里创建的私有顶层上下文派生的,在 grpc 传输层:/go/pkg/mod/google.golang.org/grpc@v1.27.0/internal/transport/http2_server.go:219
t := &http2Server{
ctx: context.Background(),
done: done,
conn: conn,
remoteAddr: conn.RemoteAddr()
...
该上下文不是从服务器构建时提供的根上下文派生的原因吗?
也许grpc.NewServer(opt ...ServerOption) 可能有一个ctx 变体grpc.NewServerCtx(ctx, ...ServerOption)?
这将为您提供传输您希望所有上下文包含的值的选项。
【问题讨论】:
-
你得问问作者。
-
在我看来,这可能遵循我不知道的模式。
-
它没有被导出,因为所有上下文都应该显式传递;它不是请求的根上下文,它由服务器内部使用;它位于您无权访问的未导出类型的
internal包中。导出它实际上会完成什么? -
我的问题不是为什么没有导出该上下文,而是为什么它不是源自用户提供的上下文。这样您就可以拥有整个应用程序的根上下文。
-
而这个 http2Server.ctx 确实是请求上下文最终源自的根上下文。