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

2019-09-05 00:59:41 +08:00
 bydmm

大家好,我是橙卡。在这里向大家自荐一下我搭建的 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 的期望吧

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


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

有时间作为命令行试的,个人觉得会比 clone github 好,
singo createapp appname
singo migrate-up xxx
这样才是快速的
dongisking
2019-09-05 10:05:02 +08:00
B 站教学好啊
creanme
2019-09-05 10:06:47 +08:00
支持 bydmm
encro
2019-09-05 10:07:03 +08:00
go 有没有和 Django REST framework 一样的,只要配置,不需要写太多代码的?
skadi
2019-09-05 10:49:25 +08:00
- - 我也做过同样的东西...自己的 blog
gorm 还是有很多问题啊...
holyghost
2019-09-05 10:59:54 +08:00
不喜欢 gorm,所以尝试用注解写了一个自动生成实现的库
https://github.com/liupangzi/gpa
markss
2019-09-05 18:37:42 +08:00
大佬给力。
missdeer
2019-09-06 09:48:20 +08:00
@ww2000e GOPROXY 了解一下,现在对梯子的依赖很小了
bydmm
2019-09-07 13:10:28 +08:00
@encro 一直想找个机会把生成器写了
Aether
2019-09-08 19:47:00 +08:00
不早点发……我自己实现了一遍……=.=

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/598054

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX