Middleware паттерны
Тема дорожной карты · Golang
HTTP-middleware в Go — функция, оборачивающая http.Handler для перехвата запросов и ответов, реализующая сигнатуру func(http.Handler) http.Handler, которую стандартизируют все основные Golang-фреймворки — Gin, Echo, Fiber, Chi. Цепочки middleware обрабатывают сквозные задачи: аутентификацию, структурированное логирование с Zap или slog, инъекцию request ID, ограничение частоты запросов и трассировку OpenTelemetry, не загромождая код обработчиков маршрутов. В стандартной библиотеке HTTP-middleware составляется вложением http.Handler-значений: http.Handle("/", loggingMiddleware(authMiddleware(myHandler))), а маршрутизаторы вроде Chi предоставляют r.Use(...) для более чистого формирования цепочек. HTTP-middleware в Go может читать и изменять значения context.Context через r.Context() и context.WithValue, позволяя идентификаторам трассировки и объектам аутентифицированного пользователя распространяться через весь жизненный цикл запроса. Умение писать и компоновать HTTP-middleware в Go — ключевой навык для построения production-качественных Golang REST API и gRPC-gateway сервисов.
Как это работает
Middleware паттерны покрывает Gin (самый популярный, быстрый, много middleware), Echo, Fiber (на fasthttp, не stdlib), Chi (идиоматичный, stdlib-совместимый), и сам stdlib net/http + ServeMux (получил route patterns в 1.22). Для full-stack: Gin или Echo — для типичных API; Chi — если хотите stdlib-совместимость; сырой net/http — для минимальных HTTP-серверов. Middleware-паттерн: handlers — функции, оборачивающие другие handlers.
Когда применять
Chi — если хотите минимальный слой над stdlib с first-class роутингом + middleware. Gin — для крупнейшей экосистемы рецептов и middleware. Сырой net/http — для крошечных сервисов или sidecars. Избегайте Fiber, кроме осознанного выбора non-stdlib стэка fasthttp — Fiber не использует стандартные интерфейсы Go.
Типичные ошибки
Ловушки Middleware паттерны: нет таймаутов на HTTP-сервере (ReadHeaderTimeout, ReadTimeout, WriteTimeout, IdleTimeout); handler-логика не проверяет r.Context() на cancellation (медленные клиенты блокируют goroutines); вы заперты в non-stdlib интерфейсы Fiber (каждый middleware требует Fiber-специфичного порта).