grpc-go 中的会话和远程 IP 地址
Session and remote IP address in grpc-go
在grpc-go中,实现服务时,服务接口定义的方法只有Context
和Request
。从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
通常用于存储有关会话的任意信息。
在grpc-go中,实现服务时,服务接口定义的方法只有Context
和Request
。从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
通常用于存储有关会话的任意信息。