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 生态的项目。