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. 性能优化技巧

  1. 路由注册顺序:将最频繁访问的路由放在前面
  2. 减少动态路由:尽可能使用静态路径
  3. 中间件优化:避免在中间件中进行不必要的计算
  4. 使用路由缓存:对于生产环境可以启用路由缓存
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应用程序提供了强大的基础。它特别适合需要高性能路由和灵活中间件支持的应用程序开发。

回到顶部