
Fiber是一个受到Express(js 流行web框架)启发的Web框架,基于Go语言编写的最快的 HTTP 引擎 Fasthttp构建。旨在通过零内存分配和高性能服务,使快速开发更加简便。
特点
- 强大的路由
- 静态文件服务
- 极致性能
- 低内存占用
- API 接口
- 支持中间件和 Next
- 快速上手
- 模版引擎
- 支持 WebSocket
- Server-Sent events
- 频率限制
哲学
从 Node.js切换到Go的新 gopher 在开始构建 Web 应用程序或微服务之前需要经历一段艰难的学习过程。 而 Fiber,一个基于极简主义并且遵循 UNIX 方式创建的 Web 框架, 使新的 gopher 可以在热烈和可信赖的欢迎中迅速进入 Go 的世界。
Fiber受到了互联网上最流行的Web框架Express的启发 。我们结合了Express的易用性和Go的原始性能 。如果您曾经使用Node.js构建Web应用程序(使用 Express 或类似框架),那么许多方法和原理对您来说应该非常易懂。
快速入门
安装
确保已安装 1.17 或更高版本的 Go。
通过创建文件夹并在文件夹内运行 go mod init github.com/your/repo 来初始化项目,然后使用 go get命令安装 Fiber:
go get -u github.com/gofiber/fiber/v2
Hello World
package main
// 导入fiber包
import "github.com/gofiber/fiber/v2"
func main() {
// 定义fiber应用
app := fiber.New()
// 定义http route
app.Get("/", func(c *fiber.Ctx) error {
// 以字符串的形式返回hello world
return c.SendString("Hello, World 👋!")
})
// 监听3000端口
app.Listen(":3000")
}
通过: http://localhost:3000/ 访问
基础路由
fiber基础路由例子
func main() {
app := fiber.New()
// GET /api/register
app.Get("/api/*", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("✋ %s", c.Params("*"))
return c.SendString(msg) // => ✋ register
})
// GET /flights/LAX-SFO
app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to"))
return c.SendString(msg) // => 💸 From: LAX, To: SFO
})
// GET /dictionary.txt
app.Get("/:file.:ext", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext"))
return c.SendString(msg) // => 📃 dictionary.txt
})
// GET /john/75
app.Get("/:name/:age/:gender?", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age"))
return c.SendString(msg) // => 👴 john is 75 years old
})
// GET /john
app.Get("/:name", func(c *fiber.Ctx) error {
msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
return c.SendString(msg) // => Hello john 👋!
})
log.Fatal(app.Listen(":3000"))
}
静态文件服务
设置静态文件访问方式
func main() {
app := fiber.New()
app.Static("/", "./public")
// => http://localhost:3000/js/script.js
// => http://localhost:3000/css/style.css
app.Static("/prefix", "./public")
// => http://localhost:3000/prefix/js/script.js
// => http://localhost:3000/prefix/css/style.css
app.Static("*", "./public/index.html")
// => http://localhost:3000/any/path/shows/index/html
log.Fatal(app.Listen(":3000"))
}
中间件
通过中间件增强http请求处理能力
func main() {
app := fiber.New()
// 匹配任意路由,这里通过闭包函数自定义中间件
app.Use(func(c *fiber.Ctx) error {
fmt.Println("🥇 First handler")
// 继续处理下一个中间件或者路由函数
return c.Next()
})
// 匹配 /api 开头的路由
app.Use("/api", func(c *fiber.Ctx) error {
fmt.Println("🥈 Second handler")
return c.Next()
})
// 使用框架内置的中间件-异常处理中间件
app.Use(recover.New())
// GET /api/register
app.Get("/api/list", func(c *fiber.Ctx) error {
fmt.Println("🥉 Last handler")
return c.SendString("Hello, World 👋!")
})
log.Fatal(app.Listen(":3000"))
}
模版引擎
如果未设置模版引擎,则Fiber默认使用 html/template。
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/pug"
)
func main() {
// 设置模板引擎
app := fiber.New(fiber.Config{
Views: pug.New("./views", ".pug"),
})
app.Get("/", func(c *fiber.Ctx) error {
// 通过fiber.map模板参数,渲染./views/home.pug模板
return c.Render("home", fiber.Map{
"title": "Homepage",
"year": 1999,
})
})
log.Fatal(app.Listen(":3000"))
}
跨域资源共享(CORS)中间件
用于 Fiber 的 CORS 中间件,可通过各种选项启用跨源资源共享,防止CORS攻击。
import (
"log"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
)
func main() {
app := fiber.New()
// 默认CORS配置
app.Use(cors.New())
// 或者自定义CORS参数,允许那些域名请求API
app.Use(cors.New(cors.Config{
AllowOrigins: "https://www.tizi365.com, https://tizi365.com",
AllowHeaders: "Origin, Content-Type, Accept",
}))
log.Fatal(app.Listen(":3000"))
}
通过在请求头中设置 Origin 传递任何域来检查 CORS :
curl -H "Origin: https://www.tizi365.com" --verbose http://localhost:3000
自定义 404 响应
func main() {
app := fiber.New()
app.Static("/", "./public")
app.Get("/demo", func(c *fiber.Ctx) error {
return c.SendString("This is a demo!")
})
app.Post("/register", func(c *fiber.Ctx) error {
return c.SendString("Welcome!")
})
// 最后一个引用的中间件会匹配所有的请求,包括404
app.Use(func(c *fiber.Ctx) error {
// 其他处理逻辑
// 返回404状态
return c.SendStatus(404)
// => 404 "Not Found"
})
log.Fatal(app.Listen(":3000"))
}
JSON 响应
fiber返回JSON数据的例子
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
app := fiber.New()
app.Get("/user", func(c *fiber.Ctx) error {
return c.JSON(&User{"John", 20})
// => {"name":"John", "age":20}
})
app.Get("/json", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{
"success": true,
"message": "Hi John!",
})
// => {"success":true, "message":"Hi John!"}
})
log.Fatal(app.Listen(":3000"))
}
恢复(panic)中间件
拦截panic错误,避免程序崩溃退出
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/recover"
)
func main() {
app := fiber.New()
// 使用painc中间件,拦截panic异常
app.Use(recover.New())
app.Get("/", func(c *fiber.Ctx) error {
panic("normally this would crash your app")
})
log.Fatal(app.Listen(":3000"))
}
基准测试

[
限制
- 由于 Fiber 使用了 unsafe 特性,导致其可能与最新的 Go 版本不兼容。Fiber 2.40.0 已经在 Go 1.17 到 1.21 上测试过。
- Fiber 与 net/http 接口不兼容。也就是说你无法直接使用例如 gqlen,go-swagger 或者任何其他属于 net/http 生态的项目。