3

在 grpc-go 中,实现服务时,服务接口定义的方法只包含ContextRequest。从源代码来看Context,它很简单

type Context interface {
    Deadline() (deadline time.Time, ok bool)

    Done() <-chan struct{}

    Err() error

    Value(key interface{}) interface{}
}

所以我想知道是否可以获取一些元数据(包括远程 IP 地址和其他数据)来维护会话。

谢谢。

4

2 回答 2

3

作为跨请求的会话系统,gRPC 提供的任何东西(以任何语言)都不会特别健壮。

当您需要在单个服务器上为客户端维护上下文时,流机制非常有用:流回调的堆栈可以指向您需要的任何会话信息。

如果您需要跨不同 RPC(或跨机器)的状态,则需要添加自己的会话层。您可以通过在发送请求时创建一些附加到(例如)“my-session-id”元数据元素的唯一 ID 来做到这一点。

于 2016-01-13T00:43:08.020 回答
1

可以通过使用来检索远程 IP 地址stats.Handler(尤其参见这个结构https://github.com/grpc/grpc-go/blob/v1.20.x/stats/stats.go#L89)。

grpc.Metadata通常用于存储有关会话的任意信息。

于 2019-05-12T06:33:57.873 回答