[Preview] 当前持续完善中,不可生产中使用 [Preview]
GoFast Micro-Service Framework
GoFast是一个用Go语言实现的微服务开发框架。他的产生源于目前流行的gin、go-zero、fastify等众多开源框架;同时结合了作者多年的开发实践经验,很多模块的实现方式都是作者首创;当然也免不了不断借鉴社区中优秀的设计理念。我们的目标是简洁高效易上手,在封装大量特性的同时又不失灵活性。希望你能喜欢GoFast。
更多了解:GoFast的实现细节
GoFast的微服务:虽然也提供现成的微服务治理能力,但我们想强调的是,GoFast更专注于帮助框架使用者清晰的开发业务逻辑。大型项目上框架应该弱化微服务治理,将这一部分特性交给istio处理。
Installation
To install GoFast package, you need to install Go and set your Go workspace first.
The first need Go installed (version 1.15+ is required), then you can use the below Go command to install GoFast.
1
|
$ go get -u github.com/qinchende/gofast
|
Quick start
1
2
|
# assume the following codes in example.go file
$ cat example.go
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
package main
import (
"fmt"
"github.com/qinchende/gofast/fst"
"github.com/qinchende/gofast/fstx"
"log"
"net/http"
"time"
)
var handler = func(str string) func(c *fst.Context) {
return func(c *fst.Context) {
log.Println(str)
}
}
var handlerRender = func(str string) func(c *fst.Context) {
return func(c *fst.Context) {
log.Println(str)
c.JSON(200, fst.KV{"data": str})
}
}
func main() {
app := fst.CreateServer(&fst.AppConfig{
PrintRouteTrees: true,
HandleMethodNotAllowed: true,
RunMode: "debug",
FitMaxReqCount: 1,
FitMaxReqContentLen: 10 * 1024,
})
// 拦截器,微服务治理 ++++++++++++++++++++++++++++++++++++++
app.RegFits(fstx.AddDefaultFits)
app.Fit(func(w *fst.GFResponse, r *http.Request) {
log.Println("app fit before 1")
w.NextFit(r)
log.Println("app fit after 1")
})
// 根路由
app.NoRoute(func(ctx *fst.Context) {
ctx.JSON(http.StatusNotFound, "404-Can't find the path.")
})
app.NoMethod(func(ctx *fst.Context) {
ctx.JSON(http.StatusMethodNotAllowed, "405-Method not allowed.")
})
// ++ (用这种方法可以模拟中间件需要上下文变量的场景)
app.Before(func(ctx *fst.Context) {
ctx.Set("nowTime", time.Now())
time.Sleep(3 * time.Second)
})
app.After(func(ctx *fst.Context) {
// 处理后获取消耗时间
val, exist := ctx.Get("nowTime")
if exist {
costTime := time.Since(val.(time.Time)) / time.Millisecond
fmt.Printf("The request cost %dms", costTime)
}
})
// ++ end
app.Post("/root", handler("root"))
app.Before(handler("before root")).After(handler("after root"))
// 分组路由1
adm := app.AddGroup("/admin")
adm.After(handler("after group admin")).Before(handler("before group admin"))
tst := adm.Get("/chende", handlerRender("handle chende"))
// 添加路由处理事件
tst.Before(handler("before tst_url"))
tst.After(handler("after tst_url"))
tst.PreSend(handler("preSend tst_url"))
tst.AfterSend(handler("afterSend tst_url"))
// 分组路由2
adm2 := app.AddGroup("/admin2").Before(handler("before admin2"))
adm2.Get("/zht", handler("zht")).After(handler("after zht"))
adm22 := adm2.AddGroup("/group2").Before(handler("before group2"))
adm22.Get("/lmx", handler("lmx")).Before(handler("before lmx"))
// 应用级事件
app.OnReady(func(fast *fst.GoFast) {
log.Println("App OnReady Call.")
log.Printf("Listening and serving HTTP on %s\n", "127.0.0.1:8099")
})
app.OnClose(func(fast *fst.GoFast) {
log.Println("App OnClose Call.")
})
// 开始监听接收请求
_ = app.Listen("127.0.0.1:8099")
}
|
1
2
|
# run example.go and visit website 127.0.0.1:8099 on browser
$ go run example.go
|
在控制台启动后台Web服务器之后,你会看到底层的路由树构造结果:
[GoFast-debug] POST /root --> main.glob..func1.1 (1 handlers)
[GoFast-debug] GET /admin/chende --> main.glob..func2.1 (1 handlers)
[GoFast-debug] GET /admin2/zht --> main.glob..func1.1 (1 handlers)
[GoFast-debug] GET /admin2/group2/lmx --> main.glob..func1.1 (1 handlers)
++++++++++The route tree:
(GET)
└── /admin [false-/2]
├── /chende [true-]
└── 2/ [false-zg]
├── zht [true-]
└── group2/lmx [true-]
(POST)
└── /root [true-]
++++++++++THE END.
2021/02/20 02:56:00 App OnReady Call.
2021/02/20 02:56:00 Listening and serving HTTP on 127.0.0.1:8099
浏览器输入网址访问地址:127.0.0.1:8099/admin/chende
,日志会输出:
2021/02/20 02:57:17 app fit before 1
2021/02/20 02:57:20 before root
2021/02/20 02:57:20 before group admin
2021/02/20 02:57:20 before tst_url
2021/02/20 02:57:20 handle chende
2021/02/20 02:57:20 preSend tst_url
2021/02/20 02:57:20 afterSend tst_url
2021/02/20 02:57:20 after tst_url
2021/02/20 02:57:20 after group admin
2021/02/20 02:57:20 after root
2021/02/20 02:57:20 app fit after 1
The request cost 3000ms
[GET] /admin/chende (127.0.0.1/02-20 02:57:20) 200/24 [3000]
B: C:
P:
R:
E:
Core feature
Like gin feature
GoFast目前复用了Gin的很多特性,除特别说明之外,使用方式一样。
Server Handlers
应用启动之后,在开始监听端口之后调用OnReady事件,应用关闭退出之前调用OnClose事件
1
2
3
4
5
6
7
8
9
|
app.OnReady(func(fast *fst.GoFast) {
log.Println("App OnReady Call.")
log.Printf("Listening and serving HTTP on %s\n", "127.0.0.1:8099")
})
app.OnClose(func(fast *fst.GoFast) {
log.Println("App OnClose Call.")
})
|
Router Handlers
分组或路由项事件是一样的,现在支持下面四个,以后慢慢扩展和调整
1
2
3
4
|
tst.Before(handler("before tst_url"))
tst.After(handler("after tst_url"))
tst.PreSend(handler("preSend tst_url"))
tst.AfterSend(handler("afterSend tst_url"))
|
benchmark
License
This project is licensed under the terms of the MIT license.
(其它介绍陆续补充…)