golang高性能Express风格Web框架插件Fiber的使用

Golang高性能Express风格Web框架Fiber使用指南

Fiber是一个受Express启发的Web框架,基于Go语言中最快的HTTP引擎Fasthttp构建,旨在为快速开发提供便利,同时保持零内存分配和高性能。

⚠️ 注意

Fiber v3目前处于测试阶段,正在积极开发中。虽然它提供了令人兴奋的新功能,但请注意它可能不适合生产环境使用。我们建议对于关键任务应用使用最新的稳定版本(v2.x)。如果选择使用v3,请准备好应对潜在的bug和破坏性变更。

⚙️ 安装

Fiber需要Go版本1.24或更高。如果需要安装或升级Go,请访问官方Go下载页面。安装Fiber:

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

⚡️ 快速入门

以下是创建一个简单Web服务器的基本示例:

package main

import (
    "log"
    "github.com/gofiber/fiber/v3"
)

func main() {
    // 初始化一个新的Fiber应用
    app := fiber.New()

    // 定义根路径'/'的GET方法路由
    app.Get("/", func(c fiber.Ctx) error {
        // 向客户端发送字符串响应
        return c.SendString("Hello, World 👋!")
    })

    // 在3000端口启动服务器
    log.Fatal(app.Listen(":3000"))
}

零内存分配

Fiber针对高性能进行了优化,意味着从fiber.Ctx返回的值默认情况下不是不可变的,并且在请求之间重用。作为经验法则,你必须只在处理程序中使用上下文值,并且不得保留任何引用。

📖 基本路由

package main

import (
    "fmt"
    "log"
    "github.com/gofiber/fiber/v3"
)

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"))
}

📖 静态文件服务

package main

import (
    "log"
    "github.com/gofiber/fiber/v3"
    "github.com/gofiber/fiber/v3/middleware/static"
)

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

    // 从"./public"目录服务静态文件
    app.Get("/*", static.New("./public"))
    // => http://localhost:3000/js/script.js
    // => http://localhost:3000/css/style.css

    app.Get("/prefix*", static.New("./public"))
    // => http://localhost:3000/prefix/js/script.js
    // => http://localhost:3000/prefix/css/style.css

    // 为任何不匹配的路由服务单个文件
    app.Get("*", static.New("./public/index.html"))
    // => http://localhost:3000/any/path/shows/index.html

    log.Fatal(app.Listen(":3000"))
}

📖 中间件和Next

package main

import (
    "fmt"
    "log"
    "github.com/gofiber/fiber/v3"
)

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()
    })

    // GET /api/list
    app.Get("/api/list", func(c fiber.Ctx) error {
        fmt.Println("🥉 Last handler")
        return c.SendString("Hello, World 👋!")
    })

    log.Fatal(app.Listen(":3000"))
}

📖 JSON响应

package main

import (
    "log"
    "github.com/gofiber/fiber/v3"
)

type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

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

    // 返回JSON对象的路由
    app.Get("/user", func(c fiber.Ctx) error {
        return c.JSON(&User{"John", 20})
        // => {"name":"John", "age":20}
    })

    // 返回JSON映射的路由
    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"))
}

🎯 特性

  • 强大的路由
  • 服务静态文件
  • 极致性能
  • 低内存占用
  • API端点
  • 中间件和Next支持
  • 快速的服务器端编程
  • 模板引擎
  • WebSocket支持
  • Socket.io支持
  • 服务器发送事件
  • 速率限制器
  • 更多功能

Fiber是一个受Express启发的Web框架,结合了Express的易用性和Go的原始性能。如果你曾经在Node.js中实现过Web应用程序(使用Express或类似框架),那么许多方法和原则对你来说会非常熟悉


更多关于golang高性能Express风格Web框架插件Fiber的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能Express风格Web框架插件Fiber的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Fiber - Golang高性能Express风格Web框架

Fiber是一个受Express启发的Golang Web框架,建立在Fasthttp(Go最快的HTTP引擎)之上,旨在简化快速开发,同时不牺牲性能。以下是Fiber的核心特性和使用示例。

主要特性

  1. 高性能:基于Fasthttp,比标准net/http快10倍
  2. Express风格API:路由、中间件等设计类似Express
  3. 低内存占用:优化内存使用
  4. 中间件支持:丰富的中间件生态系统
  5. 静态文件服务:内置静态文件处理

安装

go get github.com/gofiber/fiber/v2

基础示例

package main

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

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

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

    // 带参数的路由
    app.Get("/user/:name", func(c *fiber.Ctx) error {
        return c.SendString("Hello, " + c.Params("name"))
    })

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

路由处理

// GET请求
app.Get("/api/users", getUsers)

// POST请求
app.Post("/api/users", createUser)

// PUT请求
app.Put("/api/users/:id", updateUser)

// DELETE请求
app.Delete("/api/users/:id", deleteUser)

// 匹配所有HTTP方法
app.All("/api/all", handleAllMethods)

// 匹配多个路径
app.Use("/api", middleware) // 匹配/api开头的所有路径

中间件使用

// 日志中间件
app.Use(logger.New())

// 恢复中间件(panic恢复)
app.Use(recover.New())

// CORS中间件
app.Use(cors.New())

// 自定义中间件
func AuthMiddleware(c *fiber.Ctx) error {
    token := c.Get("Authorization")
    if token != "valid-token" {
        return c.Status(fiber.StatusUnauthorized).SendString("Unauthorized")
    }
    return c.Next()
}

// 应用中间件到特定路由
app.Get("/protected", AuthMiddleware, protectedHandler)

请求处理

// 获取查询参数
app.Get("/search", func(c *fiber.Ctx) error {
    query := c.Query("q")
    return c.SendString("Search query: " + query)
})

// 获取POST表单数据
app.Post("/form", func(c *fiber.Ctx) error {
    name := c.FormValue("name")
    return c.SendString("Hello, " + name)
})

// JSON请求体解析
app.Post("/json", func(c *fiber.Ctx) error {
    var data struct {
        Name string `json:"name"`
    }
    if err := c.BodyParser(&data); err != nil {
        return err
    }
    return c.JSON(fiber.Map{
        "message": "Hello, " + data.Name,
    })
})

响应处理

// 发送文本响应
app.Get("/text", func(c *fiber.Ctx) error {
    return c.SendString("Plain text response")
})

// 发送JSON响应
app.Get("/json", func(c *fiber.Ctx) error {
    return c.JSON(fiber.Map{
        "name": "John",
        "age":  30,
    })
})

// 发送状态码
app.Get("/notfound", func(c *fiber.Ctx) error {
    return c.SendStatus(fiber.StatusNotFound)
})

// 重定向
app.Get("/redirect", func(c *fiber.Ctx) error {
    return c.Redirect("/new-location")
})

静态文件服务

// 提供单个文件
app.Get("/file", func(c *fiber.Ctx) error {
    return c.SendFile("./public/file.txt")
})

// 静态文件目录
app.Static("/static", "./public")

// 带前缀的静态文件服务
app.Static("/prefix", "./public", fiber.Static{
    Prefix: "/prefix",
})

错误处理

// 自定义错误处理
app := fiber.New(fiber.Config{
    ErrorHandler: func(ctx *fiber.Ctx, err error) error {
        code := fiber.StatusInternalServerError
        if e, ok := err.(*fiber.Error); ok {
            code = e.Code
        }
        return ctx.Status(code).JSON(fiber.Map{
            "error": err.Error(),
        })
    },
})

// 404处理
app.Use(func(c *fiber.Ctx) error {
    return c.Status(fiber.StatusNotFound).SendFile("./public/404.html")
})

性能优化技巧

  1. 连接复用:Fiber默认启用Keep-Alive
  2. 零内存分配:Fasthttp设计目标之一
  3. 并发处理:Go的goroutine模型
  4. 避免阻塞操作:将长时间任务放入goroutine
  5. 使用适当中间件:只加载必要的中间件

完整示例

package main

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/fiber/v2/middleware/logger"
    "github.com/gofiber/fiber/v2/middleware/recover"
)

func main() {
    app := fiber.New(fiber.Config{
        Prefork: true, // 启用多进程模式
    })

    // 中间件
    app.Use(logger.New())
    app.Use(recover.New())

    // 路由
    app.Get("/", func(c *fiber.Ctx) error {
        return c.JSON(fiber.Map{
            "message": "Welcome to Fiber API",
        })
    })

    // API组
    api := app.Group("/api")
    api.Get("/users", getUsers)
    api.Post("/users", createUser)

    // 静态文件
    app.Static("/public", "./public")

    // 404处理
    app.Use(func(c *fiber.Ctx) error {
        return c.Status(404).SendString("Sorry, page not found!")
    })

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

func getUsers(c *fiber.Ctx) error {
    // 模拟数据
    users := []fiber.Map{
        {"id": 1, "name": "John"},
        {"id": 2, "name": "Jane"},
    }
    return c.JSON(users)
}

func createUser(c *fiber.Ctx) error {
    type User struct {
        Name string `json:"name"`
    }
    
    var user User
    if err := c.BodyParser(&user); err != nil {
        return c.Status(400).JSON(fiber.Map{
            "error": "Invalid request",
        })
    }
    
    // 模拟创建用户
    return c.Status(201).JSON(fiber.Map{
        "id":   3,
        "name": user.Name,
    })
}

Fiber提供了Express的易用性,同时保持了Go的高性能特性,是构建现代Web应用的优秀选择。

回到顶部