golang高性能HTTP请求路由和中间件支持插件库GoRouter的使用
🍃 GoRouter - 高性能HTTP请求路由和中间件支持插件库
GoRouter是一个Go语言服务器/API微框架,提供HTTP请求路由器、多路复用器和mux功能。
主要特性
- 路由系统
- 中间件系统
- 认证支持
- 快速HTTP处理
- 文件服务
- 多域名支持
- HTTP2支持
- 低内存占用
基准测试
➜ gorouter git:(master) ✗ go test -bench=. -cpu=4 -benchmem
test
goos: darwin
goarch: amd64
pkg: github.com/vardius/gorouter/v4
BenchmarkNetHTTP-4 65005786 17.9 ns/op 0 B/op 0 allocs/op
BenchmarkFastHTTP-4 69810878 16.5 ns/op 0 B/op 0 allocs/op
PASS
ok github.com/vardius/gorouter/v4 3.808s
基本使用示例
net/http 示例
package main
import (
"fmt"
"net/http"
"github.com/vardius/gorouter/v4"
)
func main() {
// 创建路由器
router := gorouter.New()
// 添加路由
router.GET("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, World!")
})
// 添加带参数的路由
router.GET("/users/{id:[0-9]+}", func(w http.ResponseWriter, r *http.Request) {
params := gorouter.FromContext(r.Context())
fmt.Fprintf(w, "User ID: %s", params.Value("id"))
})
// 添加中间件
logger := func(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)
})
}
// 使用中间件
router.Use(logger)
// 启动服务器
http.ListenAndServe(":8080", router)
}
fasthttp 示例
package main
import (
"fmt"
"github.com/valyala/fasthttp"
"github.com/vardius/gorouter/v4"
"github.com/vardius/gorouter/v4/context"
)
func main() {
// 创建路由器
router := gorouter.NewFastHTTPRouter()
// 添加路由
router.GET("/", func(c *fasthttp.RequestCtx) {
fmt.Fprint(c, "Hello, World!")
})
// 添加带参数的路由
router.GET("/users/{id:[0-9]+}", func(c *fasthttp.RequestCtx) {
params := context.Parameters(c)
fmt.Fprintf(c, "User ID: %s", params.Value("id"))
})
// 添加中间件
logger := func(next fasthttp.RequestHandler) fasthttp.RequestHandler {
return func(c *fasthttp.RequestCtx) {
fmt.Printf("Request: %s %s\n", c.Method(), c.Path())
next(c)
}
}
// 使用中间件
router.Use(logger)
// 启动服务器
fasthttp.ListenAndServe(":8080", router.HandleFastHTTP)
}
文件服务示例
package main
import (
"net/http"
"github.com/vardius/gorouter/v4"
)
func main() {
router := gorouter.New()
// 提供静态文件服务
router.GET("/static/{filepath:*}", func(w http.ResponseWriter, r *http.Request) {
params := gorouter.FromContext(r.Context())
http.ServeFile(w, r, "static/"+params.Value("filepath"))
})
http.ListenAndServe(":8080", router)
}
多域名支持
package main
import (
"net/http"
"github.com/vardius/gorouter/v4"
)
func main() {
router := gorouter.New()
// 主域名路由
router.GET("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Main Domain")
})
// 子域名路由
subdomain := router.Subdomain("api")
subdomain.GET("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "API Subdomain")
})
http.ListenAndServe(":8080", router)
}
认证中间件示例
package main
import (
"net/http"
"github.com/vardius/gorouter/v4"
)
func authMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
if token != "valid-token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}
func main() {
router := gorouter.New()
// 受保护的路由
protected := router.Group("/api")
protected.Use(authMiddleware)
protected.GET("/data", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Protected Data")
})
http.ListenAndServe(":8080", router)
}
路由组示例
package main
import (
"fmt"
"net/http"
"github.com/vardius/gorouter/v4"
)
func main() {
router := gorouter.New()
// 创建API路由组
api := router.Group("/api")
api.GET("/users", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "List Users")
})
api.POST("/users", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Create User")
})
// 创建管理员路由组
admin := router.Group("/admin")
admin.Use(authMiddleware)
admin.GET("/dashboard", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Admin Dashboard")
})
http.ListenAndServe(":8080", router)
}
GoRouter是一个功能强大且高性能的HTTP路由库,支持多种功能和灵活的中间件系统,非常适合构建Web应用程序和API服务。
更多关于golang高性能HTTP请求路由和中间件支持插件库GoRouter的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang高性能HTTP请求路由和中间件支持插件库GoRouter的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
GoRouter: 高性能HTTP路由和中间件库
GoRouter是一个轻量级但功能强大的Go语言HTTP路由库,提供高性能的路由匹配和灵活的中间件支持。下面我将详细介绍其核心功能和使用方法。
1. 基本路由功能
package main
import (
"fmt"
"net/http"
"github.com/gorouter/gorouter"
)
func main() {
router := gorouter.New()
// 基本路由
router.GET("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, GoRouter!")
})
// 带参数的路由
router.GET("/user/:id", func(w http.ResponseWriter, r *http.Request) {
id := gorouter.GetParam(r, "id")
fmt.Fprintf(w, "User ID: %s", id)
})
// 启动服务器
http.ListenAndServe(":8080", router)
}
2. 路由分组
func main() {
router := gorouter.New()
// API v1 分组
apiV1 := router.Group("/api/v1")
{
apiV1.GET("/users", listUsers)
apiV1.POST("/users", createUser)
apiV1.GET("/users/:id", getUser)
}
// 带中间件的分组
authGroup := router.Group("/admin")
authGroup.Use(authMiddleware)
{
authGroup.GET("/dashboard", adminDashboard)
authGroup.POST("/settings", updateSettings)
}
http.ListenAndServe(":8080", router)
}
func authMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Authorization") != "valid-token" {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}
3. 中间件支持
GoRouter支持全局中间件和路由级中间件:
func main() {
router := gorouter.New()
// 全局中间件
router.Use(loggingMiddleware)
router.Use(recoveryMiddleware)
// 路由级中间件
router.GET("/secure", authMiddleware, func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Secure content")
})
http.ListenAndServe(":8080", router)
}
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r)
duration := time.Since(start)
log.Printf("%s %s %v", r.Method, r.URL.Path, duration)
})
}
func recoveryMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if err := recover(); err != nil {
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
log.Printf("Panic: %v", err)
}
}()
next.ServeHTTP(w, r)
})
}
4. 高级路由特性
func main() {
router := gorouter.New()
// 正则表达式约束
router.GET("/user/:id(^\\d+$)", func(w http.ResponseWriter, r *http.Request) {
id := gorouter.GetParam(r, "id")
fmt.Fprintf(w, "User ID (digits only): %s", id)
})
// 通配符路由
router.GET("/static/*filepath", func(w http.ResponseWriter, r *http.Request) {
filepath := gorouter.GetParam(r, "filepath")
fmt.Fprintf(w, "Requested file: %s", filepath)
})
// 自定义HTTP方法
router.Handle("PURGE", "/cache", purgeCacheHandler)
http.ListenAndServe(":8080", router)
}
5. 性能优化技巧
- 路由注册顺序:将最频繁访问的路由放在前面
- 减少动态路由:尽可能使用静态路径
- 中间件优化:避免在中间件中进行不必要的计算
- 使用路由缓存:对于生产环境可以启用路由缓存
func main() {
// 创建带缓存的路由器
router := gorouter.New(
gorouter.WithRouteCache(true),
gorouter.WithCacheSize(1000),
)
// ... 路由配置 ...
http.ListenAndServe(":8080", router)
}
6. 错误处理
func main() {
router := gorouter.New()
// 自定义404处理
router.NotFound(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
fmt.Fprint(w, "Custom 404 - Page not found")
})
// 自定义方法不允许处理
router.MethodNotAllowed(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusMethodNotAllowed)
fmt.Fprint(w, "Method not allowed")
})
http.ListenAndServe(":8080", router)
}
7. 插件扩展
GoRouter支持通过插件扩展功能,例如添加请求ID、指标收集等:
func main() {
router := gorouter.New()
// 使用请求ID插件
router.Use(gorouter.RequestID())
// 使用指标收集插件
router.Use(gorouter.Metrics())
// 使用CORS插件
router.Use(gorouter.CORS(gorouter.CORSOptions{
AllowedOrigins: []string{"*"},
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE"},
}))
http.ListenAndServe(":8080", router)
}
GoRouter通过其简洁的API设计、高性能的路由匹配和灵活的中间件系统,为构建Go Web应用程序提供了强大的基础。它特别适合需要高性能路由和灵活中间件支持的应用程序开发。