golang高性能HTTP路由快速开发插件库FastRouter的使用
FastRouter - Golang高性能HTTP路由快速开发插件库
简介
FastRouter是一个用Go编写的快速、灵活的HTTP路由器。它包含一些可自定义的选项,如TrailingSlashesPolicy
、PanicHandler
、OptionsHandler
、MethodNotAllowedHandler
、NotFoundHandler
等。FastRouter还提供了一些有用的功能,如分组和中间件。
特性
- 快速:性能优异
- 灵活:提供多种可自定义选项
- 兼容:实现了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)
}
性能优化技巧
- 避免在热路径上分配内存:重用对象和缓冲区
- 使用sync.Pool:对于频繁创建销毁的对象
- 减少中间件数量:每个中间件都会增加处理时间
- 使用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应用。