0Pricing
Go Academy · Урок

Перехватчики и метаданные 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 — локальная установка не требуется.

Все уроки этого курса

  1. Protocol Buffers и .proto-файлы
  2. Реализация унарного сервиса gRPC
  3. Потоковая передача между сервером и клиентом
  4. Перехватчики и метаданные gRPC
← Назад к Go Academy