Home

Awesome

<div align=center> <img src="https://github.com/devfeel/dotweb/blob/master/logo.png" width="200"/> </div>

DotWeb

Simple and easy go web micro framework

Important: Now need go1.9+ version support, and support go mod.

Document: https://www.kancloud.cn/devfeel/dotweb/346608

Guide: https://github.com/devfeel/dotweb/blob/master/docs/GUIDE.md

Gitter GoDoc Go Report Card Go Build Card <a target="_blank" href="http://shang.qq.com/wpa/qunwpa?idkey=836e11667837ad674462a4a97fb21fba487cd3dff5b2e1ca0d7ea4c2324b4574"><img border="0" src="http://pub.idqqimg.com/wpa/images/group.png" alt="Golang-Devfeel" title="Golang-Devfeel"></a>

1. Install

go get github.com/devfeel/dotweb

2. Getting Started

package main

import (
	"fmt"
	"github.com/devfeel/dotweb"
)

func main() {
	//init DotApp
	app := dotweb.New()
	//set log path
	app.SetLogPath("/home/logs/wwwroot/")
	//set route
	app.HttpServer.GET("/index", func(ctx dotweb.Context) error{
		return ctx.WriteString("welcome to my first web!")
	})
	//begin server
	fmt.Println("dotweb.StartServer begin")
	err := app.StartServer(80)
	fmt.Println("dotweb.StartServer error => ", err)
}

examples: https://github.com/devfeel/dotweb-example

3. Features

Config Example

4. Performance

DotWeb 1.9.2 16core16G           
cpu内存SamplesAverageMedian90%Line95%Line99%LineMinMaxError%ThroughputReceived KB/SecSend KB/Sec
40%39M152283561944372204020700.00%48703.477514.798656.28
40%42M154851891844163230032500.00%49512.997639.78800.16
40%44M157003851834164233020830.00%50203.327746.228922.86
              
ECHO1.9.216core16G           
cpu内存SamplesAverageMedian90%Line95%Line99%LineMinMaxError%ThroughputReceived KB/SecSend KB/Sec
38%35M153075861944476181018080.00%48951.226166.719034.94
36%35M152390581944576178020030.00%48734.266139.378994.9
37%37M158005851834166229023550.00%50356.096343.689294.24
              
Gin  1.9.2 16core16G            
cpu内存SamplesAverageMedian90%Line95%Line99%LineMinMaxError%ThroughputReceived KB/SecSend KB/Sec
36%36M151091431964471175032500.00%48151.875877.918746.33
36%40M152557491954370189030790.00%48762.535952.458857.25
36%40M153854011844266227023120.00%49181.036003.548933.27

5. Router

1) 常规路由

Router.GET(path string, handle HttpHandle)
Router.POST(path string, handle HttpHandle)
Router.HEAD(path string, handle HttpHandle)
Router.OPTIONS(path string, handle HttpHandle)
Router.PUT(path string, handle HttpHandle)
Router.PATCH(path string, handle HttpHandle)
Router.DELETE(path string, handle HttpHandle)
Router.HiJack(path string, handle HttpHandle)
Router.WebSocket(path string, handle HttpHandle)
Router.Any(path string, handle HttpHandle)
Router.RegisterRoute(routeMethod string, path string, handle HttpHandle)
Router.RegisterHandler(name string, handler HttpHandle)
Router.GetHandler(name string) (HttpHandle, bool)
Router.MatchPath(ctx Context, routePath string) bool

接受两个参数,一个是URI路径,另一个是 HttpHandle 类型,设定匹配到该路径时执行的方法;

2) static router

静态路由语法就是没有任何参数变量,pattern是一个固定的字符串。

package main

import (
    "github.com/devfeel/dotweb"
)

func main() {
    dotapp := dotweb.New()
    dotapp.HttpServer.GET("/hello", func(ctx dotweb.Context) error{
        return ctx.WriteString("hello world!")
    })
    dotapp.StartServer(80)
}

test: curl http://127.0.0.1/hello

3) parameter router

参数路由以冒号 : 后面跟一个字符串作为参数名称,可以通过 HttpContext的 GetRouterName 方法获取路由参数的值。

package main

import (
    "github.com/devfeel/dotweb"
)

func main() {
    dotapp := dotweb.New()
    dotapp.HttpServer.GET("/hello/:name", func(ctx dotweb.Context) error{
        return ctx.WriteString("hello " + ctx.GetRouterName("name"))
    })
    dotapp.HttpServer.GET("/news/:category/:newsid", func(ctx dotweb.Context) error{
    	category := ctx.GetRouterName("category")
	    newsid := ctx.GetRouterName("newsid")
        return ctx.WriteString("news info: category=" + category + " newsid=" + newsid)
    })
    dotapp.StartServer(80)
}

test: <br>curl http://127.0.0.1/hello/devfeel <br>curl http://127.0.0.1/hello/category1/1

4) group router

    g := server.Group("/user")
	g.GET("/", Index)
	g.GET("/profile", Profile)

test: <br>curl http://127.0.0.1/user <br>curl http://127.0.0.1/user/profile

6. Binder

type UserInfo struct {
		UserName string `form:"user"`
		Sex      int    `form:"sex"`
}

func TestBind(ctx dotweb.HttpContext) error{
        user := new(UserInfo)
        if err := ctx.Bind(user); err != nil {
        	 return ctx.WriteString("err => " + err.Error())
        }else{
             return ctx.WriteString("TestBind " + fmt.Sprint(user))
        }
}

7. Middleware

Middleware

app.Use(NewAccessFmtLog("app"))

func InitRoute(server *dotweb.HttpServer) {
	server.GET("/", Index)
	server.GET("/use", Index).Use(NewAccessFmtLog("Router-use"))

	g := server.Group("/group").Use(NewAccessFmtLog("group"))
	g.GET("/", Index)
	g.GET("/use", Index).Use(NewAccessFmtLog("group-use"))
}

type AccessFmtLog struct {
	dotweb.BaseMiddlware
	Index string
}

func (m *AccessFmtLog) Handle(ctx dotweb.Context) error {
	fmt.Println(time.Now(), "[AccessFmtLog ", m.Index, "] begin request -> ", ctx.Request.RequestURI)
	err := m.Next(ctx)
	fmt.Println(time.Now(), "[AccessFmtLog ", m.Index, "] finish request ", err, " -> ", ctx.Request.RequestURI)
	return err
}

func NewAccessFmtLog(index string) *AccessFmtLog {
	return &AccessFmtLog{Index: index}
}

8. Server Config

HttpServer:

Run Mode

9. Exception

500 error

type ExceptionHandle func(Context, error)

404 error

type NotFoundHandle  func(http.ResponseWriter, *http.Request)

Dependency

websocket - golang.org/x/net/websocket <br> redis - github.com/garyburd/redigo <br> yaml - gopkg.in/yaml.v2

dependency now managed by go mod.

相关项目

<a href="https://github.com/devfeel/longweb" target="_blank">LongWeb</a>

项目简介:http长连接网关服务,提供Websocket及长轮询服务

<a href="https://github.com/yulibaozi/yulibaozi.com" target="_blank">yulibaozi.com</a>

项目简介:基于dotweb与mapper的一款go的博客程序

<a href="https://github.com/lyw1995/Golang-Blog-Server" target="_blank">Golang-Blog-Server</a>

项目简介:基于dotweb的一款go的Blog(博客)服务端

<a href="https://github.com/devfeel/tokenserver" target="_blank">TokenServer</a>

项目简介:token服务,提供token一致性服务以及相关的全局ID生成服务等

<a href="https://github.com/gnuos/wechat-token" target="_blank">Wechat-token</a>

项目简介:微信Access Token中控服务器,用来统一管理各个公众号的access_token,提供统一的接口进行获取和自动刷新Access Token。

<a href="https://github.com/devfeel/dotweb-start" target="_blank">dotweb-start</a>

项目简介:基于dotweb、dotlog、mapper、dottask、cache、database的综合项目模板。

Contact Us

QQ-Group:193409346 - <a target="_blank" href="http://shang.qq.com/wpa/qunwpa?idkey=836e11667837ad674462a4a97fb21fba487cd3dff5b2e1ca0d7ea4c2324b4574"><img border="0" src="http://pub.idqqimg.com/wpa/images/group.png" alt="Golang-Devfeel" title="Golang-Devfeel"></a>

Gitter:Gitter