Что такое Fiber и зачем он нужен?
Fiber — это быстрый веб-фреймворк для Go, вдохновленный популярным фреймворком Express.js для Node.js. Он создан для разработки высокопроизводительных веб-приложений и API с минимальным потреблением памяти. Fiber использует неблокирующую модель ввода-вывода на основе горутин (goroutines) и пакета fasthttp, что делает его одним из самых быстрых веб-фреймворков для Go.
Зачем нужен Fiber?
- Производительность: Fiber работает значительно быстрее стандартного пакета
net/httpза счет использованияfasthttp. Он способен обрабатывать десятки тысяч запросов в секунду. - Простота и знакомый синтаксис: Если вы знакомы с Express.js, вы быстро освоите Fiber. API очень похож: маршруты, middleware, обработчики запросов — всё интуитивно понятно.
- Нулевое выделение памяти (zero memory allocation): Fiber старается минимизировать выделение памяти, что снижает нагрузку на сборщик мусора и повышает стабильность.
- Расширяемость: Большое количество встроенных middleware (CORS, логирование, сжатие, сессии и т.д.) и возможность создавать собственные.
- Поддержка современных стандартов: Fiber поддерживает HTTP/2, WebSocket, шаблонизаторы, статические файлы и многое другое.
Установка Fiber
Fiber — это библиотека для Go, поэтому установка производится через стандартный менеджер пакетов Go. Убедитесь, что у вас установлен Go версии 1.16 или выше.
# Инициализация модуля (если ещё не сделано)
go mod init myapp
# Установка Fiber (последняя стабильная версия)
go get github.com/gofiber/fiber/v2
После этого вы можете импортировать Fiber в свой проект:
import "github.com/gofiber/fiber/v2"
Примечание: Если вы используете более старую версию Go, может потребоваться установка Fiber v1. Однако рекомендуется использовать v2, так как она активнее развивается.
Быстрый старт с примером кода
Создайте файл main.go и напишите простейший HTTP-сервер:
package main
import "github.com/gofiber/fiber/v2"
func main() {
// Создаём новое приложение Fiber
app := fiber.New()
// Определяем маршрут GET /
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello, Fiber!")
})
// Запускаем сервер на порту 3000
app.Listen(":3000")
}
Запустите сервер:
go run main.go
Откройте браузер и перейдите по адресу http://localhost:3000. Вы увидите сообщение "Hello, Fiber!".
Объяснение:
fiber.New()— создает новый экземпляр приложения.app.Get("/", handler)— регистрирует обработчик для GET-запроса на корневой путь.c *fiber.Ctx— контекст запроса, предоставляющий доступ к данным запроса и ответа.c.SendString()— отправляет строку в качестве ответа.app.Listen(":3000")— запускает сервер на порту 3000.
Основные методы и функции Fiber
Рассмотрим 10 ключевых методов и функций Fiber с подробным описанием и примерами.
1. fiber.New()
Что делает: Создает новый экземпляр приложения Fiber с настройками по умолчанию или с переданной конфигурацией.
Параметры: Принимает необязательный аргумент config ...fiber.Config — структуру с настройками (например, AppName, Prefork, ServerHeader и т.д.).
Пример:
package main
import "github.com/gofiber/fiber/v2"
func main() {
// Создание с настройками по умолчанию
app := fiber.New()
// Создание с кастомной конфигурацией
app2 := fiber.New(fiber.Config{
AppName: "MyApp",
ServerHeader: "Fiber",
Prefork: true, // Использовать все ядра CPU
})
app.Listen(":3000")
app2.Listen(":4000")
}
2. app.Get(), app.Post(), app.Put(), app.Delete()
Что делает: Регистрируют обработчики для соответствующих HTTP-методов (GET, POST, PUT, DELETE) по указанному пути.
Параметры:
path string— путь маршрута (например, "/users/:id").handlers ...fiber.Handler— одна или несколько функций-обработчиков (middleware).
Пример:
app.Get("/users", func(c *fiber.Ctx) error {
return c.SendString("Список пользователей")
})
app.Post("/users", func(c *fiber.Ctx) error {
return c.SendString("Создан новый пользователь")
})
app.Put("/users/:id", func(c *fiber.Ctx) error {
id := c.Params("id")
return c.SendString("Обновлён пользователь с ID: " + id)
})
app.Delete("/users/:id", func(c *fiber.Ctx) error {
id := c.Params("id")
return c.SendString("Удалён пользователь с ID: " + id)
})
3. c.Params()
Что делает: Извлекает значение параметра маршрута (например, из пути /users/:id).
Параметры: key string — имя параметра.
Пример:
app.Get("/users/:id", func(c *fiber.Ctx) error {
id := c.Params("id")
return c.SendString("ID пользователя: " + id)
})
// Пример запроса: GET /users/42
// Ответ: "ID пользователя: 42"
4. c.Query()
Что делает: Извлекает значение query-параметра из URL (например, ?name=John).
Параметры: key string — имя параметра. Необязательный второй аргумент — значение по умолчанию.
Пример:
app.Get("/search", func(c *fiber.Ctx) error {
name := c.Query("name", "Guest")
age := c.Query("age")
return c.SendString("Привет, " + name + "! Возраст: " + age)
})
// Пример запроса: GET /search?name=Alice&age=30
// Ответ: "Привет, Alice! Возраст: 30"
5. c.BodyParser()
Что делает: Парсит тело запроса (JSON, XML, form-data) в переданную структуру.
Параметры: out interface{} — указатель на структуру, в которую будут записаны данные.
Пример:
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
app.Post("/users", func(c *fiber.Ctx) error {
user := new(User)
if err := c.BodyParser(user); err != nil {
return c.Status(400).SendString("Ошибка парсинга: " + err.Error())
}
return c.JSON(user)
})
// Пример запроса: POST /users с телом {"name":"Bob","age":25}
// Ответ: {"name":"Bob","age":25}
6. c.JSON()
Что делает: Отправляет ответ в формате JSON с установленным Content-Type.
Параметры: data interface{} — любые данные, которые будут сериализованы в JSON.
Пример:
app.Get("/api/user", func(c *fiber.Ctx) error {
user := fiber.Map{
"name": "Alice",
"age": 30,
}
return c.JSON(user)
})
// Ответ: {"age":30,"name":"Alice"}
7. c.Status()
Что делает: Устанавливает HTTP-статус ответа. Возвращает контекст для цепочки вызовов.
Параметры: status int — код HTTP-статуса (например, 200, 404, 500).
Пример:
app.Get("/notfound", func(c *fiber.Ctx) error {
return c.Status(404).SendString("Страница не найдена")
})
app.Get("/error", func(c *fiber.Ctx) error {
return c.Status(500).JSON(fiber.Map{
"error": "Внутренняя ошибка сервера",
})
})
8. app.Use()
Что делает: Регистрирует middleware (промежуточное ПО), которое будет выполняться для всех или определённых маршрутов.
Параметры: args ...interface{} — может принимать путь (строку) и/или функции-обработчики.
Пример:
// Middleware для логирования всех запросов
app.Use(func(c *fiber.Ctx) error {
fmt.Println("Запрос:", c.Method(), c.Path())
return c.Next() // Передаём управление следующему обработчику
})
// Middleware только для определённого пути
app.Use("/api", func(c *fiber.Ctx) error {
c.Set("X-Custom-Header", "MyValue")
return c.Next()
})
9. app.Static()
Что делает: Обслуживает статические файлы из указанной директории.
Параметры:
prefix string— префикс URL (например, "/static").root string— корневая директория на сервере.
Пример:
// Обслуживание файлов из папки ./public по пути /static
app.Static("/static", "./public")
// Теперь файл ./public/style.css доступен по адресу /static/style.css
// Можно также обслуживать корневой путь
app.Static("/", "./public")
10. app.Listen()
Что делает: Запускает HTTP-сервер на указанном адресе и порту. Блокирует выполнение до остановки сервера.
Параметры: addr string — адрес и порт (например, ":3000" или "0.0.0.0:8080").
Пример:
app.Listen(":3000")
// С использованием TLS (HTTPS)
app.ListenTLS(":443", "./cert.pem", "./key.pem")
Реальный практический пример использования
Создадим простое REST API для управления списком задач (Todo List) с использованием Fiber. API будет поддерживать CRUD-операции.
package main
import (
"github.com/gofiber/fiber/v2"
"strconv"
)
// Структура задачи
type Todo struct {
ID int `json:"id"`
Title string `json:"title"`
Done bool `json:"done"`
}
// Хранилище задач (в памяти)
var todos = []Todo{
{ID: 1, Title: "Изучить Fiber", Done: false