golang轻量级高性能HTTP路由插件库GoLobby/Router的使用
Golang轻量级高性能HTTP路由插件库GoLobby/Router的使用
GoLobby Router简介
GoLobby Router是一个轻量级但功能强大的Go语言HTTP路由器。它基于Go HTTP包构建,并使用基数树提供以下特性:
- 基于HTTP方法和URI的路由
- 路由参数和参数模式
- 路由通配符
- 中间件
- HTTP响应(如JSON、XML、文本、空、文件和重定向)
- 静态文件服务
- 无额外开销!
- 零依赖!
安装
要安装此包,请在项目目录中运行以下命令:
go get github.com/golobby/router
快速入门
以下示例展示了如何使用router包:
package main
import (
"github.com/golobby/router"
"log"
"net/http"
)
func main() {
r := router.New()
r.GET("/", func(c router.Context) error {
// c.Request()是原始的http.Request
// c.Response()是原始的http.ResponseWriter
return c.Text(http.StatusOK, "Hello from GoLobby Router!")
})
r.PUT("/products/:id", func(c router.Context) error {
return c.Text(http.StatusOK, "Update product with ID: "+c.Parameter("id"))
})
log.Fatalln(r.Start(":8000"))
}
HTTP方法
您可以使用Map()
方法声明路由。它接受HTTP方法和路径(URI)。对于最常用的HTTP方法,还提供了一些便捷方法,包括GET
、POST
、PUT
、PATCH
、DELETE
、HEAD
和OPTIONS
。Any()
方法定义处理任何HTTP方法的路由。
package main
import (
"github.com/golobby/router"
"log"
"net/http"
)
func Handler(c router.Context) error {
return c.Text(http.StatusOK, "Hello from GoLobby Router!")
}
func main() {
r := router.New()
r.GET("/", Handler)
r.POST("/", Handler)
r.PUT("/", Handler)
r.PATCH("/", Handler)
r.DELETE("/", Handler)
r.HEAD("/", Handler)
r.OPTIONS("/", Handler)
r.Any("/page", Handler)
r.Map("GET", "/", Handler)
r.Map("CUSTOM", "/", Handler)
log.Fatalln(r.Start(":8000"))
}
路由参数
要指定路由参数,请在参数前加冒号,如:id
。默认情况下,参数可以是任何内容,但您可以使用Define()
方法确定正则表达式模式。当然,正则表达式模式会减慢您的应用程序,如果可能的话建议不要使用它们。
package main
import (
"github.com/golobby/router"
"log"
"net/http"
)
func main() {
r := router.New()
// "id"参数必须是数字
r.Define("id", "[0-9]+")
// 带一个参数的路由
r.GET("/posts/:id", func(c router.Context) error {
return c.Text(http.StatusOK, c.Parameter("id"))
})
// 带多个参数的路由
r.GET("/posts/:id/comments/:cid", func(c router.Context) error {
return c.JSON(http.StatusOK, c.Parameters())
})
log.Fatalln(r.Start(":8000"))
}
路由组
您可以将具有相似属性的路由放在组中。目前支持前缀和中间件属性。
按前缀分组
package main
import (
"github.com/golobby/router"
"log"
"net/http"
)
func main() {
r := router.New()
r.WithPrefix("/blog", func() {
r.GET("/posts", PostsHandler) // "/blog/posts"
r.GET("/posts/:id", PostHandler) // "/blog/posts/:id"
r.WithPrefix("/pages", func() {
r.GET("/about", AboutHandler) // "/blog/pages/about"
r.GET("/contact", ContactHandler) // "/blog/pages/contact"
})
})
log.Fatalln(r.Start(":8000"))
}
按中间件分组
package main
import (
"github.com/golobby/router"
"log"
"net/http"
)
func AdminMiddleware(next router.Handler) router.Handler {
return func(c router.Context) error {
// 检查用户角色...
return next(c)
}
}
func main() {
r := router.New()
r.WithMiddleware(AdminMiddleware, func() {
r.GET("/admin/users", UsersHandler)
r.GET("/admin/products", ProductsHandler)
})
log.Fatalln(r.Start(":8000"))
}
响应
路由器内置了Empty
、Redirect
、Text
、HTML
、JSON
、PrettyJSON
、XML
、PrettyXML
和Bytes
响应。
package main
import (
"github.com/golobby/router"
"github.com/golobby/router/pkg/response"
"log"
"net/http"
)
func main() {
r := router.New()
r.GET("/empty", func(c router.Context) error {
return c.Empty(204)
})
r.GET("/redirect", func(c router.Context) error {
return c.Redirect(301, "https://github.com/golobby/router")
})
r.GET("/text", func(c router.Context) error {
return c.Text(200, "A text response")
})
r.GET("/html", func(c router.Context) error {
return c.HTML(200, "<p>A HTML response</p>")
})
r.GET("/json", func(c router.Context) error {
return c.JSON(200, User{"id": 13})
})
r.GET("/json-pretty", func(c router.Context) error {
return c.PrettyJSON(200, response.M{"message": "A pretty JSON response!"})
})
r.GET("/xml", func(c router.Context) error {
return c.XML(200, User{"id": 13})
})
r.GET("/xml-pretty", func(c router.Context) error {
return c.PrettyXML(200, User{"id": 13})
})
r.GET("/bytes", func(c router.Context) error {
return c.Bytes(200, []byte("Some bytes!"))
})
log.Fatalln(r.Start(":8000"))
}
错误处理
您的处理程序在处理HTTP请求时可能会返回错误。这个错误可能是由您的应用程序逻辑或HTTP响应失败产生的。默认情况下,路由器使用Golang的内置记录器将其记录到标准输出,并返回以下HTTP 500响应。
{"message": "Internal error."}
最佳实践是添加一个全局中间件来捕获所有这些错误,记录并以您需要的方式处理它们。
package main
import (
"github.com/golobby/router"
"log"
"net/http"
)
func main() {
r := router.New()
// 错误处理中间件
r.AddMiddleware(func (next router.Handler) router.Handler {
return func(c router.Context) error {
if err := next(c); err != nil {
myLogger.log(err)
return c.HTML(500, "<p>Something went wrong</p>")
}
// 没有错误会传递给路由器基础处理程序
return nil
}
})
r.GET("/", Handler)
log.Fatalln(r.Start(":8000"))
}
更多关于golang轻量级高性能HTTP路由插件库GoLobby/Router的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang轻量级高性能HTTP路由插件库GoLobby/Router的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
GoLobby/Router 轻量级高性能HTTP路由库使用指南
GoLobby/Router 是一个轻量级、高性能的Go语言HTTP路由库,它具有简单易用、低内存消耗和高性能的特点。下面我将详细介绍它的使用方法。
安装
首先安装该库:
go get github.com/golobby/router
基本使用
1. 创建路由实例
package main
import (
"github.com/golobby/router"
"net/http"
)
func main() {
r := router.New()
// 配置路由...
http.ListenAndServe(":8080", r)
}
2. 注册路由处理函数
// 简单GET路由
r.Get("/", func(c router.Context) error {
return c.Text("Hello, World!")
})
// 带参数的路由
r.Get("/user/:id", func(c router.Context) error {
id := c.Param("id")
return c.Text("User ID: " + id)
})
// POST路由
r.Post("/users", func(c router.Context) error {
// 获取POST数据
name := c.FormValue("name")
return c.Text("Created user: " + name)
})
高级功能
1. 路由分组
api := r.Group("/api")
{
api.Get("/users", listUsers)
api.Post("/users", createUser)
// 嵌套分组
admin := api.Group("/admin")
{
admin.Get("/dashboard", adminDashboard)
}
}
2. 中间件
// 定义中间件
func logger(next router.HandlerFunc) router.HandlerFunc {
return func(c router.Context) error {
fmt.Printf("Request: %s %s\n", c.Request().Method, c.Request().URL.Path)
return next(c)
}
}
// 全局中间件
r.Use(logger)
// 路由组中间件
authGroup := r.Group("/auth")
authGroup.Use(authMiddleware)
{
authGroup.Get("/profile", userProfile)
}
3. 静态文件服务
// 单个文件
r.File("/favicon.ico", "./public/favicon.ico")
// 静态文件目录
r.Static("/static", "./public/static")
4. 自定义错误处理
r.NotFoundHandler = func(c router.Context) error {
return c.JSON(404, map[string]string{"error": "Not found"})
}
r.ErrorHandler = func(c router.Context, err error) {
c.JSON(500, map[string]string{"error": err.Error()})
}
性能优化技巧
-
避免在热路径上分配内存:在路由处理函数中避免频繁创建临时对象
-
使用sync.Pool:对于频繁使用的对象,可以使用sync.Pool来重用
-
预编译正则表达式:如果使用正则路由,预编译正则表达式
var userIDRegex = regexp.MustCompile(`^[a-zA-Z0-9]+$`)
r.Get("/user/:id", func(c router.Context) error {
id := c.Param("id")
if !userIDRegex.MatchString(id) {
return c.Text("Invalid ID", 400)
}
// ...
})
完整示例
package main
import (
"github.com/golobby/router"
"log"
"net/http"
)
func main() {
r := router.New()
// 全局中间件
r.Use(loggerMiddleware)
// 首页
r.Get("/", homeHandler)
// API路由组
api := r.Group("/api")
api.Use(authMiddleware)
{
api.Get("/users", listUsersHandler)
api.Post("/users", createUserHandler)
api.Get("/users/:id", getUserHandler)
}
// 静态文件
r.Static("/assets", "./public/assets")
// 自定义404
r.NotFoundHandler = notFoundHandler
log.Println("Server started on :8080")
log.Fatal(http.ListenAndServe(":8080", r))
}
func loggerMiddleware(next router.HandlerFunc) router.HandlerFunc {
return func(c router.Context) error {
log.Printf("%s %s", c.Request().Method, c.Request().URL.Path)
return next(c)
}
}
func homeHandler(c router.Context) error {
return c.Text("Welcome to the homepage!")
}
// ...其他处理函数实现
性能对比
GoLobby/Router 在设计上注重性能,与其他流行路由库相比:
- 比标准库
http.ServeMux
更灵活但性能接近 - 比
gorilla/mux
更轻量级,性能更好 - 比
httprouter
功能稍少但API更简单
总结
GoLobby/Router 是一个非常适合中小型项目的轻量级路由库,它提供了:
- 简洁的API设计
- 路由参数支持
- 中间件支持
- 路由分组
- 静态文件服务
- 良好的性能表现
对于不需要复杂功能但追求性能的项目,这是一个很好的选择。