Ответ вслух Middle net/http и middleware обновлено

HTTP-сервис на стандартной библиотеке

Вопрос

Как вы соберёте production-ready HTTP-сервис на net/http без фреймворков?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Роутинг беру из стандартного ServeMux: с Go 1.22 он понимает GET /orders/{id}, а r.PathValue достаёт параметр. Если нужны группы маршрутов и middleware на подгруппы, беру chi, он совместим с net/http.

Что должно прозвучать в ответе

  • ServeMux Go 1.22 с методами и PathValue или chi

  • Цепочка middleware: recover, request id, логирование slog, метрики, авторизация

  • http.Server с ReadHeaderTimeout, ReadTimeout, WriteTimeout, IdleTimeout, MaxBytesReader

  • context запроса в базу и внешние вызовы, клиент с таймаутом

  • Health и readiness эндпоинты, pprof на отдельном внутреннем порту

  • Graceful shutdown через signal.NotifyContext и Shutdown

Что могут спросить следом

  • Чем chi лучше стандартного ServeMux?
  • Как отдать ошибки в едином формате?

Разбор

Роутинг беру из стандартного ServeMux: с Go 1.22 он понимает GET /orders/{id}, а r.PathValue достаёт параметр. Если нужны группы маршрутов и middleware на подгруппы, беру chi, он совместим с net/http. Middleware в порядке снаружи внутрь: recover с логом паники, request id в контекст, логирование через slog со статусом и временем, метрики Prometheus, авторизация. Сервер создаю явно: ReadHeaderTimeout 5 с, ReadTimeout и WriteTimeout под характер API, IdleTimeout 60 с, тела ограничиваю MaxBytesReader. В обработчиках передаю r.Context() в базу. Ошибки маппятся в единый JSON с кодом в одном хелпере. /healthz и /readyz для Kubernetes, pprof и метрики на отдельном порту, недоступном снаружи. Запуск в горутине, main ждёт signal.NotifyContext, затем Shutdown с таймаутом, потом закрытие пула базы.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме