Сеанс и удаленный 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 обычно используется для хранения произвольной информации о сессиях.

Другие вопросы по тегам