Перейти к содержимому
ГоМастер

Поиск по урокам

Найдите урок, курс, термин или раздел

Урок 1 из 25 ~15 мин +50 XP

Знакомство с Fiber: зачем и когда

Fiber — это веб-фреймворк для Go, который выглядит как Express из Node.js, а работает поверх движка Fasthttp. Разберём, что такое Fiber, чем он отличается от Gin и стандартного net/http, в каких проектах он уместен, а в каких его брать не стоит — с примерами кода и без маркетингового тумана.

Содержание урока · 10 разделов

Представьте типичный переезд: команду переводят с 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». За эту скорость придётся платить совместимостью, но о цене поговорим чуть ниже.

Первый взгляд: сервер в полтора десятка строк

GO
package 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Типичная ниша
FiberFasthttpнет, есть middleware/adaptorExpress-подобныйAPI-сервисы, миграция с Node.js
Ginnet/httpполнаялаконичный, свой контекстсамый распространённый выбор
Echonet/httpполнаяминималистичныйREST API
chinet/httpполнаячистые http.Handlerкто хочет остаться в stdlib

Проверьте себя

На каком HTTP-движке построен Fiber?

Бенчмарки: читайте условия, а не заголовки#

Скорость — главный рекламный аргумент Fiber, и с ним стоит обращаться аккуратно. В синтетических тестах Fasthttp действительно уходит вперёд: маленькие ответы, keep-alive-соединения, plaintext-бенчмарки вроде TechEmpower — там отрыв от net/http измеряется разами. Но условия узкие: в теле ответа несколько байт, базы данных нет, бизнес-логики нет.

В настоящем сервисе узкое место почти всегда другое: запрос к БД, вызов внешнего API, сериализация сложных структур. Смена движка может не сдвинуть время ответа ни на миллисекунду. Практический вывод: если ваш сервис живёт в пределах пары тысяч запросов в секунду, выбирайте фреймворк по удобству API и экосистеме. Скорость Fasthttp раскрывается на отдельных горячих эндпоинтах с крошечными ответами — и это скорее исключение, чем правило.

Когда 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, чтобы сервер собрался и ответил на корневой маршрут.

package main import ( "log" "github.com/gofiber/fiber/v3" ) func main() { app := () app.("/", func(c fiber.Ctx) error { return c.("Привет, Fiber!") }) log.Fatal(app.(":3000")) }

Порядок внутри main()

Соберите тело main() первого сервера: от создания приложения до запуска. Лишних строк нет.

Строки

Ваша программа

Нажимайте на строки слева, чтобы собрать программу

Словарь урока

Термин

Fiber

нажмите, чтобы перевернуть
Определение

Express-подобный веб-фреймворк для Go, работающий поверх движка Fasthttp.

1 / 6

Честно про запуск и что дальше#

Один момент стоит проговорить сразу: код 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 · Знакомство с 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 в хендлерах.

Термины урока

Ключевые понятия из этого урока — короткие определения в глоссарии. Наведите на термин, чтобы вспомнить, откройте карточку для подробностей и ссылки на практику.

Сравните с альтернативами

Практический вопрос после первых уроков: а почему именно эта библиотека? Мы разобрали конкурентов по одним критериям, с кодом одной задачи рядом и персональным подбором под ваши приоритеты.

Следующая ступень учебного пути

Gin25 уроков~13 чпрактика25 уроков уже доступны

Gin: самый популярный веб-фреймворк Go

Курс Gin для Go: маршрутизация, binding, валидация, middleware, JWT, WebSocket, тесты и деплой. 25 уроков с кодом и итоговым REST API.

  • Уверенно владеть gin.Engine: маршруты, группы, версии
  • Привязывать запросы к структурам (ShouldBindJSON и др.)
  • Писать middleware и использовать встроенные
  • Строить аутентификацию на JWT