GithubHelp home page GithubHelp logo

twiglab / twig Goto Github PK

View Code? Open in Web Editor NEW
99.0 5.0 10.0 225 KB

Twig - less is more's web server for golang

Home Page: https://twig.twiglab.dev/doc/

License: MIT License

Go 100.00%
twig golang webserver websocket middleware httpcontext http2 go goweb httpserver

twig's Introduction

twig

twig 是一个面向webapi的简单的webserver,Twig的目标是成为构建Golang微服务的基石

Twig 采用QQ群提供技术支持,QQ群号:472900117

性能测试

goos: linux
goarch: amd64
pkg: web
BenchmarkTwigStatic-2      	   20000	     71232 ns/op	     870 B/op	       0 allocs/op
BenchmarkTwigGitHubAPI-2   	   10000	    101092 ns/op	     878 B/op	       0 allocs/op
BenchmarkTwigGplusAPI-2    	  300000	      5613 ns/op	      57 B/op	       0 allocs/op
BenchmarkTwigParseAPI-2    	  200000	     10660 ns/op	     173 B/op	       0 allocs/op

BenchmarkEchoStatic-2      	   20000	     63527 ns/op	    2126 B/op	     157 allocs/op
BenchmarkEchoGitHubAPI-2   	   20000	     91821 ns/op	    2496 B/op	     203 allocs/op
BenchmarkEchoGplusAPI-2    	  300000	      5072 ns/op	     161 B/op	      13 allocs/op
BenchmarkEchoParseAPI-2    	  200000	      9195 ns/op	     381 B/op	      26 allocs/op

BenchmarkGinStatic-2       	   20000	     75786 ns/op	    8405 B/op	     157 allocs/op
BenchmarkGinGitHubAPI-2    	   10000	    103458 ns/op	   10619 B/op	     203 allocs/op
BenchmarkGinGplusAPI-2     	  200000	      6049 ns/op	     710 B/op	      13 allocs/op
BenchmarkGinParseAPI-2     	  200000	     11559 ns/op	    1421 B/op	      26 allocs/op
PASS
ok  	web	24.538s

Twig 比Gin更快,更好用!

安装

go get github.com/twiglab/twig

Twig 支持 go mod

入门

package main

import (
	"net/http"
	"os"
	"time"

	"github.com/twiglab/twig"
)

func main() {
	web := twig.TODO()
	web.AddServer(twig.NewServer(":4321")) // twig支持多server

    // twig支持多路由, 在默认路由上增加handler
	web.Config().
		Get("/hello", func(c twig.Ctx) error {
			return c.String(twig.OK, "Hello Twig!")
		})

	web.Start()

	twig.Signal(twig.Graceful(web, 15*time.Second), os.Interrupt)
}
  • Twig的默认监听端口是4321, 或者自定义自己的Server
  • 使用twig.TODO()创建默认的Twig,默认的Twig包括,默认的路由实现(RadixTree),默认的Logger和默认的HttpErrorHandler
  • twig.Config是Twig提供的配置工具,Twig没有像别的webserver一样提供GET,POST等方法,所有的配置工作都通过Config完成
  • Twig要求所有的Server的实现必须是非堵塞的,Start方法将启动Twig,Twig提供了Signal组件用于堵塞应用,处理系统信号,完成和shell的交互

Twig最大的特点是简洁,灵活,Twig的所有组建都以接口方式提供,支持重写,Twig也提供了Plugger模块,集成其他组建,用于增强Twig的功能

至此讲述的内容,已经足够让您运行并使用Twig。 祝您使用Twig愉快!


Twig的结构

Twig 是一个仔细设计过的webserver, 与其他的webserver不同,Twig的设计的目标是成为 构建应用程序的基石

Twig 的设计分为,核心,外围, 工具三个部分

核心

Twig 的核心组件包括:请求执行环境,服务器与连接器,日志,请求处理中间件,以及Twig本身

连接器和服务器完成对网络协议处理构成请求,请求处理中间件负责对请求过滤执行,执行环境用于提供应用执行所需要的上下文,用于业务处理,Twig把所有的组建继承成为一个完整的应用

服务器与连接器

(coming soon...)

请求执行环境

请求执行环境的功能是为应用提供一个上下文(Ctx),有下列组件构成:

  • Lookuper(路由执行器)用于查找符合当前请求路径的handler,并返回执行环境Ctx
  • Ctx (执行上下文)提供请求上下文

除此之外,执行环境还包括:

  • Register(注册器)提供handler注册功能,可以用Config工具进行配置
  • Muxer(路由器)描述接口
  • HandlerFunc(请求处理)

执行环境的核心是Lookuper和Register 用于路由查找和路由注册(即Muxer接口)。Twig 通过路由查找器的Lookup方法查找并执行路由,返回Ctx,用于执行Handler


Ctx和HandlerFunc

中间件

(coming soon...)

插件 (Plugin)

多Server支持

twig's People

Contributors

it512 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

twig's Issues

Mr. Wang

Mr. Wang, why are you so NB?

希望实现Flask框架的一些特性

希望实现类似于 Flask 的 Blueprint 和 url_for 特性,可以考虑使用 NamedRoute 实现出来,可以选择给路由添加名称,使用 url_for 这样的功能可以直接返回对应的路由 URL 或者 handler

使用静态资源目录报错

我想用下面的代码加载assets目录下的资源

web := twig.TODO()
	web.AddServer(twig.NewServer(":4321"))

	web.Config().
		Static("/static/*", "/Users/xxx/go/src/xxx/assets/*").

结果报错:

Refused to apply style from 'http://localhost:4321/static/docute.css' because its MIME type ('text/plain') is not a supported stylesheet MIME type, and strict MIME checking is enabled.

GET http://localhost:4321/static/docute.js net::ERR_ABORTED 404 (Not Found)

v0.8.9的示例用不了, 还有就是使用golint时有一堆报错

  1. v0.8.9的示例用不了
    web := twig.TODO()
    web.Config()返回的是Assembler类型,是需要在外面加twig.Config转成*Conf类型吗

  2. ide有使用golint时有76个警告,主页是这些警告:
    1)可导出函数没注释;
    2)注释不规范;
    3)英文缩写没使用全大写;

ServeHTTP内存分配优化

根据 go test -bench=.测试出的结果,注释四行将多157 allocs/op的内存分配,优化成两行独立的Merge。

// ServeHTTP 实现`http.Handler`接口
func (t *Twig) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    method, path := r.Method, GetReqPath(r)
    c := t.muxes.Lookup(method, path, r)

    mc := c.(muxerCtx)
    mc.reset(w, r, t)

//  h := Merge(func(ctx Ctx) error { //闭包,处理Twig级中间件,结束后处理Pre中间件
//      handler := Merge(mc.Handler(), t.mid) // 处理Twig级中间件
//      return handler(ctx)
//  }, t.pre) // 处理Pre中间件

    h := Merge(mc.Handler(), t.mid)
    h = Merge(h, t.pre)

    if err := h(c); err != nil { // 链式调用,如果出错,交给Twig的HttpErrorHandler处理
        t.HttpErrorHandler(err, c)
    }   
    
    mc.Release()
} 

几个小疑问

1, server.go第22行:
func DefaultServnat() *Servant {
函数名是不是应该叫DefaultServant?

2, const.go第134行注释:
defaultHeaderBytes = 1 << 20 // 512k
1 << 20 是1M

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.