轻量、高性能的 Go HTTP Router CleverGo Router

轻量、高性能的 Go HTTP Router CleverGo Router

BSD
Google Go
跨平台
2020-02-05
Razon

CleverGo 是一个轻量级、功能丰富和高性能的 HTTP 路由。

基准测试

日期: 2020/02/11

越小性能越好

Benchmark

功能特性

  • 高性能: 参见基准测试
  • 反向路由生成: 可以通过命名路由匹配路由生成 URL。
  • 路由组: 亦称子路由, 参看路由组
  • 对 APIs 友好: 很容易设计 RESTful APIs 和通过路由组进行 APIs 版本化。
  • 中间件: 可以在路由组或特定路由插入中间件,也可以使用全局中间件, 请参看中间件例子。
  • 错误处理器 可以自定义错误响应,比如显示一个错误页面。

安装

GO111MODULE=on go get github.com/clevergo/clevergo

或者安装特定版本:

GO111MODULE=on go get github.com/clevergo/clevergo@version

替换 version 为具体版本即可。

举个栗子

package main

import (
	"fmt"
	"net/http"

	"github.com/clevergo/clevergo"
)

func home(ctx *clevergo.Context) error {
	ctx.WriteString("hello world")
	return nil
}

func hello(ctx *clevergo.Context) error {
	ctx.WriteString(fmt.Sprintf("hello %s", ctx.Params.String("name")))
	return nil
}

func main() {
	router := clevergo.NewRouter()
	router.Get("/", home)
	router.Get("/hello/:name", hello)
	http.ListenAndServe(":8080", router)
}

参数

可以通过多种方式获取各种类型的参数值。

func (ctx *clevergo.Context) error {
	name := ctx.Params.String("name")
	page, err := ctx.Params.Int("page")
	num, err := ctx.Params.Int64("num")
	amount, err := ctx.Params.Uint64("amount")
	enable, err := ctx.Params.Bool("enable")
	price, err := ctx.Params.Float64("price")
	return err
}

静态文件

router.ServeFiles("/static/*filepath", http.Dir("/path/to/static"))

// 有时候,将 http.FileServer 作为 NotFound 处理器很有用处。
// 比如 "/favicon.ico"。
router.NotFound = http.FileServer(http.Dir("public"))

反向路由生成

queryPost := func (ctx *clevergo.Context) error {
	// 通过匹配路由生成 URL
	url, _ := ctx.Route.URL("year", "2020", "month", "02", "slug", "hello world")
	return nil
}

router.Get("/posts/:year/:month/:slug", queryPost, router.RouteName("post"))

// 通过命名路由生成 URL
url, _ := router.URL("post", "year", "2020", "month", "02", "slug", "hello world")

错误处理器

错误处理器可以自定义错误响应。

type MyErrorHandler struct {
	Tmpl *template.Template
}

func (meh MyErrorHandler) Handle(ctx *clevergo.Context, err error) {
	// 显示一个错误页面。
	if err := meh.Tmpl.Execute(ctx.Response, err); err != nil {
		ctx.Error(err.Error(), http.StatusInternalServerError)
	}
}

router.ErrorHandler = MyErrorHandler{
	Tmpl: template.Must(template.New("error").Parse(`<html><body><h1>{{ .Error }}</h1></body></html>`)),
}

中间件

中间件是一个 Handle 函数。

authenticator := func(ctx *clevergo.Context) error {
    // authenticate 返回一个 user 和一个布尔值表示提供的凭证是否有效。
    if user, ok := authenticate(ctx); !ok {
        // 返回一个错误,以终止后续的中间件和 Handle。
        return clevergo.StatusError{http.StatusUnauthorized, http.StatusText(http.StatusUnauthorized)}
    }

    // 在中间件之间共享数据。
    ctx.WithValue("user", user)
    return nil
}

auth := func(ctx *clevergo.Context) error {
	ctx.WriteString(fmt.Sprintf("hello %v", ctx.Value("user")))
	return nil
}

router.Get("/auth", auth, RouteMiddleware(
	// 中间件,只在当前路由生效。
	authenticator,
))

// 全局路由,以 gorilla compress 中间件为例。
http.ListenAndServe(":8080", handlers.CompressHandler(router))

中间件也可以在路由组中使用。

路由组

router := clevergo.NewRouter()

api := router.Group("/api", clevergo.RouteGroupMiddleware(
    // APIs 的中间件,如:CORS、身份验证、授权验证等。
))

apiV1 := api.Group("/v1", clevergo.RouteGroupMiddleware(
    // middlewares for v1's APIs
))

apiV2 := api.Group("v2", clevergo.RouteGroupMiddleware(
    // middlewares for v2's APIs
))

RESTful APIs

router.Get("/users", queryUsers)
router.Post("/users", createUser)
router.Get("/users/:id", queryUser)
router.Put("/users/:id", updateUser)
router.Delete("/users/:id", deleteUser)

可以通过路由组对你的 APIs 进行版本化。

的码云指数为
超过 的项目
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

轻松学 React-Router 4(19 个视频)

轻松学 React-Router 4(19 个视频) 轻松学 React-Router 4 #01 介绍「06:34」 轻松学 React-Router 4 #02 BrowserRouter 与 HashRouter「04:11」 轻松学 React-Router 4 #03 Link「03:22」...

02/20 17:42
65
0
vue入门总结(4)

1.路由的模式: 前文中我们创建VueRouter实例时用了mode:history的参数,这个值的意思是使用history模式,这种模式充分利用了history.pushState API来完成URL的跳转而无须重新加载页面。 如果...

2018/09/01 15:26
122
0
交换路由大作业

交换路由大作业 1. 选取设备 设备 接口 IP地址 子网掩码 Vlan80 虚拟接口 10.10.3.129 255.255.255.128 Vlan30 虚拟接口 10.10.2.1 255.255.255.0 Vlan20 虚拟接口 10.10.0.1 255.255.254.0 ...

2019/12/08 17:54
112
0
如何在Quagga BGP路由器中设置IPv6的BGP对等体和过滤

在本教程中,我们会向你演示如何创建IPv6 BGP对等体并通过BGP通告IPv6前缀。同时我们也将演示如何使用前缀列表和路由映射特性来过滤通告的或者获取到的IPv6前缀。 拓扑 服务供应商A和B希望在...

2015/10/23 10:20
252
0
在hbuilderx中vue-cli脚手架配置router文件夹

配置router文件 新建一个文件夹router,再在新建的router文件夹里新建一个index.js文件 index.js import Vue from 'vue' import Router from 'vue-router' import Home from '../components...

02/18 14:56
195
0
informatica router组件

Router组件的作用主要有两个:根据分发条件对数据进行分发;过滤数据,根据多个条件得到(或去掉)不需要的数据。 filter组件只能写一个过滤条件 Router组件的使用注意事项: router组件和目...

2014/12/24 16:38
49
0
CISCO交换机,路由器配置全集

交换机命令 Switch#config t Switch(config)#enable secret cisco 设置进入特权模式的密码 Switch(config)#hostname 交换机命名 Switch(config)#interface Ethernet0/1 进入接口模式 Switch...

2013/08/04 23:05
123
0
Web前端干货详解Vue-Router路由与配置

Web前端干货详解Vue-Router路由与配置,现在的很多应用都流行SPA应用(singe page application) 。传统的项目大多使用多页面结构,需要切换内容的时候我们往往会进行单个html文件的跳转,这个...

2019/07/11 16:49
48
0
Go Web:HttpRouter路由(一)

HttpRouter是一个轻量级但却非常高效的multiplexer。 手册: https://godoc.org/github.com/julienschmidt/httprouter https://github.com/julienschmidt/httprouter 安装httprouter go get...

2019/04/18 22:33
79
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部