Go Web 编程实战Go Web 编程实战
首页
课程导读
首页
课程导读
  • 课程导读
  • 课程目录

    • Go基础语法精要
    • Web基础与HTTP处理
    • Gin框架入门
    • 路由与中间件
    • 数据库操作
    • 模板渲染
    • 错误处理与日志
    • 测试与部署
    • 高级中间件模式
    • 微服务架构
    • 性能优化
    • 安全最佳实践
    • 项目结构与代码组织

路由与中间件

1. 路由分组

路由分组可以帮助组织路由和共享中间件:

func main() {
    r := gin.Default()
    
    // 公共路由组
    public := r.Group("/api")
    {
        public.GET("/login", login)
        public.GET("/register", register)
    }
    
    // 私有路由组(需要认证)
    private := r.Group("/api")
    private.Use(AuthMiddleware()) // 应用认证中间件
    {
        private.GET("/profile", profile)
        private.POST("/settings", updateSettings)
    }
    
    r.Run(":8080")
}

2. 中间件基础

中间件是处理请求和响应的函数链:

func LoggerMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        // 请求前处理
        start := time.Now()
        path := c.Request.URL.Path
        
        // 调用下一个处理程序
        c.Next()
        
        // 请求后处理
        latency := time.Since(start)
        fmt.Printf("%s %s %s\n", 
            c.Request.Method, 
            path, 
            latency)
    }
}

3. 常用内置中间件

Gin提供了一些有用的内置中间件:

func main() {
    // 使用Logger中间件记录请求日志
    r := gin.Default()
    
    // 使用Recovery中间件从panic恢复
    r.Use(gin.Recovery())
    
    // 静态文件服务中间件
    r.Use(gin.Static("/public", "./assets"))
    
    r.Run(":8080")
}

4. 自定义中间件示例

认证中间件

func AuthMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        token := c.GetHeader("Authorization")
        if token != "valid_token" {
            c.AbortWithStatusJSON(401, gin.H{
                "error": "Unauthorized",
            })
            return
        }
        c.Next()
    }
}

限流中间件

func RateLimitMiddleware(limit int) gin.HandlerFunc {
    bucket := make(chan struct{}, limit)
    return func(c *gin.Context) {
        select {
        case bucket <- struct{}{}:
            defer func() { <-bucket }()
            c.Next()
        default:
            c.AbortWithStatusJSON(429, gin.H{
                "error": "Too many requests",
            })
        }
    }
}

5. 中间件执行顺序

中间件按照添加顺序执行:

func main() {
    r := gin.New()
    
    // 第一个执行的中间件
    r.Use(func(c *gin.Context) {
        fmt.Println("Middleware 1 - Start")
        c.Next()
        fmt.Println("Middleware 1 - End")
    })
    
    // 第二个执行的中间件
    r.Use(func(c *gin.Context) {
        fmt.Println("Middleware 2 - Start")
        c.Next()
        fmt.Println("Middleware 2 - End")
    })
    
    r.GET("/", func(c *gin.Context) {
        fmt.Println("Handler")
        c.String(200, "Hello")
    })
    
    r.Run(":8080")
}

输出顺序:

Middleware 1 - Start
Middleware 2 - Start
Handler
Middleware 2 - End
Middleware 1 - End

提示:合理使用中间件可以极大提高代码复用率和可维护性,但也要避免过度使用导致性能下降。

Prev
Gin框架入门
Next
数据库操作