第 0002 荐:Fiber,超高性能的Go Web框架 - 图1

Fiber,一个受Express启发的Golang Web框架,建立在Fasthttp 的基础之上。旨在简化零内存分配高性能,以及快速开发。

⚡️ 快速入门

  1. package main
  2. import "github.com/gofiber/fiber/v2"
  3. func main() {
  4. app := fiber.New()
  5. app.Get("/", func(c *fiber.Ctx) error {
  6. return c.SendString("Hello, World 👋!")
  7. })
  8. app.Listen(":3000")
  9. }

🤖 性能

这些测试由TechEmpowerGo Web 执行。如果要查看所有结果,请访问我们的Wiki

第 0002 荐:Fiber,超高性能的Go Web框架 - 图2

第 0002 荐:Fiber,超高性能的Go Web框架 - 图3

⚙️ 安装

确保已安装 (下载) 1.14 或更高版本的 Go。

通过创建文件夹并在文件夹内运行 go mod init github.com/your/repo (了解更多) 来初始化项目,然后使用 go get 命令安装 Fiber:

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

🎯 特点

💡 哲学

Node.js切换到Go的新gopher在开始构建Web应用程序或微服务之前正在应对学习曲线。 Fiber作为一个Web 框架 ,是按照极简主义的思想并遵循UNIX 方式创建的,因此新的gopher可以在热烈和可信赖的欢迎中迅速进入Go的世界。

Fiber受到了互联网上最流行的Web框架Express启发 。我们结合了Express易用性Go原始性能 。如果您曾经在Node.js上实现过Web应用程序(使用 Express 或类似工具),那么许多方法和原理对您来说应该非常易懂

我们关注 整个互联网 用户在issues和 Discord channel的消息,为了创建一个迅速灵活以及友好Go web框架,满足任何任务,最后期限和开发者技能。就像ExpressJavaScript世界中一样。

👀 示例

下面列出了一些常见示例。如果您想查看更多代码示例,请访问我们的Recipes代码库或API 文档

📖 基础路由

  1. func main() {
  2. app := fiber.New()
  3. // GET /john
  4. app.Get("/:name", func(c *fiber.Ctx) error {
  5. msg := fmt.Sprintf("Hello, %s 👋!", c.Params("name"))
  6. return c.SendString(msg) // => Hello john 👋!
  7. })
  8. // GET /john/75
  9. app.Get("/:name/:age", func(c *fiber.Ctx) error {
  10. msg := fmt.Sprintf("👴 %s is %s years old", c.Params("name"), c.Params("age"))
  11. return c.SendString(msg) // => 👴 john is 75 years old
  12. })
  13. // GET /dictionary.txt
  14. app.Get("/:file.:ext", func(c *fiber.Ctx) error {
  15. msg := fmt.Sprintf("📃 %s.%s", c.Params("file"), c.Params("ext"))
  16. return c.SendString(msg) // => 📃 dictionary.txt
  17. })
  18. // GET /flights/LAX-SFO
  19. app.Get("/flights/:from-:to", func(c *fiber.Ctx) error {
  20. msg := fmt.Sprintf("💸 From: %s, To: %s", c.Params("from"), c.Params("to"))
  21. return c.SendString(msg) // => 💸 From: LAX, To: SFO
  22. })
  23. // GET /api/register
  24. app.Get("/api/*", func(c *fiber.Ctx) error {
  25. msg := fmt.Sprintf("✋ %s", c.Params("*"))
  26. return c.SendString(msg) // => ✋ register
  27. })
  28. log.Fatal(app.Listen(":3000"))
  29. }

📖 静态文件服务

  1. func main() {
  2. app := fiber.New()
  3. app.Static("/", "./public")
  4. // => http://localhost:3000/js/script.js
  5. // => http://localhost:3000/css/style.css
  6. app.Static("/prefix", "./public")
  7. // => http://localhost:3000/prefix/js/script.js
  8. // => http://localhost:3000/prefix/css/style.css
  9. app.Static("*", "./public/index.html")
  10. // => http://localhost:3000/any/path/shows/index/html
  11. log.Fatal(app.Listen(":3000"))
  12. }

📖 中间件Next

  1. func main() {
  2. app := fiber.New()
  3. // Match any route
  4. app.Use(func(c *fiber.Ctx) error {
  5. fmt.Println("🥇 First handler")
  6. return c.Next()
  7. })
  8. // Match all routes starting with /api
  9. app.Use("/api", func(c *fiber.Ctx) error {
  10. fmt.Println("🥈 Second handler")
  11. return c.Next()
  12. })
  13. // GET /api/register
  14. app.Get("/api/list", func(c *fiber.Ctx) error {
  15. fmt.Println("🥉 Last handler")
  16. return c.SendString("Hello, World 👋!")
  17. })
  18. log.Fatal(app.Listen(":3000"))
  19. }

📚 展示更多代码示例

模版引擎

📖 配置 📖 模版引擎 📖 渲染

如果未设置模版引擎,则Fiber默认使用html/template

如果您要执行部分模版或使用其他引擎,例如amberhandlebarsmustache或者pug等等…

请查看我们的Template包,该包支持多个模版引擎。

  1. package main
  2. import (
  3. "github.com/gofiber/fiber/v2"
  4. "github.com/gofiber/template/pug"
  5. )
  6. func main() {
  7. // You can setup Views engine before initiation app:
  8. app := fiber.New(fiber.Config{
  9. Views: pug.New("./views", ".pug"),
  10. })
  11. // And now, you can call template `./views/home.pug` like this:
  12. app.Get("/", func(c *fiber.Ctx) error {
  13. return c.Render("home", fiber.Map{
  14. "title": "Homepage",
  15. "year": 1999,
  16. })
  17. })
  18. log.Fatal(app.Listen(":3000"))
  19. }

组合路由链

📖 路由分组

  1. func middleware(c *fiber.Ctx) error {
  2. fmt.Println("Don't mind me!")
  3. return c.Next()
  4. }
  5. func handler(c *fiber.Ctx) error {
  6. return c.SendString(c.Path())
  7. }
  8. func main() {
  9. app := fiber.New()
  10. // Root API route
  11. api := app.Group("/api", middleware) // /api
  12. // API v1 routes
  13. v1 := api.Group("/v1", middleware) // /api/v1
  14. v1.Get("/list", handler) // /api/v1/list
  15. v1.Get("/user", handler) // /api/v1/user
  16. // API v2 routes
  17. v2 := api.Group("/v2", middleware) // /api/v2
  18. v2.Get("/list", handler) // /api/v2/list
  19. v2.Get("/user", handler) // /api/v2/user
  20. // ...
  21. }

日志中间件

📖 Logger

  1. package main
  2. import (
  3. "log"
  4. "github.com/gofiber/fiber/v2"
  5. "github.com/gofiber/fiber/v2/middleware/logger"
  6. )
  7. func main() {
  8. app := fiber.New()
  9. app.Use(logger.New())
  10. // ...
  11. log.Fatal(app.Listen(":3000"))
  12. }

跨域资源共享(CORS)中间件

📖 CORS

  1. import (
  2. "log"
  3. "github.com/gofiber/fiber/v2"
  4. "github.com/gofiber/fiber/v2/middleware/cors"
  5. )
  6. func main() {
  7. app := fiber.New()
  8. app.Use(cors.New())
  9. // ...
  10. log.Fatal(app.Listen(":3000"))
  11. }

通过在请求头中设置Origin传递任何域来检查 CORS:

  1. curl -H "Origin: http://example.com" --verbose http://localhost:3000

自定义 404 响应

📖 HTTP Methods

  1. func main() {
  2. app := fiber.New()
  3. app.Static("/", "./public")
  4. app.Get("/demo", func(c *fiber.Ctx) error {
  5. return c.SendString("This is a demo!")
  6. })
  7. app.Post("/register", func(c *fiber.Ctx) error {
  8. return c.SendString("Welcome!")
  9. })
  10. // Last middleware to match anything
  11. app.Use(func(c *fiber.Ctx) error {
  12. return c.SendStatus(404)
  13. // => 404 "Not Found"
  14. })
  15. log.Fatal(app.Listen(":3000"))
  16. }

JSON 响应

📖 JSON

  1. type User struct {
  2. Name string `json:"name"`
  3. Age int `json:"age"`
  4. }
  5. func main() {
  6. app := fiber.New()
  7. app.Get("/user", func(c *fiber.Ctx) error {
  8. return c.JSON(&User{"John", 20})
  9. // => {"name":"John", "age":20}
  10. })
  11. app.Get("/json", func(c *fiber.Ctx) error {
  12. return c.JSON(fiber.Map{
  13. "success": true,
  14. "message": "Hi John!",
  15. })
  16. // => {"success":true, "message":"Hi John!"}
  17. })
  18. log.Fatal(app.Listen(":3000"))
  19. }

升级到 WebSocket

📖 Websocket

  1. import (
  2. "github.com/gofiber/fiber/v2"
  3. "github.com/gofiber/fiber/v2/middleware/websocket"
  4. )
  5. func main() {
  6. app := fiber.New()
  7. app.Get("/ws", websocket.New(func(c *websocket.Conn) {
  8. for {
  9. mt, msg, err := c.ReadMessage()
  10. if err != nil {
  11. log.Println("read:", err)
  12. break
  13. }
  14. log.Printf("recv: %s", msg)
  15. err = c.WriteMessage(mt, msg)
  16. if err != nil {
  17. log.Println("write:", err)
  18. break
  19. }
  20. }
  21. }))
  22. log.Fatal(app.Listen(":3000"))
  23. // ws://localhost:3000/ws
  24. }

恢复(panic)中间件

📖 Recover

  1. import (
  2. "github.com/gofiber/fiber/v2"
  3. "github.com/gofiber/fiber/v2/middleware/recover"
  4. )
  5. func main() {
  6. app := fiber.New()
  7. app.Use(recover.New())
  8. app.Get("/", func(c *fiber.Ctx) error {
  9. panic("normally this would crash your app")
  10. })
  11. log.Fatal(app.Listen(":3000"))
  12. }

🧬 内置中间件

以下为fiber框架的内置中间件:

中间件 描述
basicauth basicauth中间件提供HTTP基本身份验证
compress Fiber的压缩中间件,它支持deflate,gzip 和 brotli(默认)
cache 拦截和响应缓存
cors 跨域处理
csrf CSRF攻击防护
filesystem Fiber的文件系统中间件
favicon favicon图标
limiter 请求频率限制中间件,用于控制API请求频率
logger HTTP请求与响应日志记录器
pprof pprof 中间件
proxy 请求代理
requestid 为每个请求添加一个requestid。
recover Recover中间件将程序从panic状态中恢复过来
timeout 添加请求的最大时间,如果超时,则转发给ErrorHandler。

🧬 外部中间件

fiber团队维护的外部中间件

中间件 描述
adaptor net/httpFiber请求的相互转换适配器
helmet 可设置各种HTTP Header来保护您的应用
jwt JSON Web Token (JWT) 中间件
keyauth 提供基于密钥的身份验证
rewrite URL路径重写
session Session中间件
template 模板引擎
websocket Fasthttp WebSocket 中间件

🌱 第三方中间件

这是由Fiber社区创建的中间件列表,如果您想看到自己的中间件,请创建PR