grpc-go 中的会话和远程 IP 地址

Session and remote IP address in grpc-go

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

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

    Done() <-chan struct{}

    Err() error

    Value(key interface{}) interface{}
}

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

谢谢。

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

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

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

可以通过使用 stats.Handler (see especially this struct https://github.com/grpc/grpc-go/blob/v1.20.x/stats/stats.go#L89) 来检索远程 IP 地址。

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