Interceptors

Тема дорожной карты · Golang

gRPC-интерсепторы — gRPC-эквивалент HTTP-middleware: функции, оборачивающие каждый RPC-вызов на стороне клиента или сервера для внедрения сквозного поведения без изменения отдельных реализаций обработчиков. В пакете Go google.golang.org/grpc унарные серверные интерсепторы реализуют сигнатуру функции grpc.UnaryServerInterceptor вида func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error), а стриминговые — используют grpc.StreamServerInterceptor. Типичные применения gRPC-интерсепторов включают аутентификацию и авторизацию (проверка JWT-токенов из metadata.FromIncomingContext(ctx)), структурированное логирование с Zap или slog, инъекцию распределённой трассировки с OpenTelemetry (otelgrpc.UnaryServerInterceptor()), сбор метрик Prometheus (grpc_prometheus.UnaryServerInterceptor), восстановление после паники и валидацию запросов. Несколько интерсепторов объединяются цепочкой через grpc.ChainUnaryInterceptor(...) (доступно с gRPC-Go v1.34), заменяя более ранний хелпер go-grpc-middleware. Клиентские интерсепторы (grpc.WithUnaryInterceptor, grpc.WithChainUnaryInterceptor) симметричны серверным и используются для логики повторных попыток, circuit breaking и распространения контекста трассировки в исходящих gRPC-вызовах из Golang-микросервисов.

Как это работает

Interceptors — HTTP/2-based RPC с Protocol Buffers (.proto) как языком схемы. protoc + protoc-gen-go-grpc генерируют Go-server + client stubs из .proto-файлов. Streaming-варианты (unary, server-streaming, client-streaming, bidi). Reflection для introspection (grpcurl). Connect-go (альтернатива Buf) даёт gRPC-совместимые HTTP/1 + HTTP/2 серверы — interoperable с gRPC-клиентами. gRPC-Gateway экспонирует gRPC-сервисы как REST + OpenAPI.

Когда применять

gRPC — для internal service-to-service, когда важны latency + schema-дисциплина; типизированные контракты ловят много багов на compile time. В паре с Buf — для build + lint proto-файлов. Для публичных API — gRPC-Gateway или Connect для REST/HTTP рядом. Для browser-to-server Connect-go чище, чем gRPC-Web. Избегайте gRPC для одноразовых скриптов или крошечных сервисов — REST проще.

Типичные ошибки

Ловушки Interceptors: регенерация proto-файлов без коммита (CI ломается из-за отсутствия сгенерированного кода); breaking changes в .proto без bump версии (клиенты валятся непонятным образом); огромные proto-пакеты, затрагивающие каждый сервис на изменение; игнор context.Context deadlines (вызовы висят навеки).

Связанные понятия

Полезные ресурсы