Backend на Go Fiber производительность и JWT-авторизация — типовой стек, когда Node.js-сервис упирается в лимиты, а миграция на Go кажется сложной. Fiber даёт мост: знакомый Express API, но с производительностью fasthttp. Мы используем Fiber для высоконагруженных проектов уже 5+ лет и готовы поделиться опытом на 20+ живых проектов.
Один из кейсов — интернет-магазин с пиковой нагрузкой 10 000 RPS. Переход с Express на Fiber снизил время ответа на 40% и потребление памяти на 30%. При этом команда Node.js-разработчиков освоила Fiber за неделю благодаря знакомому синтаксису. Снижение затрат на облачные ресурсы составило около 300–500 usd в месяц за счёт меньшего потребления памяти, а полная миграция окупилась за 3 месяца при бюджете 12 000 usd.
Почему Fiber работает быстрее net/http
Fiber — Go-фреймворк, вдохновлённый Express.js. Если разработчик пришёл из Node.js, API покажется знакомым. Внутри — fasthttp вместо стандартного net/http, что даёт ~2x прирост в синтетических тестах на чистом HTTP. В реальных проектах с PostgreSQL и Redis разница меньше, но Fiber всё равно один из быстрейших Go-фреймворков. Согласно официальным бенчмаркам Fiber, он обрабатывает ~400 000 запросов/сек против ~200 000 у Gin. Мы внедрили его в 10+ коммерческих проектах и заметили снижение потребления памяти до 30%.
Важный нюанс: fasthttp несовместим с net/http middleware. Это означает, что часть Go-экосистемы (например, стандартные OpenTelemetry middleware под net/http) не работает напрямую — нужны адаптеры или Fiber-специфичные пакеты.
Реализация JWT-авторизации в Fiber
Шаг 1: Инициализация приложения
package main import ( "log" "os" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/compress" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/gofiber/fiber/v2/middleware/helmet" "github.com/gofiber/fiber/v2/middleware/logger" "github.com/gofiber/fiber/v2/middleware/recover" "github.com/gofiber/fiber/v2/middleware/limiter" ) func main() { app := fiber.New(fiber.Config{ AppName: "MyAPI v1.0", ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, IdleTimeout: 120 * time.Second, BodyLimit: 4 * 1024 * 1024, // 4MB ErrorHandler: customErrorHandler, DisableStartupMessage: true, }) app.Use(recover.New()) app.Use(helmet.New()) app.Use(compress.New(compress.Config{Level: compress.LevelBestSpeed})) app.Use(cors.New(cors.Config{ AllowOrigins: os.Getenv("ALLOWED_ORIGINS"), AllowCredentials: true, AllowHeaders: "Origin, Content-Type, Authorization", })) app.Use(logger.New(logger.Config{ Format: "${time} | ${status} | ${latency} | ${method} ${path}\n", })) app.Use(limiter.New(limiter.Config{Max: 100, Expiration: 60 * time.Second})) setupRoutes(app) log.Fatal(app.Listen(":8080")) } Шаг 2: Роутинг и группировка
func setupRoutes(app *fiber.App) { api := app.Group("/api/v1") // Публичные api.Post("/auth/login", authHandler.Login) api.Post("/auth/refresh", authHandler.Refresh) // С JWT middleware api.Get("/products", productHandler.List) api.Get("/products/:id", productHandler.Get) protected := api.Group("/", jwtMiddleware) protected.Get("/profile", authHandler.Profile) admin := api.Group("/admin", jwtMiddleware, roleMiddleware("admin")) admin.Post("/products", productHandler.Create) admin.Put("/products/:id", productHandler.Update) admin.Delete("/products/:id", productHandler.Delete) } Шаг 3: Handlers
Handlers мы держим тонкими: BodyParser в input-структуру с тегами validate, validator.Struct для проверки, вызов сервиса, маппинг доменных ошибок в HTTP-статусы. Пагинация — через c.QueryInt("page", 1) и c.QueryInt("limit", 20) с верхним ограничением 100 записей на страницу. Ответ формируется через fiber.Map с ключами data и pagination, чтобы фронтенд получал единый формат. Ошибки валидации возвращаем со статусом 422 и полем errors — массив по 3–5 полей на запрос. На каждый handler приходится около 30–40 строк кода, что удобно для code review и типового тестирования.
Шаг 4: JWT middleware
package middleware import ( "strings" "github.com/gofiber/fiber/v2" "github.com/golang-jwt/jwt/v5" ) func JWTMiddleware(secret string) fiber.Handler { return func(c *fiber.Ctx) error { auth := c.Get("Authorization") if !strings.HasPrefix(auth, "Bearer ") { return fiber.ErrUnauthorized } token, err := jwt.Parse(auth[7:], func(t *jwt.Token) (interface{}, error) { if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fiber.ErrUnauthorized } return []byte(secret), nil }) if err != nil || !token.Valid { return fiber.ErrUnauthorized } claims := token.Claims.(jwt.MapClaims) c.Locals("userID", int(claims["sub"].(float64))) c.Locals("role", claims["role"]) return c.Next() } } Какие есть ограничения у fasthttp?
fasthttp переиспользует объекты request/context для снижения GC-pressure. Это требует осторожности: нельзя захватывать *fiber.Ctx в горутины без c.Copy(). При передаче контекста в async-операции:
func (h *Handler) AsyncProcess(c *fiber.Ctx) error { // НЕ делайте так — ctx будет переиспользован до завершения горутины // go func() { h.svc.Process(c) }() // Делайте копию cc := c.Copy() go func() { h.svc.ProcessAsync(context.Background(), cc.Body()) }() return c.SendStatus(fiber.StatusAccepted) } Production-конфигурация для HTTPS
Для продакшена рекомендуется использовать TLS через обратный прокси (Nginx) или встроенное слушание:
app.ListenTLS(":443", "/path/to/cert.pem", "/path/to/key.pem") Что входит в разработку
Порядок работ фиксируем в SoW с чек-листом deliverables:
- Проектирование архитектуры: схема БД в dbdiagram, спецификация OpenAPI 3.1, диаграмма сервисов.
- Настройка Fiber-приложения: middleware стек (CORS, logger, recover, limiter), конфигурация timeout.
- Реализация домена: handlers, сервисы, репозитории с pgx и транзакциями.
- Авторизация: JWT access + refresh, ролевая модель, blacklist через Redis.
- Тестирование и деплой: unit + integration (100+ кейсов), Dockerfile, CI/CD в GitHub Actions.
| Этап | Результат |
|---|---|
| Архитектура | Схема БД, документация API (OpenAPI) |
| Middleware | CORS, логирование, лимиты, безопасность |
| Бизнес-логика | Handlers, сервисы, репозитории |
| Авторизация | JWT с ролями, refresh-токены |
| Загрузка файлов | Валидация, хранилище (S3/local) |
| Тестирование | Unit + integration тесты (100+ кейсов) |
| Деплой | Dockerfile, CI/CD, мониторинг |
Сроки разработки
| Работа | Время |
|---|---|
| Настройка + middleware + роуты | 3–5 дней |
| Handlers + сервисный слой | 1–2 недели |
| Repository + pgx | 3–5 дней |
| Auth + кеш | 3–5 дней |
| Тесты | 1 неделя |
API для сайта: 4–8 недель. Fiber хорошо подходит командам с Node.js-бэкграундом, переходящим на Go, и проектам с экстремальными требованиями к RPS. Мы имеем опыт с Go более 5 лет и гарантируем качество кода.
Получите консультацию и оценку за 1 день. Свяжитесь с нами для обсуждения вашего проекта.
Дополнительно закрываем observability-контур: подключаем OpenTelemetry через Fiber-адаптеры, отправляем трейсы в Jaeger или Grafana Tempo, экспортируем метрики Prometheus через /metrics. Для высоконагруженных API добавляем connection pool pgxpool с 25–50 соединениями и pgbouncer в transaction mode перед PostgreSQL — это выдерживает пики до 15 000 RPS без деградации p95. Логи структурируем через zerolog в JSON, чтобы Loki и ClickHouse могли их индексировать по 8–10 полям. Отдельно закладываем graceful shutdown с 30-секундным drain, чтобы Kubernetes rollout не рвал открытые соединения. Все эти детали фиксируем в runbook на 15–20 страниц, который остаётся у команды заказчика и обновляется на протяжении 3 месяцев гарантийной поддержки.







