Faygo 一款最適合開發 API 的 Go Web 框架
Faygo 框架
Faygo 使用全新架構,是最合適開發API接口的Go Web框架。用戶只需定義一個struct Handler,就能自動綁定、驗證請求參數并生成在線API文檔。
faygo index
faygo apidoc
faygo server
安裝要求
Go Version ≥1.8
快速使用
- 方式一 源碼下載
go get -u -v github.com/henrylee2cn/faygo
- 方式二 部署工具 ( Go to fay )
go get -u -v github.com/henrylee2cn/fay
fay command [arguments]
The commands are:
new 創建、編譯和運行(監控文件變化)一個新的faygo項目
run 編譯和運行(監控文件變化)任意一個已存在的golang項目
fay new appname [apptpl]
appname 指定新faygo項目的創建目錄
apptpl 指定一個faygo項目模板(可選)
fay run [appname]
appname 指定待運行的golang項目路徑(可選)</code></pre>
框架特性
-
一個 struct Handler 搞定多件事:
- 定義 Handler/Middleware
- 綁定與驗證請求參數
- 生成 Swagger2.0 API 在線文檔
- 數據庫 ORM 映射
</li>
-
Handler與Middleware完全相同,都是實現Handler接口( func 或 struct 類型),共同構成路由操作鏈,只是概念層面的說法不同
- 支持多種網絡類型:
</ul>
網絡類型
配置 net_types 值
HTTP
http
HTTPS/HTTP2(TLS)
https
HTTPS/HTTP2(Let's Encrypt TLS)
letsencrypt
HTTPS/HTTP2(Let's Encrypt TLS on UNIX socket)
unix_letsencrypt
HTTP(UNIX socket)
unix_http
HTTPS/HTTP2(TLS on UNIX socket)
unix_https
- 支持單服務單監聽、單服務多監聽、多服務多監聽等,多個服務的配置信息相互獨立
- 基于 httprouter 開發高性能路由,支持鏈式與樹形兩種注冊風格,支持靈活的靜態文件路由(如DirFS、RenderFS、MarkdownFS等)
- 支持平滑關閉、平滑升級,提供fay工具進行新建項目、熱編譯、元編程
- 采用最強大的 pongo2 作為HTML渲染引擎
- 提供近似LRU的文件緩存功能,主要用途是靜態文件緩存
- 跨平臺的彩色日志系統,且同時支持console和file兩種輸出形式(可以同時使用)
- 提供Session管理功能
- 支持Gzip全局配置
- 提供XSRF跨站請求偽造安全過濾
- 大多數功能盡量使用簡潔的ini進行配置來避免不必要的重新編譯,并且這些配置文件支持自動補填默認值
- 提供 gorm 、 xorm 、 sqlx 、 directSQL 、 Websocket 、 ini 、 http client 等很多常用擴展包

faygo struct handler 多重用途合一
簡單示例
package main
import (
// "mime/multipart"
"time"
"github.com/henrylee2cn/faygo"
)
type Index struct {
Id int param:"<in:path> <required> <desc:ID> <range: 0:10>"
Title string param:"<in:query> <nonzero>"
Paragraph []string param:"<in:query> <name:p> <len: 1:10> <regexp: ^[\\w]*$>"
Cookie string param:"<in:cookie> <name:faygoID>"
// Picture *multipart.FileHeader param:"<in:formData> <name:pic> <maxmb:30>"
}
func (i Index) Serve(ctx faygo.Context) error {
if ctx.CookieParam("faygoID") == "" {
ctx.SetCookie("faygoID", time.Now().String())
}
return ctx.JSON(200, i)
}
func main() {
app := faygo.New("myapp", "0.1")
// Register the route in a chain style
app.GET("/index/:id", new(Index))
// Register the route in a tree style
// app.Route(
// app.NewGET("/index/:id", new(Index)),
// )
// Start the service
faygo.Run()
}
/
http GET:
http://localhost:8080/index/1?title=test&p=abc&p=xyz
response:
{
"Id": 1,
"Title": "test",
"Paragraph": [
"abc",
"xyz"
],
"Cookie": "2016-11-13 01:14:40.9038005 +0800 CST"
}/</code></pre>
操作和中間件
操作和中間件是相同的,都是實現了Handler接口!
- 函數類型
// 不含API文檔描述
func Page() faygo.HandlerFunc {
return func(ctx *faygo.Context) error {
return ctx.String(200, "faygo")
}
}
// 含API文檔描述
var Page2 = faygo.WrapDoc(Page(), "測試頁2的注意事項", "文本")</code></pre>
- 結構體類型
// Param操作通過Tag綁定并驗證請求參數
type Param struct {
Id int param:"<in:path> <required> <desc:ID> <range: 0:10>"
Title string param:"<in:query>"
}
// Serve實現Handler接口
func (p Param) Serve(ctx faygo.Context) error {
return ctx.JSON(200,
faygo.Map{
"Struct Params": p,
"Additional Param": ctx.PathParam("additional"),
}, true)
}
// Doc實現API文檔接口(可選)
func (p Param) Doc() faygo.Doc {
return faygo.Doc{
// 向API文檔聲明接口注意事項
Note: "param desc",
// 向API文檔聲明響應內容格式
Return: faygo.JSONMsg{
Code: 1,
Info: "success",
},
// 向API文檔增加額外的請求參數聲明(可選)
Params: []faygo.ParamInfo{
{
Name: "additional",
In: "path",
Model: "a",
Desc: "defined by the Doc()
method",
},
},
}
}</code></pre>
過濾函數
過濾函數必須是HandlerFunc類型!
func Root2Index(ctx
faygo.Context) error {
// 不允許直接訪問/index
if ctx.Path() == "/index" {
ctx.Stop()
return nil
}
if ctx.Path() == "/" {
ctx.ModifyPath("/index")
}
return nil
}</code></pre>
路由注冊
- 樹狀
// 新建應用服務,參數:名稱、版本
var app1 = faygo.New("myapp1", "1.0")
// 路由
app1.Filter(Root2Index).
Route(
app1.NewNamedGET("測試頁1", "/page", Page()),
app1.NewNamedGET("測試頁2", "/page2", Page2),
app1.NewGroup("home",
app1.NewNamedGET("test param", "/param", &Param{
// 為綁定的參數設定API文檔中缺省值(可選)
Id: 1,
Title: "test param",
}),
),
)</code></pre>
- 鏈狀
// 新建應用服務,參數:名稱、版本
var app2 = faygo.New("myapp2", "1.0")
// 路由
app2.Filter(Root2Index)
app2.NamedGET("test page", "/page", Page())
app2.NamedGET("test page2", "/page2", Page2)
app2.Group("home")
{
app2.NamedGET("test param", "/param", &Param{
// 為綁定的參數設定API文檔中缺省值(可選)
Id: 1,
Title: "test param",
})
}</code></pre>
平滑關閉與重啟
- 平滑關閉
kill [pid]
- 平滑重啟
kill -USR2 [pid]
擴展包
擴展包
導入路徑
各種條碼
github.com/henrylee2cn/faygo/ext/barcode
比特單位
github.com/henrylee2cn/faygo/ext/bitconv
gorm數據庫引擎
github.com/henrylee2cn/faygo/ext/db/gorm
sqlx數據庫引擎
github.com/henrylee2cn/faygo/ext/db/sqlx
xorm數據庫引擎
github.com/henrylee2cn/faygo/ext/db/xorm
directSQL(配置化SQL引擎)
github.com/henrylee2cn/faygo/ext/db/directsql
口令算法
github.com/henrylee2cn/faygo/ext/otp
UUID
github.com/henrylee2cn/faygo/ext/uuid
Websocket
github.com/henrylee2cn/faygo/ext/websocket
ini配置
github.com/henrylee2cn/faygo/ini
定時器
github.com/henrylee2cn/faygo/ext/cron
任務工具
github.com/henrylee2cn/faygo/ext/task
HTTP客戶端
github.com/henrylee2cn/faygo/ext/surfer
開源協議
Faygo 項目采用商業應用友好的 Apache2.0 協議發布。
來自:http://www.jianshu.com/p/f40b65ccf7a5