Сеанс и удаленный IP-адрес в 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-адрес и другие данные) для поддержки сеанса.
Благодарю.
1 ответ
GRPC не предоставляет ничего (на любом языке), который был бы особенно надежным в качестве системы сеансов для разных запросов.
Механизм потоковой передачи хорош, когда вам нужно поддерживать контекст на одном сервере для клиентов: стек обратного вызова потока может указывать на любую информацию о сеансе, которая вам нужна.
Если вам нужно состояние между отдельными RPC (или между компьютерами), вам нужно добавить свой собственный слой сеанса. Вы можете сделать это, создав некоторый уникальный идентификатор, который вы присоединяете (скажем) к элементу метаданных my-session-id при отправке запросов.
Можно получить удаленный IP-адрес с помощью stats.Handler
(см. особенно эту структуру https://github.com/grpc/grpc-go/blob/v1.20.x/stats/stats.go).
grpc.Metadata
обычно используется для хранения произвольной информации о сессиях.