在grpc-go中,实现服务时,服务接口定义的方法仅包含Context
和Request
。从Context
的来源,它就像
type Context interface {
Deadline() (deadline time.Time, ok bool)
Done() <-chan struct{}
Err() error
Value(key interface{}) interface{}
}
所以我想知道是否有可能获得一些元数据(包括远程IP地址和其他数据)以维持会话。
感谢。
答案 0 :(得分:3)
gRPC没有提供(在任何语言中)作为跨请求的会话系统特别健壮。
当您需要在客户端的单个服务器上维护上下文时,流机制很棒:流回调的堆栈可以指向您需要的任何会话信息。
如果您需要在单独的RPC(或跨机器)上建立状态,则需要添加自己的会话层。您可以通过创建一些在发送请求时附加到(例如)“my-session-id”元数据元素的唯一ID来执行此操作。
答案 1 :(得分:0)
可以通过使用stats.Handler
(尤其是此结构https://github.com/grpc/grpc-go/blob/v1.20.x/stats/stats.go#L89)来检索远程IP地址。
grpc.Metadata
通常用于存储有关会话的任意信息。