golang轻量级高性能HTTP路由插件库GoLobby/Router的使用

Golang轻量级高性能HTTP路由插件库GoLobby/Router的使用

GoLobby Router简介

GoLobby Router是一个轻量级但功能强大的Go语言HTTP路由器。它基于Go HTTP包构建,并使用基数树提供以下特性:

  • 基于HTTP方法和URI的路由
  • 路由参数和参数模式
  • 路由通配符
  • 中间件
  • HTTP响应(如JSON、XML、文本、空、文件和重定向)
  • 静态文件服务
  • 无额外开销!
  • 零依赖!

安装

要安装此包,请在项目目录中运行以下命令:

go get github.com/golobby/router

快速入门

以下示例展示了如何使用router包:

package main

import (
    "github.com/golobby/router"
    "log"
    "net/http"
)

func main() {
    r := router.New()
    
    r.GET("/", func(c router.Context) error {
        // c.Request()是原始的http.Request
        // c.Response()是原始的http.ResponseWriter
        return c.Text(http.StatusOK, "Hello from GoLobby Router!")
    })
    
    r.PUT("/products/:id", func(c router.Context) error {
        return c.Text(http.StatusOK, "Update product with ID: "+c.Parameter("id"))
    })
    
    log.Fatalln(r.Start(":8000"))
}

HTTP方法

您可以使用Map()方法声明路由。它接受HTTP方法和路径(URI)。对于最常用的HTTP方法,还提供了一些便捷方法,包括GETPOSTPUTPATCHDELETEHEADOPTIONSAny()方法定义处理任何HTTP方法的路由。

package main

import (
    "github.com/golobby/router"
    "log"
    "net/http"
)

func Handler(c router.Context) error {
    return c.Text(http.StatusOK, "Hello from GoLobby Router!")
}

func main() {
    r := router.New()
    
    r.GET("/", Handler)
    r.POST("/", Handler)
    r.PUT("/", Handler)
    r.PATCH("/", Handler)
    r.DELETE("/", Handler)
    r.HEAD("/", Handler)
    r.OPTIONS("/", Handler)
    
    r.Any("/page", Handler)
    
    r.Map("GET", "/", Handler)
    r.Map("CUSTOM", "/", Handler)
        
    log.Fatalln(r.Start(":8000"))
}

路由参数

要指定路由参数,请在参数前加冒号,如:id。默认情况下,参数可以是任何内容,但您可以使用Define()方法确定正则表达式模式。当然,正则表达式模式会减慢您的应用程序,如果可能的话建议不要使用它们。

package main

import (
    "github.com/golobby/router"
    "log"
    "net/http"
)

func main() {
    r := router.New()
    
    // "id"参数必须是数字
    r.Define("id", "[0-9]+")
   
    // 带一个参数的路由
    r.GET("/posts/:id", func(c router.Context) error {
        return c.Text(http.StatusOK, c.Parameter("id"))
    })
    
    // 带多个参数的路由
    r.GET("/posts/:id/comments/:cid", func(c router.Context) error {
        return c.JSON(http.StatusOK, c.Parameters())
    })
    
    log.Fatalln(r.Start(":8000"))
}

路由组

您可以将具有相似属性的路由放在组中。目前支持前缀和中间件属性。

按前缀分组

package main

import (
    "github.com/golobby/router"
    "log"
    "net/http"
)

func main() {
    r := router.New()
    
    r.WithPrefix("/blog", func() {
        r.GET("/posts", PostsHandler)    // "/blog/posts"
        r.GET("/posts/:id", PostHandler) // "/blog/posts/:id"
        r.WithPrefix("/pages", func() {
            r.GET("/about", AboutHandler)     // "/blog/pages/about"
            r.GET("/contact", ContactHandler) // "/blog/pages/contact"
        })
    })
    
    log.Fatalln(r.Start(":8000"))
}

按中间件分组

package main

import (
    "github.com/golobby/router"
    "log"
    "net/http"
)

func AdminMiddleware(next router.Handler) router.Handler {
    return func(c router.Context) error {
        // 检查用户角色...
        return next(c)
    }
}

func main() {
    r := router.New()
    
    r.WithMiddleware(AdminMiddleware, func() {
        r.GET("/admin/users", UsersHandler)
        r.GET("/admin/products", ProductsHandler)
    })
    
    log.Fatalln(r.Start(":8000"))
}

响应

路由器内置了EmptyRedirectTextHTMLJSONPrettyJSONXMLPrettyXMLBytes响应。

package main

import (
    "github.com/golobby/router"
    "github.com/golobby/router/pkg/response"
    "log"
    "net/http"
)

func main() {
    r := router.New()

    r.GET("/empty", func(c router.Context) error {
        return c.Empty(204)
    })

    r.GET("/redirect", func(c router.Context) error {
        return c.Redirect(301, "https://github.com/golobby/router")
    })

    r.GET("/text", func(c router.Context) error {
        return c.Text(200, "A text response")
    })

    r.GET("/html", func(c router.Context) error {
        return c.HTML(200, "<p>A HTML response</p>")
    })

    r.GET("/json", func(c router.Context) error {
        return c.JSON(200, User{"id": 13})
    })

    r.GET("/json-pretty", func(c router.Context) error {
        return c.PrettyJSON(200, response.M{"message": "A pretty JSON response!"})
    })

    r.GET("/xml", func(c router.Context) error {
        return c.XML(200, User{"id": 13})
    })

    r.GET("/xml-pretty", func(c router.Context) error {
        return c.PrettyXML(200, User{"id": 13})
    })

    r.GET("/bytes", func(c router.Context) error {
        return c.Bytes(200, []byte("Some bytes!"))
    })

    log.Fatalln(r.Start(":8000"))
}

错误处理

您的处理程序在处理HTTP请求时可能会返回错误。这个错误可能是由您的应用程序逻辑或HTTP响应失败产生的。默认情况下,路由器使用Golang的内置记录器将其记录到标准输出,并返回以下HTTP 500响应。

{"message": "Internal error."}

最佳实践是添加一个全局中间件来捕获所有这些错误,记录并以您需要的方式处理它们。

package main

import (
    "github.com/golobby/router"
    "log"
    "net/http"
)

func main() {
    r := router.New()
    
    // 错误处理中间件
    r.AddMiddleware(func (next router.Handler) router.Handler {
        return func(c router.Context) error {
            if err := next(c); err != nil {
                myLogger.log(err)
                return c.HTML(500, "<p>Something went wrong</p>")
            }
            
            // 没有错误会传递给路由器基础处理程序
            return nil
        }
    })

    r.GET("/", Handler)
    
    log.Fatalln(r.Start(":8000"))
}

更多关于golang轻量级高性能HTTP路由插件库GoLobby/Router的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级高性能HTTP路由插件库GoLobby/Router的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


GoLobby/Router 轻量级高性能HTTP路由库使用指南

GoLobby/Router 是一个轻量级、高性能的Go语言HTTP路由库,它具有简单易用、低内存消耗和高性能的特点。下面我将详细介绍它的使用方法。

安装

首先安装该库:

go get github.com/golobby/router

基本使用

1. 创建路由实例

package main

import (
	"github.com/golobby/router"
	"net/http"
)

func main() {
	r := router.New()
	
	// 配置路由...
	
	http.ListenAndServe(":8080", r)
}

2. 注册路由处理函数

// 简单GET路由
r.Get("/", func(c router.Context) error {
	return c.Text("Hello, World!")
})

// 带参数的路由
r.Get("/user/:id", func(c router.Context) error {
	id := c.Param("id")
	return c.Text("User ID: " + id)
})

// POST路由
r.Post("/users", func(c router.Context) error {
	// 获取POST数据
	name := c.FormValue("name")
	return c.Text("Created user: " + name)
})

高级功能

1. 路由分组

api := r.Group("/api")
{
	api.Get("/users", listUsers)
	api.Post("/users", createUser)
	
	// 嵌套分组
	admin := api.Group("/admin")
	{
		admin.Get("/dashboard", adminDashboard)
	}
}

2. 中间件

// 定义中间件
func logger(next router.HandlerFunc) router.HandlerFunc {
	return func(c router.Context) error {
		fmt.Printf("Request: %s %s\n", c.Request().Method, c.Request().URL.Path)
		return next(c)
	}
}

// 全局中间件
r.Use(logger)

// 路由组中间件
authGroup := r.Group("/auth")
authGroup.Use(authMiddleware)
{
	authGroup.Get("/profile", userProfile)
}

3. 静态文件服务

// 单个文件
r.File("/favicon.ico", "./public/favicon.ico")

// 静态文件目录
r.Static("/static", "./public/static")

4. 自定义错误处理

r.NotFoundHandler = func(c router.Context) error {
	return c.JSON(404, map[string]string{"error": "Not found"})
}

r.ErrorHandler = func(c router.Context, err error) {
	c.JSON(500, map[string]string{"error": err.Error()})
}

性能优化技巧

  1. 避免在热路径上分配内存:在路由处理函数中避免频繁创建临时对象

  2. 使用sync.Pool:对于频繁使用的对象,可以使用sync.Pool来重用

  3. 预编译正则表达式:如果使用正则路由,预编译正则表达式

var userIDRegex = regexp.MustCompile(`^[a-zA-Z0-9]+$`)

r.Get("/user/:id", func(c router.Context) error {
	id := c.Param("id")
	if !userIDRegex.MatchString(id) {
		return c.Text("Invalid ID", 400)
	}
	// ...
})

完整示例

package main

import (
	"github.com/golobby/router"
	"log"
	"net/http"
)

func main() {
	r := router.New()
	
	// 全局中间件
	r.Use(loggerMiddleware)
	
	// 首页
	r.Get("/", homeHandler)
	
	// API路由组
	api := r.Group("/api")
	api.Use(authMiddleware)
	{
		api.Get("/users", listUsersHandler)
		api.Post("/users", createUserHandler)
		api.Get("/users/:id", getUserHandler)
	}
	
	// 静态文件
	r.Static("/assets", "./public/assets")
	
	// 自定义404
	r.NotFoundHandler = notFoundHandler
	
	log.Println("Server started on :8080")
	log.Fatal(http.ListenAndServe(":8080", r))
}

func loggerMiddleware(next router.HandlerFunc) router.HandlerFunc {
	return func(c router.Context) error {
		log.Printf("%s %s", c.Request().Method, c.Request().URL.Path)
		return next(c)
	}
}

func homeHandler(c router.Context) error {
	return c.Text("Welcome to the homepage!")
}

// ...其他处理函数实现

性能对比

GoLobby/Router 在设计上注重性能,与其他流行路由库相比:

  1. 比标准库 http.ServeMux 更灵活但性能接近
  2. gorilla/mux 更轻量级,性能更好
  3. httprouter 功能稍少但API更简单

总结

GoLobby/Router 是一个非常适合中小型项目的轻量级路由库,它提供了:

  • 简洁的API设计
  • 路由参数支持
  • 中间件支持
  • 路由分组
  • 静态文件服务
  • 良好的性能表现

对于不需要复杂功能但追求性能的项目,这是一个很好的选择。

回到顶部