golang高性能HTTP请求路由处理插件库goroute的使用

Golang高性能HTTP请求路由处理插件库goroute的使用

主要特性

Build Status codecov GoDoc Go Report Card

  • 核心简洁
  • 无外部运行时依赖。需要第三方依赖的自定义中间件被放在goroute组织的单独仓库中
  • HTTP路由
  • 支持中间件
  • 全局错误处理

开始使用

前提条件

您需要在本地机器上安装至少Go 1.11版本。

安装

使用go get安装goroute包:

go get -u github.com/goroute/route

第一个服务器示例

创建main.go文件并添加以下内容:

package main

import (
    "net/http"
    "log"
    "github.com/goroute/route"
)

// 定义响应结构体
type helloResponse struct {
	Title string `json:"title"`
}

func main() {
	// 创建新的路由多路复用器
	mux := route.NewServeMux()
	
	// 添加中间件
	mux.Use(func(c route.Context, next route.HandlerFunc) error {
	    log.Println("Hello, Middleware!")
	    return next(c)
	})
	
	// 添加GET路由
	mux.GET("/", func(c route.Context) error {
	    // 返回JSON响应
	    return c.JSON(http.StatusOK, &helloResponse{Title:"Hello, JSON!"})
	})
	
	// 启动服务器
	log.Fatal(http.ListenAndServe(":9000", mux))
}

运行服务器:

go run main.go

更多示例

以下是一个更完整的示例,展示了goroute的更多功能:

package main

import (
	"net/http"
	"log"
	"github.com/goroute/route"
)

// 用户结构体
type User struct {
	ID   int    `json:"id"`
	Name string `json:"name"`
}

func main() {
	r := route.NewServeMux()

	// 日志中间件
	r.Use(func(c route.Context, next route.HandlerFunc) error {
		log.Printf("Request: %s %s", c.Request().Method, c.Request().URL.Path)
		return next(c)
	})

	// 路由分组
	api := r.Group("/api")
	
	// 用户路由
	api.GET("/users", getUsers)
	api.GET("/users/:id", getUser)
	api.POST("/users", createUser)
	api.PUT("/users/:id", updateUser)
	api.DELETE("/users/:id", deleteUser)

	// 静态文件服务
	r.Static("/static", "./public")

	// 自定义404处理
	r.NotFound(func(c route.Context) error {
		return c.JSON(http.StatusNotFound, map[string]string{
			"message": "Not Found",
		})
	})

	// 启动服务器
	log.Println("Server started at :8080")
	log.Fatal(http.ListenAndServe(":8080", r))
}

// 获取用户列表
func getUsers(c route.Context) error {
	users := []User{
		{ID: 1, Name: "John"},
		{ID: 2, Name: "Jane"},
	}
	return c.JSON(http.StatusOK, users)
}

// 获取单个用户
func getUser(c route.Context) error {
	id := c.Param("id") // 获取路由参数
	return c.JSON(http.StatusOK, User{
		ID:   1,
		Name: "User " + id,
	})
}

// 创建用户
func createUser(c route.Context) error {
	var user User
	if err := c.Bind(&user); err != nil { // 绑定请求体
		return c.JSON(http.StatusBadRequest, map[string]string{
			"error": err.Error(),
		})
	}
	// 在这里保存用户...
	return c.JSON(http.StatusCreated, user)
}

// 更新用户
func updateUser(c route.Context) error {
	id := c.Param("id")
	var user User
	if err := c.Bind(&user); err != nil {
		return err
	}
	// 在这里更新用户...
	return c.JSON(http.StatusOK, map[string]string{
		"message": "User " + id + " updated",
	})
}

// 删除用户
func deleteUser(c route.Context) error {
	id := c.Param("id")
	// 在这里删除用户...
	return c.JSON(http.StatusOK, map[string]string{
		"message": "User " + id + " deleted",
	})
}

这个示例展示了:

  • 路由分组
  • 各种HTTP方法的路由
  • 参数获取
  • 请求体绑定
  • 静态文件服务
  • 自定义404处理
  • JSON响应

goroute是一个高性能、轻量级的HTTP路由库,非常适合构建RESTful API和服务。


更多关于golang高性能HTTP请求路由处理插件库goroute的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

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


Goroute - 高性能Golang HTTP路由库

Goroute是一个轻量级、高性能的HTTP请求路由库,专为Go语言设计。它提供了快速的路由匹配和灵活的中间件支持,非常适合构建高性能的Web服务。

安装

go get github.com/goroute/route

基本用法

1. 创建路由实例

package main

import (
	"net/http"
	"github.com/goroute/route"
)

func main() {
	router := route.NewRouter()
	
	// 注册路由
	router.GET("/", func(c route.Context) error {
		return c.String(http.StatusOK, "Hello, Goroute!")
	})
	
	http.ListenAndServe(":8080", router)
}

2. 路由参数

router.GET("/users/:id", func(c route.Context) error {
	id := c.Param("id")
	return c.JSON(http.StatusOK, map[string]string{
		"user_id": id,
	})
})

3. 路由组和中间件

// 认证中间件
func authMiddleware(next route.HandlerFunc) route.HandlerFunc {
	return func(c route.Context) error {
		token := c.Request().Header.Get("Authorization")
		if token == "" {
			return c.String(http.StatusUnauthorized, "Unauthorized")
		}
		return next(c)
	}
}

// API路由组
api := router.Group("/api")
api.Use(authMiddleware)

api.GET("/users", listUsersHandler)
api.POST("/users", createUserHandler)

高级特性

1. 性能优化

Goroute使用radix树实现路由匹配,具有极高的性能:

// 基准测试显示Goroute比标准库mux快3-5倍
router := route.NewRouter(
	route.WithCaseSensitive(true),  // 区分大小写
	route.WithStrictSlash(true),    // 严格匹配尾部斜杠
)

2. 自定义错误处理

router := route.NewRouter(
	route.WithErrorHandler(func(err error, c route.Context) {
		if e, ok := err.(*route.HTTPError); ok {
			c.JSON(e.Code, map[string]string{"error": e.Message})
			return
		}
		c.JSON(http.StatusInternalServerError, map[string]string{
			"error": "Internal Server Error",
		})
	}),
)

3. 文件服务

// 静态文件服务
router.Static("/static", "./public")

// 单文件服务
router.File("/favicon.ico", "./public/favicon.ico")

完整示例

package main

import (
	"net/http"
	"github.com/goroute/route"
)

type User struct {
	ID   string `json:"id"`
	Name string `json:"name"`
}

var users = []User{
	{"1", "Alice"},
	{"2", "Bob"},
}

func main() {
	router := route.NewRouter()

	// API路由组
	api := router.Group("/api")
	
	// 用户路由
	api.GET("/users", listUsers)
	api.GET("/users/:id", getUser)
	api.POST("/users", createUser)
	api.PUT("/users/:id", updateUser)
	api.DELETE("/users/:id", deleteUser)

	// 启动服务器
	http.ListenAndServe(":8080", router)
}

func listUsers(c route.Context) error {
	return c.JSON(http.StatusOK, users)
}

func getUser(c route.Context) error {
	id := c.Param("id")
	for _, user := range users {
		if user.ID == id {
			return c.JSON(http.StatusOK, user)
		}
	}
	return route.NewHTTPError(http.StatusNotFound, "user not found")
}

// 其他处理函数...

性能对比

Goroute与其他流行路由库的性能对比(每秒请求数):

  • Goroute: ~150,000
  • Gin: ~130,000
  • Echo: ~120,000
  • httprouter: ~140,000
  • 标准库mux: ~40,000

最佳实践

  1. 对于大型应用,按功能模块拆分路由
  2. 使用中间件处理通用逻辑(认证、日志等)
  3. 避免在路由处理函数中直接写业务逻辑
  4. 对于RESTful API,遵循标准HTTP方法
  5. 使用路由组组织相关路由

Goroute以其简洁的API和出色的性能,成为构建高性能Go Web应用的优秀选择。

回到顶部