[Singo 诞生记] Gin+Gorm Golang API 快速开发脚手架搭建心路历程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
bydmm
V2EX    分享创造

[Singo 诞生记] Gin+Gorm Golang API 快速开发脚手架搭建心路历程

  •  
  •   bydmm
    bydmm 2019-09-05 00:59:41 +08:00 10622 次点击
    这是一个创建于 2254 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,我是橙卡。在这里向大家自荐一下我搭建的 Gin+Gorm Golang API 快速开发脚手架

    Singo: https://github.com/bydmm/singo


    在描述框架之前,请允许我介绍一下项目的选型历程。

    因为看好 Golang 我一年前找了一份全职写 Go 后台的工作。入职之后,因为是比较独立的项目,老大要求我自己找一个 Golang 写 Web API 的方案,于是我就开始了各种方案考察。另外这个项目是比较独立的项目,后端资源有限(其实就我一个人),于是也不考虑微服务这种方向。

    稍作搜索后就能发现,Beego 可以说是比较流行的 Go 服务开发框架了,然后就开始了研究。在观察了一小段时间之后,我就发现 Beego 是那种相对比较传统的 MVC 架构。对于我这种从 Rails 到 Django 一路写过来的 MVC 老油条来说,这种大而全的 MVC 框架的短板比较明显,而且在 9012 年也确实也显得的老土。

    传统 MVC 架构,过于着墨于渲染 HTML 网页,但是现在新开发的应用,稍微有点能力的公司都是完全前后端分离的,我马上需要开发的项目也是这样。当你不使用 MVC 的渲染模板功能之后,你就会感觉那些多余的功能单纯在浪费内存的空间以及消耗毫无必要的性能。可以说,Ruby On Rails 就是在这样的潮流下迅速没落的。

    于是我很快就放弃 Beego,然后去寻找下一个方案,那就是 Routing + ORM 这种模式。

    在我写 Go 之前,其实已经有很长一段时间使用 Strina/Express/Flask + ORM 的开发模式。由于我之前有过上述三个框架的实际工作经验,所以总的来说还是即使是对 Go 还没有那么熟悉,但是总的套路我还是比较有把握的。 很快 Gin + ORM 就进入到我的视线中。

    首先聊聊 Gin。

    其实 Gin 在 Golang 众多的 Routing 框架里面,并不算特别突出。不过他还算详尽的文档,不少人使用过的历史经验积累(也就是可以 google), 以及更为重要的是他的各种中间件阵容确实比其他一些框架来的丰富( https://github.com/gin-gonic/contrib)。比如 Gin 的 Session,jwt,限流,还有和 sentry 的整合,或者日志中间件都比较不错。虽然有一些 star 不算多,但是因为都挺简单,拿来抄抄改改都不算难。而且这些中间件你可以很方便的自行选择拼装到你得框架中,也不会很浪费资源。

    至于 Gorm,对于一个用过 Rails ORM 的人来说,显然只能给个及格。不过考虑到 Go 语言极简设计的实际情况,你根本不可能找到一个能和 Rails 的 ActiveRecord 对抗的 ORM 框架,所以也就没必要太纠结了。

    经过一段时间的折腾后,于是就诞生了这个 Singo 框架: https://github.com/bydmm/singo。这个框架已经在我实际工作中被使用,然后已经上线生产了两个项目。

    一个项目是为某知名项目每天下发数百万到数千万次配置,这个项目的压力端功能确实相当简单,但是其μ秒级的响应也是非常惊艳的。这个项目还有运营和产品使用的后台服务,用来配置这些配置,那个项目也是 Singo 提供的后端服务,虽然压力很小,但是项目的业务也复杂的多,在这里我坚定了 Gin+GORM 无论在性能上,还是开发效率上都是没有问题的。

    另一个项目相对流量较小,峰值日活也才刚超过百万,不过整体业务的压力分布则均衡的多,不会和配置下发一样旱的旱死涝的涝的死。这个项目就一个比较标准的 CRUD 项目,没什么特别可以说的。不过某日仅用 6 个虚拟核就抗住了近 10 万 /分钟的请求洪峰(那天真的是见鬼了),也让我见识了一下 Golang 的真实威力。不过这个业务也没非常长的交易流程这样的场景,都是比较简单和单纯的 CRUD 流程。

    那么现在看来,至少 Singo 在平时大家最常见的 CRUD 场景,比如论坛,小说站,新闻站,视频站,或者类似的资讯发布站点,基本上是可以发挥出 Golang 的真实威力的。

    最后提一下 Singo 的基本要素:

    1. Gin 路由服务
    2. Gorm ORM 工具
    3. Mysql 数据库
    4. Redis 缓存
    5. Cors 跨域
    6. godotenv 使用.env 文件管理项目环境变量

    最后提一下 Singo 框架的另一个特色:

    也许是感觉自己在技术上不可能为人类挖掘出什么新的疆域,但是又不满足于一辈子碌碌无为。

    所以最近在录制 Golang 编程实况教学视频,如果能帮到一些新来的小朋友们入行,那也是算是在在自己的人生里产生了些许的价值吧。

    地址:

    让我们写个 G 站吧! Golang 全栈编程实况

    如果你有其他后端经验,想拿着 Gin + Gorm 开始撸代码,你可以直接快速的扫一下这两集,应该对你快速入门会有一些帮助。

    1. 基础架构搭建: https://www.bilibili.com/video/av56462267
    2. 一套 CRUD 接口编写 https://www.bilibili.com/video/av56582832

    最后祝愿 Golang 在中国发展的越来越好,也不辜负我专门转阵营到 Golang 的期望吧

    25 条回复    2020-04-13 23:33:35 +08:00
    jamesyangget
        1
    jamesyangget  
       2019-09-05 01:06:09 +08:00 via Android
    双手双脚支持
    wsseo
        2
    wsseo  
       2019-09-05 02:22:55 +08:00
    能不能出一期视频讲 go module wiki
    ww2000e
        3
    ww2000e  
       2019-09-05 06:38:39 +08:00 via Android
    有点动摇用 go 了,梯子不稳定
    iBenlim
        4
    iBenlim  
       2019-09-05 07:01:53 +08:00 via Android
    大佬的视频早就看了非常棒!加油!
    PopeyeLau
        5
    PopeyeLau  
       2019-09-05 08:12:03 +08:00 via iPhone
    支持,B 站看用,收很多。
    JRay
        6
    JRay  
       2019-09-05 09:11:29 +08:00
    试试看
    cmdOptionKana
        7
    cmdOptionKana  
       2019-09-05 09:19:37 +08:00   1
    upper.io/db.v3, 最近发现这个 ORM 非常好用,我以前用 gorm 的,现在转过去用 upper 了。
    encro
        8
    encro  
       2019-09-05 09:43:40 +08:00
    @wsseo
    go module 只是用的话很简单,
    实际动手写一个项目马上就会。


    猜测作者是 B 站员工?
    iyour
        9
    iyour  
       2019-09-05 09:47:32 +08:00
    看过视频 大佬讲得很是生动,非常支持。
    leer
        10
    leer  
       2019-09-05 09:58:38 +08:00
    看过,在群,爱了。
    encro
        11
    encro  
       2019-09-05 10:03:30 +08:00   1
    非常浅显易懂,

    有时间作为命令行试的,个人觉得会比 clone github 好,
    singo createapp appname
    singo migrate-up xxx
    这样才是快速的
    dongiskig
        12
    dongisking  
       2019-09-05 10:05:02 +08:00
    B 站教学好啊
    creanme
        13
    creanme  
       2019-09-05 10:06:47 +08:00
    支持 bydmm
    encro
        14
    encro  
       2019-09-05 10:07:03 +08:00
    go 有没有和 Django REST framework 一样的,只要配置,不需要写太多代码的?
    skadi
        15
    skadi  
       2019-09-05 10:49:25 +08:00
    - - 我也做过同样的东西...自己的 blog
    gorm 还是有很多问题啊...
    holyghost
        16
    holyghost  
       2019-09-05 10:59:54 +08:00
    不喜欢 gorm,所以尝试用注解写了一个自动生成实现的库
    https://github.com/liupangzi/gpa
    markss
        17
    markss  
       2019-09-05 18:37:42 +08:00
    大佬给力。
    missdeer
        18
    missdeer  
       2019-09-06 09:48:20 +08:00
    @ww2000e GOPROXY 了解一下,现在对梯子的依赖很小了
    bydmm
        19
    bydmm  
    OP
       2019-09-07 13:10:28 +08:00
    @encro 一直想找个机会把生成器写了
    Aether
        20
    Aether  
       2019-09-08 19:47:00 +08:00
    不早点发……我自己实现了一遍……=.=
    bydmm
        21
    bydmm  
    OP
       2019-09-08 20:30:40 +08:00
    @Aether 哈哈哈哈哈。
    xulolololololo
        22
    xulolololololo  
       2019-09-12 09:37:30 +08:00
    还在 py 阵营,公司的服务器内存占用越来越大,还是想折腾去弄 py 异步协程方向
    skipwitit
        23
    skipwitit  
       2019-12-25 09:33:05 +08:00
    学习学习了
    awesomeMen
        24
    awesomeMen  
       2020-01-10 15:01:44 +08:00
    卡子哥,我知道是你
    justin2018
        25
    justin2018  
       2020-04-13 23:33:35 +08:00
    收藏了~~~~~~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4697 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 01:07 PVG 09:07 LAX 17:07 JFK 20:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86