tlnet 轻量级高性能http服务框架 [English]
功能说明
- 易用性:使用与内置http的使用风格相似,但更加简易
- 高效性:基于缓存与树的路由算法,提供了极高的性能
- 基础路由:支持常见的HTTP方法(GET,POST,PUT,DELETE,PATCH等)
- 拦截器:支持拦截器,包括正则匹配拦截url等拦截功能
- websocket:支持websocket,使用websocket服务与普通http服务同样简易
- 静态文件服务:支持设置路径来提供静态文件服务,静态服务同样支持拦截器
- restful:支持构建RESTful API服务,如 /path/:id/:name/order
- 通配符:支持使用通配符来定义路由,如 /path/*/order
- thrift:支持thrift http协议服务
- 轻量级:启动快,极少资源占用,无冗余功能
Github 地址
适用场景
- 若你寻找一个比
gin
,echo
或原生http等更高效更轻量的http框架,tlnet
将是一个很好的选择,它提供基础性http服务功能,具备良好的扩展性,稳定性,与高并发支持。由于tlnet
的基于缓存与树的实现,绝大多数情况下路由时间复杂度为O(1)
,具备比树更高效的性能。 tlnet
非常适合构建高性能、轻量级的 Web应用程序和 API 或微服务tlnet
没有内置完整的全栈开发的功能支持;对于需要大量内置功能、复杂业务逻辑、全栈开发支持需求的场景,可能Beego
或者Revel
等框架的功能更全面。
快速使用
安装
go get github.com/donnie4w/tlnet
示例1:
tl := NewTlnet()
tl.GET("/g", getHandle)
tl.HttpStart(":8000")
func getHandle(hc *HttpContext) {
hc.ResponseString("hello tlnet")
}
示例2:
tl := NewTlnet()
tl.POST("/p", postHandle) //post请求
tl.HandleStatic("/js/", "/html/js", nil) //设置静态资源服务
tl.HttpStart(":8000")
func postHandle(hc *HttpContext) {
hc.ResponseString("hello tlnet")
}
示例3:
tl := NewTlnet()
tl.GET("/user/:id/:name/order", userorderhandler) //restful API
tl.HttpStart(":8000")
func userorderhandler(hc *HttpContext) {
hc.ResponseString(hc.GetParam("id") + ":" + hc.GetParam("name"))
}
拦截器使用用例:
tl := NewTlnet()
tl.HandleWithFilter("/",interceptFilter(),func(hc *HttpContext) {hc.ResponseString("uri:"+hc.ReqInfo.Uri)) }) //http通用处理并定义拦截器
tl.HandleStaticWithFilter("/js/", "/html/js", interceptFilter(), nil)
tl.HttpStart(":8000")
func interceptFilter() *Filter {
f := NewFilter()
//内置后缀拦截器
f.AddSuffixIntercept([]string{".jpg"}, func(hc *HttpContext) bool {
logging.Debug("suffix path:" + hc.ReqInfo.Path)
return false
})
//内置路径未找到拦截器
f.AddPageNotFoundIntercept(func(hc *HttpContext) bool {
hc.Error("page not found:"+hc.ReqInfo.Uri, http.StatusNotFound)
return true
})
//自定义URL正则匹配规则拦截器
f.AddIntercept(".*?", func(hc *HttpContext) bool {
logging.Debug("intercept:", hc.ReqInfo.Uri)
if hc.ReqInfo.Path == "" {
hc.Error("path is empty:"+hc.ReqInfo.Uri, http.StatusForbidden)
return true
}
return false
})
return f
}
websocket的基础使用:
func TestWebsocket(t *testing.T) {
tl := NewTlnet()
tl.HandleWebSocket("/ws", websocketHandler)
tl.HttpStart(":8000")
}
func websocketHandler(hc *HttpContext) {
wsId := hc.WS.Id //每个websocket链接都会生成一个识别id
msg := string(hc.WS.Read()) //读取客户端请求数据
hc.WS.Send("服务ID" + fmt.Sprint(wsId) + "已经收到你发送的信息:" + msg) //向客户端回复数据
}
tlnet的其他函数 使用示例说明:
SetLogger(true) // 开启日志打印,默认关闭
tl := NewTlnet() // 创建Tlnet示例对象
tl.SetMaxBytesReader(1 << 20) //设置http请求数据 最大最大限制 1M
tl.HandleWebSocketBindOrigin("/ws", "http://tlnet.top/", websocketFunc) //定义Origin为 http://tlnet.top/
tl.HandleWebSocketBindConfig("/ws", websocketFunc, newWebsocketConfig()) //定义 config,实现websocket的错误处理,连接成功 等函数处理
tl.ReadTimeout(10 * time.Second) //设置读取超时
tl.HttpsStart(":8000",certFile, keyFile) // 启动 https 服务 certFile为crt文件路径,keyFile为key文件路径
tl.HttpsStartWithBytes(":8000",certFileBs, keyFileBs) // 启动 https 服务 certFileBs为crt文件数据,keyFileBs为key文件数据
tl.Close() //关闭tlnet实例对象服务
Tlnet 性能
《Tlnet—性能压测数据 tlnet+gin+echo+原生http》