golang高性能独立HTTP兼容URL路由插件库vestigo的使用

Vestigo - 高性能Golang独立URL路由插件库

Vestigo是一个独立的Golang URL路由器,具有高性能特性,它通过将URL参数嵌入到请求的Form中来传递给处理函数。

特性

  1. 基于基数树(Radix Tree)实现
  2. 将URL参数附加到请求中(PAT风格)而非上下文
  3. 完全HTTP兼容(支持TRACE、OPTIONS、HEAD等方法)
  4. 支持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"))
})

许可证

贡献

如果你想贡献代码,请fork此仓库,提交问题或拉取请求。请在贡献前使用gofmt和golint格式化代码


更多关于golang高性能独立HTTP兼容URL路由插件库vestigo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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"},
})

性能优化技巧

  1. 预编译路由:Vestigo在添加路由时会预编译正则表达式,因此路由注册应在启动时完成。

  2. 减少动态路由:尽量使用静态路由,动态路由(:param)和通配符(*param)会带来额外开销。

  3. 合理使用中间件:避免在中间件中进行不必要的计算。

与标准库对比示例

// 标准库实现
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仓库

回到顶部