Содержание урока · 10 разделов
- Что такое Fiber и на чём он работает
- Fiber vs Gin: разница не в скорости, а в фундаменте
- Четыре фреймворка в одной таблице
- Бенчмарки: читайте условия, а не заголовки
- Когда Fiber — правильный выбор, а когда нет
- Что есть в коробке
- Честно про запуск и что дальше
- Песочница урока
- Коротко: что запомнить
- Вопросы и ответы
Представьте типичный переезд: команду переводят с Node.js на Go, бэкенд — десяток REST-эндпоинтов, JSON туда-сюда, пара middleware. На чистом net/http это пишется, но быстро всплывает рутина: вытащи тело запроса, проверь ошибку, собери ответ, проставь код, запиши лог. Каждое действие — руками.
Второй сценарий зеркальный: вы уже пишете на Go, сервис растёт, и хочется готовых решений — логирование, recovery после паник, лимитеры, — а не собирать их из стандартной библиотеки по кусочкам. Оба сценария — нормальные причины взять фреймворк. Вопрос в том, какой именно. Разберём, что такое Fiber, как он устроен и в каких проектах ему место.
Что такое Fiber и на чём он работает#
Fiber — сторонний веб-фреймворк с открытым кодом, вдохновлённый Express.js из Node.js. Проект появился в начале 2020 года и быстро выбился в лидеры: по числу звёзд на GitHub Fiber — второй фреймворк Go после Gin (точные цифры на странице репозитория устаревают быстрее, чем любой учебник, поэтому их лучше смотреть вживую).
Ключевое отличие спрятано в фундаменте. Gin и Echo работают поверх стандартного пакета net/http, а Fiber — поверх Fasthttp, отдельного HTTP-движка от автора fastjson. Fasthttp переписывает обработку соединений с прицелом на переиспользование памяти: запросы и ответы живут в пуле объектов, и на горячем пути почти ничего не аллоцируется. Отсюда слоган Fiber — «zero memory allocation». За эту скорость придётся платить совместимостью, но о цене поговорим чуть ниже.
Первый взгляд: сервер в полтора десятка строк
GOpackage main
import (
"log"
"github.com/gofiber/fiber/v3"
)
func main() {
app := fiber.New()
app.Get("/", func(c fiber.Ctx) error {
return c.SendString("Hello, World!")
})
log.Fatal(app.Listen(":3000"))
}Разбор по строкам. fiber.New() создаёт приложение с настройками по умолчанию и возвращает *fiber.App. app.Get("/", ...) регистрирует маршрут «GET /»: первым аргументом идёт путь, вторым — хендлер, обычная функция, которая принимает контекст и возвращает error. Внутри хендлера c.SendString("Hello, World!") пишет строку в тело ответа; Fiber сам проставит статус 200 и Content-Type: text/plain. app.Listen(":3000") поднимает сервер на порту 3000 и блокирует выполнение до остановки процесса. Ошибку запуска — скажем, занятый порт — отправляем в log.Fatal: она напечатается, а программа завершится с кодом 1.
Fiber vs Gin: разница не в скорости, а в фундаменте#
Запрос «fiber vs gin» — самый частый при выборе фреймворка, поэтому зафиксируем главное. Gin построен на net/http, а значит совместим со всей стандартной экосистемой: middleware в стиле http.Handler, httptest, прокси, инструменты мониторинга — всё подключается без плясок. Fiber построен на Fasthttp, и его типы с net/http несовместимы: готовые middleware из старой экосистемы напрямую не работают.
Взамен Fiber даёт более компактный API и скорость на синтетике. Есть и мост между мирами: middleware/adaptor оборачивает net/http-хендлеры для Fiber и наоборот — если тащить legacy частями, это спасает.
Моё правило простое: проект уже завязан на net/http-экосистему или вы в сомнениях — берите Gin, он предсказуемее. Новый API-сервис с нуля и тяга к Express-стилю — Fiber честный кандидат. Сравнение Gin с другими фреймворками разобрано в отдельном курсе по Gin.
Четыре фреймворка в одной таблице#
| Фреймворк | Основа | Совместимость с net/http | Стиль API | Типичная ниша |
|---|---|---|---|---|
| Fiber | Fasthttp | нет, есть middleware/adaptor | Express-подобный | API-сервисы, миграция с Node.js |
| Gin | net/http | полная | лаконичный, свой контекст | самый распространённый выбор |
| Echo | net/http | полная | минималистичный | REST API |
| chi | net/http | полная | чистые http.Handler | кто хочет остаться в stdlib |
Проверьте себя
На каком HTTP-движке построен Fiber?
Бенчмарки: читайте условия, а не заголовки#
Скорость — главный рекламный аргумент Fiber, и с ним стоит обращаться аккуратно. В синтетических тестах Fasthttp действительно уходит вперёд: маленькие ответы, keep-alive-соединения, plaintext-бенчмарки вроде TechEmpower — там отрыв от net/http измеряется разами. Но условия узкие: в теле ответа несколько байт, базы данных нет, бизнес-логики нет.
В настоящем сервисе узкое место почти всегда другое: запрос к БД, вызов внешнего API, сериализация сложных структур. Смена движка может не сдвинуть время ответа ни на миллисекунду. Практический вывод: если ваш сервис живёт в пределах пары тысяч запросов в секунду, выбирайте фреймворк по удобству API и экосистеме. Скорость Fasthttp раскрывается на отдельных горячих эндпоинтах с крошечными ответами — и это скорее исключение, чем правило.
Типы Fasthttp несовместимы с net/http: http.ResponseWriter и http.Handler в хендлерах Fiber не работают, а стандартные middleware придётся переписывать или оборачивать через middleware/adaptor. Это главный подводный камень фреймворка — взвешивайте его до старта проекта, а не после.
Когда Fiber — правильный выбор, а когда нет#
Fiber раскрывается в трёх ситуациях. Первая — новый REST API или микросервис с нуля: маршруты, валидация, JSON и middleware собраны в одном стиле. Вторая — бэкенд для SPA или мобильного приложения, где эндпоинтов много, а ответы лёгкие. Третья — миграция с Node.js и Express: роуты читаются почти один в один, и команде проще переступить порог.
Когда не стоит. Если сервис глубоко завязан на net/http — стандартные middleware, кастомные http.Handler, интеграции с инфраструктурой — переезд обернётся переделкой всех мостиков. Если проект уже работает на Gin и всё устраивает, переписывать ради «скорости» я бы не стал: трудозатраты не окупятся, о чём уже говорили в разделе про бенчмарки. И если вы только осваиваете язык, начните с базового курса по Go — фреймворк без синтаксиса превращается в магию.
Что есть в коробке#
- Маршрутизация: методы Get/Post/Put/Delete, параметры пути, wildcard-пути
- Middleware: logger, cors, recover, limiter, cache, helmet, requestid и другие
- JSON: c.JSON для ответов, BodyParser для разбора тела запроса
- Статические файлы и отдача SPA одной строкой
- HTML-шаблоны через подключаемые движки (интерфейс Views)
- WebSocket и Server-Sent Events
- Сессии, cookie, подпись и шифрование cookie
- Тестовый режим app.Test — HTTP-запрос к приложению без сети
Что ответит сервер из этого кода на запрос GET /, если при старте ничего не упало?
Прочитайте код и выберите, что он выведет:
app := fiber.New()
app.Get("/", func(c fiber.Ctx) error {
return c.SendString("Привет, Fiber!")
})Соберите hello world
Вставьте пропущенные вызовы Fiber, чтобы сервер собрался и ответил на корневой маршрут.
Порядок внутри main()
Соберите тело main() первого сервера: от создания приложения до запуска. Лишних строк нет.
Строки
Ваша программа
Нажимайте на строки слева, чтобы собрать программу
Словарь урока
Честно про запуск и что дальше#
Один момент стоит проговорить сразу: код Fiber в браузерной песочнице этого сайта не запускается — сетевые приложения она не умеет. Все примеры курса — рабочие образцы с построчным разбором; чтобы выполнить их руками, нужен локально установленный Go, покажем дальше.
В следующем уроке поставим Fiber, соберём первый сервер и проверим его ответ через curl: Урок 2: установка и первый сервер.
Песочница урока
Редактируйте код и запускайте его прямо здесь — интерпретатор работает в браузере, ничего устанавливать не нужно. За каждый запуск — +2 XP.
Запустите код, чтобы увидеть вывод.
Коротко: что запомнить
- Fiber — Express-подобный фреймворк Go поверх движка Fasthttp, второй по популярности после Gin.
- Главное отличие от Gin — фундамент: Fasthttp вместо net/http, отсюда скорость и несовместимость с http.Handler.
- middleware/adaptor — мост между Fiber и экосистемой net/http, если без legacy не обойтись.
- Бенчмарки показывают отрыв на маленьких ответах; в реальных сервисах узкое место обычно в БД и внешних вызовах.
- Fiber уместен для новых API-сервисов и миграции с Express; для проектов на net/http честнее Gin.
- Хендлер Fiber — функция func(c fiber.Ctx) error; ответ пишется методами контекста вроде c.SendString.
Домашнее задание
Выпишите пять эндпоинтов вашего текущего проекта (или придумайте сервис заметок) и для каждого пометьте: какой HTTP-метод нужен, есть ли параметры пути, какой middleware пригодится. Затем воспроизведите hello world из урока по памяти, не подглядывая, — это лучший тест на то, что структура Fiber-сервера отложилась.
Личные заметкиПусто
Вопросы и ответы по уроку
Fiber быстрее Gin?
На синтетических бенчмарках с маленькими ответами — заметно. В реальных сервисах узкое место обычно в БД и внешних вызовах, поэтому разница часто остаётся невидимой для пользователя.
Можно ли использовать стандартные net/http middleware с Fiber?
Напрямую нет — типы несовместимы. Мостом служит middleware/adaptor, который оборачивает http.Handler для Fiber и Fiber-хендлеры для net/http.
Какая версия Fiber актуальна?
Актуальная ветка — v3, пакет github.com/gofiber/fiber/v3. В старых туториалах встречается v2: там другой путь импорта и указатель *fiber.Ctx в хендлерах.
Термины урока
Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.
Сравните с альтернативами
Практический вопрос после первых уроков: а почему именно эта библиотека? Мы разобрали конкурентов по одним критериям, с кодом одной задачи рядом и персональным подбором под ваши приоритеты.
Изучайте дальше
Следующая ступень учебного пути
Gin: самый популярный веб-фреймворк Go
Курс Gin для Go: маршрутизация, binding, валидация, middleware, JWT, WebSocket, тесты и деплой. 25 уроков с кодом и итоговым REST API.
- Уверенно владеть gin.Engine: маршруты, группы, версии
- Привязывать запросы к структурам (ShouldBindJSON и др.)
- Писать middleware и использовать встроенные
- Строить аутентификацию на JWT