Перехватчики и метаданные gRPC
Аутентификация, промежуточное журналирование и метаданные gRPC
«Перехватчики и метаданные gRPC» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое перехватчики?
Перехватчики gRPC (промежуточное ПО) выполняются до или после обработчиков RPC. Они добавляют сквозные функции: журналирование, проверку токенов аутентификации, сбор метрик, восстановление после паники и трассировку.
Перехватчик унарного сервера
Перехватчик унарного сервера оборачивает обработчик дополнительной логикой:
func LoggingInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
log.Printf("RPC: %s", info.FullMethod)
resp, err := handler(ctx, req)
log.Printf("done: %v", err)
return resp, err
}
grpcSrv := grpc.NewServer(grpc.UnaryInterceptor(LoggingInterceptor))Перехватчик потокового сервера
Похож на унарный, но оборачивает обработчик потока:
func StreamLogging(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
log.Printf("stream: %s", info.FullMethod)
return handler(srv, ss)
}Объединение перехватчиков
Используйте grpc.ChainUnaryInterceptor (Go gRPC v1.38+), чтобы применять несколько перехватчиков по порядку:
grpcSrv := grpc.NewServer(
grpc.ChainUnaryInterceptor(LoggingInterceptor, AuthInterceptor, MetricsInterceptor),
)Перехватчики клиента
Унарные перехватчики на стороне клиента оборачивают исходящие вызовы — это удобно для добавления токенов аутентификации, повторных попыток или заголовков трассировки:
conn, _ := grpc.NewClient(addr,
grpc.WithUnaryInterceptor(ClientAuthInterceptor),
grpc.WithTransportCredentials(insecure.NewCredentials()),
)Метаданные gRPC
Метаданные — это пары ключ-значение, отправляемые вместе с RPC, подобно заголовкам HTTP. На клиенте используйте metadata.New и metadata.NewOutgoingContext.
md := metadata.New(map[string]string{"authorization": "Bearer " + token})
ctx := metadata.NewOutgoingContext(context.Background(), md)Чтение метаданных на сервере
Извлекайте входящие метаданные с помощью metadata.FromIncomingContext:
md, ok := metadata.FromIncomingContext(ctx)
if !ok { return nil, status.Error(codes.Unauthenticated, "no metadata") }
token := md["authorization"]Отправка метаданных с сервера
Отправляйте с сервера заголовки и завершающие заголовки ответа с помощью grpc.SetHeader и grpc.SetTrailer:
grpc.SetHeader(ctx, metadata.Pairs("x-request-id", requestID))go-grpc-middleware
Библиотека github.com/grpc-ecosystem/go-grpc-middleware/v2 предоставляет готовые перехватчики: восстановление после паники, журналирование (zap/logrus), аутентификацию и другие.
Шаблон перехватчика аутентификации
Извлекайте и проверяйте токен в перехватчике; прикрепляйте пользователя к контексту для последующих обработчиков:
func AuthInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
md, _ := metadata.FromIncomingContext(ctx)
if !validateToken(md["authorization"]) {
return nil, status.Error(codes.Unauthenticated, "invalid token")
}
return handler(ctx, req)
}Перехватчик восстановления после паники
Оборачивайте обработчики, чтобы перехватывать паники и возвращать ошибку Internal вместо аварийного завершения программы:
defer func() {
if r := recover(); r != nil {
err = status.Errorf(codes.Internal, "panic: %v", r)
}
}()Быстрая проверка
Как передавать токены аутентификации между клиентом и сервером gRPC?
Итоги: перехватчики и метаданные gRPC
Основные моменты:
- Унарный перехватчик: func(ctx, req, info, handler) (resp, error)
- grpc.ChainUnaryInterceptor для нескольких перехватчиков
- Метаданные — это пары ключ-значение, аналогичные заголовкам HTTP
- Перехватчик аутентификации: извлечь метаданные → проверить → добавить пользователя в контекст
Часто задаваемые вопросы
Урок «Перехватчики и метаданные gRPC» бесплатный?
Да — полный текст урока «Перехватчики и метаданные gRPC» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Перехватчики и метаданные gRPC»?
Аутентификация, промежуточное журналирование и метаданные gRPC Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Перехватчики и метаданные gRPC»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Protocol Buffers и .proto-файлы
- Реализация унарного сервиса gRPC
- Потоковая передача между сервером и клиентом
- Перехватчики и метаданные gRPC