golang高性能独立HTTP兼容URL路由插件库vestigo的使用
Vestigo - 高性能Golang独立URL路由插件库
Vestigo是一个独立的Golang URL路由器,具有高性能特性,它通过将URL参数嵌入到请求的Form中来传递给处理函数。
特性
- 基于基数树(Radix Tree)实现
- 将URL参数附加到请求中(PAT风格)而非上下文
- 完全HTTP兼容(支持TRACE、OPTIONS、HEAD等方法)
- 支持CORS(可设置每个资源的访问控制)
性能
基准测试显示Vestigo的性能表现如下:
BenchmarkVestigo_GithubAll 20000 75763 ns/op 9280 B/op 339 allocs/op
虽然比最快的URL路由器(如Echo/Gin)慢约2倍,但考虑到Vestigo支持标准http.HandlerFunc处理程序而不强制用户使用特定上下文或非标准处理函数,这个性能是可以接受的。
完整示例
package main
import (
"log"
"net/http"
"time"
"github.com/husobee/vestigo"
)
func main() {
router := vestigo.NewRouter()
// 可以通过设置这个值来启用TRACE方法
vestigo.AllowTrace = true
// 设置全局CORS策略
// 这些策略可以在资源级别被覆盖(如下所示)
router.SetGlobalCors(&vestigo.CorsAccessControl{
AllowOrigin: []string{"*", "test.com"},
AllowCredentials: true,
ExposeHeaders: []string{"X-Header", "X-Y-Header"},
MaxAge: 3600 * time.Second,
AllowHeaders: []string{"X-Header", "X-Y-Header"},
})
// 在同一个资源上设置两种方法
router.Get("/welcome", GetWelcomeHandler)
router.Post("/welcome", PostWelcomeHandler)
// URL参数"name"
router.Post("/welcome/:name", PostWelcomeHandler)
// 通用方法,便于从http.ServeMux迁移
router.HandleFunc("/general", GeneralHandler)
// 为资源设置局部CORS能力(覆盖两种方法)
// 默认会合并"GlobalCors"设置与资源CORS设置
// 如果不指定AllowMethods,路由器将接受任何有有效处理程序关联的请求方法
router.SetCors("/welcome", &vestigo.CorsAccessControl{
AllowMethods: []string{"GET"}, // 只允许GET方法的CORS
AllowHeaders: []string{"X-Header", "X-Z-Header"}, // 允许这个资源的特定头
})
log.Fatal(http.ListenAndServe(":1234", router))
}
func PostWelcomeHandler(w http.ResponseWriter, r *http.Request) {
name := vestigo.Param(r, "name") // URL参数存在于请求中
w.WriteHeader(200)
w.Write([]byte("welcome " + name + "!"))
}
func GetWelcomeHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
w.Write([]byte("welcome!"))
}
func GeneralHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
w.Write([]byte("Gotta catch em all!"))
}
中间件支持
路由器辅助方法(Get、Post等)支持可选中间件(Vestigo只提供中间件类型,具体实现由用户创建):
router.Get("/welcome", GetWelcomeHandler, someMiddleware)
someMiddleware := func(f http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// 处理前
f(w, r)
// 处理后
}
}
要中断中间件链(例如在认证中间件中不想继续执行),只需不调用传递的处理函数:
auth := func(f http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if authSuccessful() {
f(w, r)
}
}
}
性能分析
使用net/http/pprof与Vestigo结合进行性能分析的示例:
// 加载路由
func Load(router *vestigo.Router) {
router.Get("/debug/pprof/", Index)
router.Get("/debug/pprof/:pprof", Profile)
}
// 显示性能分析索引
func Index(w http.ResponseWriter, r *http.Request) {
pprof.Index(w, r)
}
// 显示单个性能分析
func Profile(w http.ResponseWriter, r *http.Request) {
switch vestigo.Param(r, "pprof") {
case "cmdline":
pprof.Cmdline(w, r)
case "profile":
pprof.Profile(w, r)
case "symbol":
pprof.Symbol(w, r)
case "trace":
pprof.Trace(w, r)
default:
Index(w, r)
}
}
关于通配符的说明: 如果想获取通配符实际匹配的路径,可以使用vestigo.Param(*http.Request, "_name")
:
router.Get("/*", func(w http.ResponseWriter, r *http.Request) {
fmt.Println(vestigo.Param(r, "_name"))
})
许可证
- 部分URL路由器代码来自Echo,遵循其许可证
- 部分测试代码来自julienschmidt的go-http-routing-benchmark,遵循这个许可证
- 其余实现遵循MIT许可证
贡献
如果你想贡献代码,请fork此仓库,提交问题或拉取请求。请在贡献前使用gofmt和golint格式化代码。
更多关于golang高性能独立HTTP兼容URL路由插件库vestigo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang高性能独立HTTP兼容URL路由插件库vestigo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Vestigo - 高性能Golang URL路由库
Vestigo是一个轻量级、高性能的Golang HTTP路由器,兼容标准库net/http
,专注于快速路由匹配和低内存占用。下面我将详细介绍Vestigo的使用方法。
安装Vestigo
go get github.com/husobee/vestigo
基本使用
1. 创建路由器和基本路由
package main
import (
"fmt"
"net/http"
"github.com/husobee/vestigo"
)
func main() {
// 创建路由器
router := vestigo.NewRouter()
// 添加路由
router.Get("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, Vestigo!")
})
router.Get("/users", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "User list")
})
// 启动服务器
http.ListenAndServe(":8080", router)
}
2. 路径参数
router.Get("/users/:id", func(w http.ResponseWriter, r *http.Request) {
id := vestigo.Param(r, "id") // 获取路径参数
fmt.Fprintf(w, "User ID: %s", id)
})
3. 支持所有HTTP方法
router.Post("/users", createUser)
router.Put("/users/:id", updateUser)
router.Delete("/users/:id", deleteUser)
router.Patch("/users/:id", patchUser)
4. 通配符路由
router.Get("/static/*", func(w http.ResponseWriter, r *http.Request) {
file := vestigo.Param(r, "*") // 获取通配符部分
fmt.Fprintf(w, "Requested file: %s", file)
})
高级特性
1. 路由分组
apiRouter := vestigo.NewRouter()
apiRouter.Get("/products", getProducts)
apiRouter.Post("/products", createProduct)
mainRouter := vestigo.NewRouter()
mainRouter.Handle("/api/*", apiRouter) // 将/api前缀路由委托给apiRouter
2. 中间件支持
// 定义中间件
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("Request: %s %s\n", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
func main() {
router := vestigo.NewRouter()
// 应用全局中间件
router.SetGlobalCorsHandler(loggingMiddleware)
// 或为特定路由添加中间件
router.Get("/secure", secureHandler).AddMiddleware(authMiddleware)
}
3. CORS支持
router := vestigo.NewRouter()
// 全局CORS设置
router.SetGlobalCors(&vestigo.CorsAccessControl{
AllowOrigin: []string{"*"},
AllowMethods: []string{"GET", "POST", "PUT", "DELETE"},
AllowHeaders: []string{"Content-Type"},
ExposeHeaders: []string{"Content-Length"},
AllowCredentials: false,
MaxAge: 3600,
})
// 或为特定路由设置CORS
router.Get("/api/data", dataHandler).SetCors(&vestigo.CorsAccessControl{
AllowOrigin: []string{"https://example.com"},
})
性能优化技巧
-
预编译路由:Vestigo在添加路由时会预编译正则表达式,因此路由注册应在启动时完成。
-
减少动态路由:尽量使用静态路由,动态路由(:param)和通配符(*param)会带来额外开销。
-
合理使用中间件:避免在中间件中进行不必要的计算。
与标准库对比示例
// 标准库实现
http.HandleFunc("/users/", func(w http.ResponseWriter, r *http.Request) {
// 需要手动解析路径参数
id := strings.TrimPrefix(r.URL.Path, "/users/")
fmt.Fprintf(w, "User ID: %s", id)
})
// Vestigo实现
router.Get("/users/:id", func(w http.ResponseWriter, r *http.Request) {
id := vestigo.Param(r, "id") // 自动解析
fmt.Fprintf(w, "User ID: %s", id)
})
总结
Vestigo是一个性能优异且易于使用的Golang路由库,主要特点包括:
- 兼容标准库
net/http
- 支持RESTful路由和路径参数
- 内置CORS支持
- 中间件支持
- 路由分组
- 高性能路由匹配
对于需要高性能路由的中小型项目,Vestigo是一个很好的选择。它比标准库更灵活,比一些全功能框架更轻量。
完整文档请参考Vestigo GitHub仓库。