Home  /  tlnet


tlnet 轻量级高性能http服务框架 [English]


功能说明

  1. 易用性:使用与内置http的使用风格相似,但更加简易
  2. 高效性:基于缓存与树的路由算法,提供了极高的性能
  3. 基础路由:支持常见的HTTP方法(GET,POST,PUT,DELETE,PATCH等)
  4. 拦截器:支持拦截器,包括正则匹配拦截url等拦截功能
  5. websocket:支持websocket,使用websocket服务与普通http服务同样简易
  6. 静态文件服务:支持设置路径来提供静态文件服务,静态服务同样支持拦截器
  7. restful:支持构建RESTful API服务,如 /path/:id/:name/order
  8. 通配符:支持使用通配符来定义路由,如 /path/*/order
  9. thrift:支持thrift http协议服务
  10. 轻量级:启动快,极少资源占用,无冗余功能


Github 地址

适用场景

  1. 若你寻找一个比ginecho或原生http等更高效更轻量的http框架,tlnet将是一个很好的选择,它提供基础性http服务功能,具备良好的扩展性,稳定性,与高并发支持。由于tlnet的基于缓存与树的实现,绝大多数情况下路由时间复杂度为O(1),具备比树更高效的性能。
  2. tlnet 非常适合构建高性能、轻量级的 Web应用程序和 API 或微服务
  3. 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》

压测程序地址