【问题标题】:How can you provide request root context for the gRPC server? [closed]如何为 gRPC 服务器提供请求根上下文? [关闭]
【发布时间】: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 确实是请求上下文最终源自的根上下文。

标签: go grpc-go


【解决方案1】:

我认为这是一个非常好的问题。答案是,由于该包不可用于外部调用,既然不允许任何人使用该包,为什么还要导出一些东西?

但是为什么是私有包呢?

让我们看看你的文件的路径:

/google.golang.org/grpc@v1.27.0/internal/transport/http2_server.go:219

内部是关键:

/google.golang.org/grpc@v1.27.0/internal/

该路径中的所有内容都只用于包。

因此,对于该代码,您显示外部没有人能够使用该包。所以里面的所有东西都可以不导出。

【讨论】:

  • 我认为 OP 质疑 decision 使上下文私有/不可访问,而不是使其私有的实际实现。
  • 在我的 OP 中没有任何地方我在谈论公开上下文。该上下文的存储和流程确实是一个实现细节。我的问题是,为什么我没有在构建服务器时指定根上下文的选项。这将是库 API 的一部分,据我所知,这是一种非常常见的模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2013-11-29
  • 2017-11-04
相关资源
最近更新 更多