golang高性能HTTP路由快速开发插件库FastRouter的使用

FastRouter - Golang高性能HTTP路由快速开发插件库

简介

FastRouter是一个用Go编写的快速、灵活的HTTP路由器。它包含一些可自定义的选项,如TrailingSlashesPolicyPanicHandlerOptionsHandlerMethodNotAllowedHandlerNotFoundHandler等。FastRouter还提供了一些有用的功能,如分组中间件

GoDoc Build Status Go Report Card Coverage Status

特性

  • 快速:性能优异
  • 灵活:提供多种可自定义选项
  • 兼容:实现了http.Handler,兼容第三方包
  • 中间件:支持中间件链式调用
  • 分组:支持路由分组和嵌套分组

基本使用示例

package main

import (
	"fmt"
	"net/http"
	
	"github.com/razonyang/fastrouter"
)

func main() {
	router := fastrouter.New()
	
	// 注册GET路由
	router.GET("/hello", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Hello, FastRouter!")
	})
	
	// 注册带参数的路由
	router.GET("/user/:name", func(w http.ResponseWriter, r *http.Request) {
		name := fastrouter.Params(r).ByName("name")
		fmt.Fprintf(w, "Hello, %s!", name)
	})
	
	// 启动服务器
	http.ListenAndServe(":8080", router)
}

分组路由示例

package main

import (
	"fmt"
	"net/http"
	
	"github.com/razonyang/fastrouter"
)

func main() {
	router := fastrouter.New()
	
	// 创建API分组
	api := router.Group("/api")
	{
		// 在/api下注册路由
		api.GET("/users", func(w http.ResponseWriter, r *http.Request) {
			fmt.Fprint(w, "User list")
		})
		
		// 创建嵌套分组/api/v1
		v1 := api.Group("/v1")
		{
			v1.GET("/products", func(w http.ResponseWriter, r *http.Request) {
				fmt.Fprint(w, "Product list v1")
			})
		}
	}
	
	http.ListenAndServe(":8080", router)
}

中间件示例

package main

import (
	"fmt"
	"net/http"
	
	"github.com/razonyang/fastrouter"
)

// 日志中间件
func loggingMiddleware(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)
	})
}

func main() {
	router := fastrouter.New()
	
	// 应用中间件到所有路由
	router.Use(loggingMiddleware)
	
	router.GET("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Home page")
	})
	
	// 创建带中间件的分组
	admin := router.Group("/admin")
	admin.Use(func(next http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			// 检查管理员权限
			fmt.Println("Admin middleware check")
			next.ServeHTTP(w, r)
		})
	})
	{
		admin.GET("/dashboard", func(w http.ResponseWriter, r *http.Request) {
			fmt.Fprint(w, "Admin dashboard")
		})
	}
	
	http.ListenAndServe(":8080", router)
}

静态文件服务示例

package main

import (
	"net/http"
	
	"github.com/razonyang/fastrouter"
)

func main() {
	router := fastrouter.New()
	
	// 提供静态文件服务
	router.ServeFiles("/static/*filepath", http.Dir("./static"))
	
	router.GET("/", func(w http.ResponseWriter, r *http.Request) {
		w.Write([]byte("Visit /static/ to access static files"))
	})
	
	http.ListenAndServe(":8080", router)
}

以上示例展示了FastRouter的基本用法,包括路由注册、分组路由、中间件和静态文件服务等功能。FastRouter是一个高性能、灵活的路由库,适合构建各种规模的Web应用。


更多关于golang高性能HTTP路由快速开发插件库FastRouter的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

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


FastRouter: Golang高性能HTTP路由快速开发插件库

FastRouter是一个轻量级、高性能的Golang HTTP路由库,专为快速开发和高性能需求设计。下面我将详细介绍它的使用方法和示例代码。

安装FastRouter

go get github.com/fasthttp/router

基本使用示例

package main

import (
	"fmt"
	"log"
	
	"github.com/fasthttp/router"
	"github.com/valyala/fasthttp"
)

func main() {
	r := router.New()
	
	// 基本路由
	r.GET("/", IndexHandler)
	r.GET("/hello/{name}", HelloHandler)
	r.POST("/submit", SubmitHandler)
	
	// 启动服务器
	log.Fatal(fasthttp.ListenAndServe(":8080", r.Handler))
}

func IndexHandler(ctx *fasthttp.RequestCtx) {
	fmt.Fprint(ctx, "Welcome to FastRouter!\n")
}

func HelloHandler(ctx *fasthttp.RequestCtx) {
	name := ctx.UserValue("name").(string)
	fmt.Fprintf(ctx, "Hello, %s!\n", name)
}

func SubmitHandler(ctx *fasthttp.RequestCtx) {
	// 获取POST数据
	body := ctx.PostBody()
	fmt.Fprintf(ctx, "Received: %s\n", string(body))
}

高级特性

1. 路由分组

func main() {
	r := router.New()
	
	// API v1 分组
	apiV1 := r.Group("/api/v1")
	{
		apiV1.GET("/users", ListUsersHandler)
		apiV1.POST("/users", CreateUserHandler)
		apiV1.GET("/users/{id}", GetUserHandler)
	}
	
	fasthttp.ListenAndServe(":8080", r.Handler)
}

2. 中间件支持

func Logger(next fasthttp.RequestHandler) fasthttp.RequestHandler {
	return func(ctx *fasthttp.RequestCtx) {
		start := time.Now()
		next(ctx)
		fmt.Printf("%s %s %s %v\n", 
			ctx.Method(), 
			ctx.Path(), 
			ctx.Response.StatusCode(), 
			time.Since(start))
	}
}

func main() {
	r := router.New()
	r.GET("/", IndexHandler)
	
	// 应用中间件
	handler := Logger(r.Handler)
	fasthttp.ListenAndServe(":8080", handler)
}

3. 参数路由和通配符

func main() {
	r := router.New()
	
	// 命名参数
	r.GET("/user/{id}", func(ctx *fasthttp.RequestCtx) {
		id := ctx.UserValue("id").(string)
		fmt.Fprintf(ctx, "User ID: %s", id)
	})
	
	// 通配符
	r.GET("/files/{filepath:*}", func(ctx *fasthttp.RequestCtx) {
		filepath := ctx.UserValue("filepath").(string)
		fmt.Fprintf(ctx, "File path: %s", filepath)
	})
	
	fasthttp.ListenAndServe(":8080", r.Handler)
}

4. CORS支持

func main() {
	r := router.New()
	r.GET("/", IndexHandler)
	
	// 添加CORS中间件
	handler := func(ctx *fasthttp.RequestCtx) {
		ctx.Response.Header.Set("Access-Control-Allow-Origin", "*")
		ctx.Response.Header.Set("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS")
		ctx.Response.Header.Set("Access-Control-Allow-Headers", "Content-Type")
		
		r.Handler(ctx)
	}
	
	fasthttp.ListenAndServe(":8080", handler)
}

性能优化技巧

  1. 避免在热路径上分配内存:重用对象和缓冲区
  2. 使用sync.Pool:对于频繁创建销毁的对象
  3. 减少中间件数量:每个中间件都会增加处理时间
  4. 使用fasthttp的优化特性:如RequestCtx的复用

完整示例:RESTful API

package main

import (
	"encoding/json"
	"fmt"
	"log"
	
	"github.com/fasthttp/router"
	"github.com/valyala/fasthttp"
)

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

var users = map[string]User{
	"1": {ID: "1", Name: "Alice"},
	"2": {ID: "2", Name: "Bob"},
}

func main() {
	r := router.New()
	
	// 用户路由
	r.GET("/users", listUsers)
	r.POST("/users", createUser)
	r.GET("/users/{id}", getUser)
	r.PUT("/users/{id}", updateUser)
	r.DELETE("/users/{id}", deleteUser)
	
	// 启动服务器
	log.Fatal(fasthttp.ListenAndServe(":8080", r.Handler))
}

func listUsers(ctx *fasthttp.RequestCtx) {
	userList := make([]User, 0, len(users))
	for _, user := range users {
		userList = append(userList, user)
	}
	
	ctx.Response.Header.Set("Content-Type", "application/json")
	json.NewEncoder(ctx).Encode(userList)
}

func createUser(ctx *fasthttp.RequestCtx) {
	var user User
	if err := json.Unmarshal(ctx.PostBody(), &user); err != nil {
		ctx.Error("Bad Request", fasthttp.StatusBadRequest)
		return
	}
	
	users[user.ID] = user
	ctx.SetStatusCode(fasthttp.StatusCreated)
}

func getUser(ctx *fasthttp.RequestCtx) {
	id := ctx.UserValue("id").(string)
	user, exists := users[id]
	if !exists {
		ctx.Error("Not Found", fasthttp.StatusNotFound)
		return
	}
	
	ctx.Response.Header.Set("Content-Type", "application/json")
	json.NewEncoder(ctx).Encode(user)
}

func updateUser(ctx *fasthttp.RequestCtx) {
	id := ctx.UserValue("id").(string)
	if _, exists := users[id]; !exists {
		ctx.Error("Not Found", fasthttp.StatusNotFound)
		return
	}
	
	var user User
	if err := json.Unmarshal(ctx.PostBody(), &user); err != nil {
		ctx.Error("Bad Request", fasthttp.StatusBadRequest)
		return
	}
	
	users[id] = user
	ctx.SetStatusCode(fasthttp.StatusNoContent)
}

func deleteUser(ctx *fasthttp.RequestCtx) {
	id := ctx.UserValue("id").(string)
	if _, exists := users[id]; !exists {
		ctx.Error("Not Found", fasthttp.StatusNotFound)
		return
	}
	
	delete(users, id)
	ctx.SetStatusCode(fasthttp.StatusNoContent)
}

FastRouter因其简单性和高性能成为许多Golang开发者的选择。它特别适合需要处理高并发请求的微服务和API开发场景。通过合理使用路由分组、中间件和参数路由,可以快速构建出结构清晰、性能优异的Web应用。

回到顶部