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
更多关于golang高性能Express风格Web框架插件Fiber的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Fiber - Golang高性能Express风格Web框架
Fiber是一个受Express启发的Golang Web框架,建立在Fasthttp(Go最快的HTTP引擎)之上,旨在简化快速开发,同时不牺牲性能。以下是Fiber的核心特性和使用示例。
主要特性
- 高性能:基于Fasthttp,比标准net/http快10倍
- Express风格API:路由、中间件等设计类似Express
- 低内存占用:优化内存使用
- 中间件支持:丰富的中间件生态系统
- 静态文件服务:内置静态文件处理
安装
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")
})
性能优化技巧
- 连接复用:Fiber默认启用Keep-Alive
- 零内存分配:Fasthttp设计目标之一
- 并发处理:Go的goroutine模型
- 避免阻塞操作:将长时间任务放入goroutine
- 使用适当中间件:只加载必要的中间件
完整示例
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应用的优秀选择。