美文网首页golangFaygo框架Go网络编程
Faygo一款最适合开发API的 Go Web 框架

Faygo一款最适合开发API的 Go Web 框架

作者: Andeya | 来源:发表于2017-02-26 17:53 被阅读14192次

    Faygo 框架

    Faygo 使用全新架构,是最合适开发API接口的Go Web框架。用户只需定义一个struct Handler,就能自动绑定、验证请求参数并生成在线API文档。

    Faygo项目源码

    查看《用户手册》

    官方QQ群:Go-Web 编程 42730308

    faygo indexfaygo index faygo apidocfaygo apidoc faygo serverfaygo server

    安装要求

    Go Version ≥1.8

    快速使用

    • 方式一 源码下载
    go get -u -v github.com/henrylee2cn/faygo
    
    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项目路径(可选)
    

    框架特性

    • 一个 struct Handler 搞定多件事:
    • 定义 Handler/Middleware
    • 绑定与验证请求参数
    • 生成 Swagger2.0 API 在线文档
    • 数据库 ORM 映射
    • Handler与Middleware完全相同,都是实现Handler接口(funcstruct类型),共同构成路由操作链,只是概念层面的说法不同
    • 支持多种网络类型:
    网络类型 配置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进行配置来避免不必要的重新编译,并且这些配置文件支持自动补填默认值
    • 提供 gormxormsqlxdirectSQLWebsocketinihttp client 等很多常用扩展包
    faygo struct handler 多重用途合一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"
        }
    */
    

    示例库

    操作和中间件

    操作和中间件是相同的,都是实现了Handler接口!

    • 函数类型
    // 不含API文档描述
    func Page() faygo.HandlerFunc {
        return func(ctx *faygo.Context) error {
            return ctx.String(200, "faygo")
        }
    }
    
    // 含API文档描述
    var Page2 = faygo.WrapDoc(Page(), "测试页2的注意事项", "文本")
    
    • 结构体类型
    // 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",
                },
            },
        }
    }
    

    过滤函数

    过滤函数必须是HandlerFunc类型!

    func Root2Index(ctx *faygo.Context) error {
        // 不允许直接访问`/index`
        if ctx.Path() == "/index" {
            ctx.Stop()
            return nil
        }
        if ctx.Path() == "/" {
            ctx.ModifyPath("/index")
        }
        return nil
    }
    

    路由注册

    • 树状
    // 新建应用服务,参数:名称、版本
    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",
                }),
            ),
        )
    
    • 链状
    // 新建应用服务,参数:名称、版本
    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",
        })
    }
    

    平滑关闭与重启

    • 平滑关闭
    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 协议发布。

    相关文章

      网友评论

      • 803284b34c18:不错不错,收藏了。

        推荐下,分布式作业中间件 Elastic-Job 源码解析 16 篇:http://t.cn/R05mBNd


        12a033ef755a:写的不错,谢谢博主;已收藏~
      • 逸舟科技:希望后续可以把模版页面和静态资源分离开来,放在一个文件夹感觉怪乱的,配置设计感觉很不错
        Andeya:感谢你的评论。Faygo只设置了./static作为默认静态资源目录,但是用户可以修改此默认路径。另外,模板页面并未做任何指定,完全由用户自己决定的。
      • 开发者头条_程序员必装的App:感谢分享!已推荐到《开发者头条》:https://toutiao.io/posts/bnjak3 欢迎点赞支持!
        欢迎订阅《Go语言开发者》https://toutiao.io/subjects/213961
      • Andeya:Faygo 用户只需定义一个struct Handler,就能自动绑定、验证请求参数并生成在线API文档。因此,Faygo非常合适开发API接口。这在众Go Web框架之中实属首个,值得关注!

      本文标题:Faygo一款最适合开发API的 Go Web 框架

      本文链接:https://www.haomeiwen.com/subject/lizowttx.html