golang,go,博客,开源,编程

golang每日一库之gofiber/fiber

Published on with 0 views and 0 comments

Fiber 是一个 极其轻量级且高性能Go Web 框架,受 Express.js 启发,专为 快速开发 REST API 和 Web 应用设计。Fiber 构建于 Fasthttp 之上,号称是 Go 语言最快的 Web 框架之一,提供了简洁的 API 和强大的功能,非常适合构建高吞吐量的 Web 服务。


核心特性

🚀 极致性能

  • 采用 Fasthttp 作为底层 HTTP 服务器,性能比 net/http快 10 倍 以上。
  • 低 CPU 和内存占用,非常适合 高并发应用

📦 Express.js 风格 API

  • 受 Node.js 的 Express 框架启发,提供类似 app.Get()app.Post() 这样简洁直观的路由 API。

🔥 内置丰富功能

  • 路由系统(带有参数、通配符、正则匹配)
  • 中间件支持(如 CORS、JWT、Gzip、Logger)
  • WebSocket 支持
  • 静态文件托管
  • 请求体解析(JSON、表单、XML 等)
  • Session & Cookie 管理

💡 零依赖 & 兼容 net/http

  • 轻量级,只有一个依赖 fasthttp,无其他额外依赖。
  • 兼容 Go 标准库 net/http,可以轻松迁移。

📡 内置 WebSocket、GraphQL 支持

  • 通过 Fiber 中间件,轻松集成 WebSocket、GraphQL、Swagger 等。

安装

go get -u github.com/gofiber/fiber/v2

快速上手

1️⃣ 创建 Fiber 应用

package main

import (
	"github.com/gofiber/fiber/v2"
)

func main() {
	app := fiber.New()

	// 定义路由
	app.Get("/", func(c *fiber.Ctx) error {
		return c.SendString("Hello, Fiber!")
	})

	// 启动服务器
	app.Listen(":3000")
}

运行后访问 http://localhost:3000,可以看到 "Hello, Fiber!"


路由系统

Fiber 提供强大的路由功能,包括:

1️⃣ 基本路由

app.Get("/hello", func(c *fiber.Ctx) error {
	return c.SendString("Hello, World!")
})

2️⃣ 动态路由

app.Get("/user/:id", func(c *fiber.Ctx) error {
	id := c.Params("id")
	return c.SendString("User ID: " + id)
})

3️⃣ 通配符路由

app.Get("/api/*", func(c *fiber.Ctx) error {
	return c.SendString("Wildcard match: " + c.Params("*"))
})

4️⃣ 路由分组

api := app.Group("/api")
api.Get("/users", func(c *fiber.Ctx) error {
	return c.JSON(fiber.Map{"message": "All users"})
})
api.Get("/products", func(c *fiber.Ctx) error {
	return c.JSON(fiber.Map{"message": "All products"})
})

请求处理

1️⃣ 解析 JSON 请求

type User struct {
	Name  string `json:"name"`
	Email string `json:"email"`
}

app.Post("/user", func(c *fiber.Ctx) error {
	u := new(User)
	if err := c.BodyParser(u); err != nil {
		return err
	}
	return c.JSON(fiber.Map{"status": "success", "user": u})
})

2️⃣ 处理 URL 查询参数

app.Get("/search", func(c *fiber.Ctx) error {
	query := c.Query("q", "default_value") // 如果 `q` 为空,则返回 `default_value`
	return c.SendString("Search query: " + query)
})

3️⃣ 读取表单数据

app.Post("/form", func(c *fiber.Ctx) error {
	name := c.FormValue("name")
	return c.SendString("Form Name: " + name)
})

中间件

Fiber 提供丰富的 内置中间件,如 CORS、JWT、Gzip、Logger 等。

1️⃣ 使用 Gzip 压缩

app.Use(func(c *fiber.Ctx) error {
	c.Set("Content-Encoding", "gzip")
	return c.Next()
})

2️⃣ 记录日志

app.Use(fiber.Logger())

3️⃣ 启用 CORS

app.Use(fiber.CORS())

4️⃣ JWT 认证

import "github.com/gofiber/jwt/v3"

app.Use(jwtware.New(jwtware.Config{
	SigningKey: []byte("secret"),
}))

静态文件

Fiber 允许直接托管静态文件:

app.Static("/static", "./public")

访问 http://localhost:3000/static/image.png,即可访问 ./public/image.png


WebSocket

Fiber 内置了 WebSocket 支持:

import "github.com/gofiber/websocket/v2"

app.Get("/ws", websocket.New(func(c *websocket.Conn) {
	for {
		messageType, msg, err := c.ReadMessage()
		if err != nil {
			break
		}
		c.WriteMessage(messageType, msg)
	}
}))

GinEcho 的对比

特性Fiber 🚀Gin ⚡Echo 🌟
底层实现fasthttpnet/httpnet/http
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Express 风格 API
中间件支持
WebSocket
适用场景高性能 API轻量 APIWeb 应用

结论:

  • Fiber 适用于超高性能 API 服务器,需要处理大量并发请求的应用。
  • Gin 适用于常规 API 服务,社区广泛,生态丰富。
  • Echo 适用于高扩展性 Web 框架,支持 WebSocket,适合实时应用。

部署 Fiber 应用

Fiber 兼容 systemdDocker,适用于 Kubernetes、Serverless 部署

1️⃣ 使用 systemd 启动 Fiber

创建 fiber.service

[Unit]
Description=Fiber Web Server
After=network.target

[Service]
ExecStart=/usr/local/bin/my-fiber-app
Restart=always
User=nobody
Group=nogroup

[Install]
WantedBy=multi-user.target

然后启用:

sudo systemctl enable fiber.service
sudo systemctl start fiber.service

2️⃣ 使用 Docker 部署

创建 Dockerfile

FROM golang:1.20

WORKDIR /app
COPY . .

RUN go mod tidy
RUN go build -o main .

CMD ["/app/main"]

然后构建并运行:

docker build -t fiber-app .
docker run -p 3000:3000 fiber-app

最后

  1. Fiber 是目前 Go 生态中最快的 Web 框架,基于 fasthttp,适合高并发 API 服务。
  2. 提供类似 Express.js 的 API,易学易用,非常适合 Node.js 开发者转 Go。
  3. 支持 WebSocket、JWT、CORS、Gzip 等高级功能,适用于各种 Web 项目。
  4. 适用于微服务、REST API、GraphQL、静态站点等应用场景

标题:golang每日一库之gofiber/fiber
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/03/18/1742282287219.html
联系:scotttu@163.com