1.1 gin 是什么?
Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。 它是一个类似于 martini 但拥有更好性能的 API 框架,由于
httprouter,速度提高了近 40 倍。如果你需要极好的性能,使用 Gin 吧。
https://github.com/go-martini/martini
https://github.com/julienschmidt/httprouter
1.2 gin优点?
-
快速
基于 Radix 树的路由,小内存占用。没有反射。可预测的 API 性能。
-
支持中间件
传入的 HTTP 请求可以由一系列中间件和最终操作来处理。例如:Logger,Authorization,GZIP,最终操作
DB。
-
Crash 处理
Gin 可以 catch 一个发生在 HTTP 请求中的 panic 并 recover 它。这样,你的服务器将始终可用。例如,你可
以向 Sentry 报告这个 panic!
-
JSON 验证
Gin 可以解析并验证请求的 JSON,例如检查所需值的存在。
-
路由组
更好地组织路由。是否需要授权,不同的 API 版本…… 此外,这些组可以无限制地嵌套而不会降低性能。
-
错误管理
Gin 提供了一种方便的方法来收集 HTTP 请求期间发生的所有错误。最终,中间件可以将它们写入日志文件,
数据库并通过网络发送。
-
内置渲染
Gin 为 JSON,XML 和 HTML 渲染提供了易于使用的 API。
-
可扩展性
新建一个中间件非常简单。
1.3 gin特性?
Gin v1 稳定的特性:
- 零分配路由。
- 仍然是最快的 http 路由器和框架。
- 完整的单元测试支持。
- 实战考验。
- API 冻结,新版本的发布不会破坏你的代码。
1.4 基准测试
Gin 使用了自定义版本的 HttpRouter。
查看所有基准测试:https://github.com/gin-gonic/gin/blob/master/BENCHMARKS.md
Benchmark name | (1) | (2) | (3) | (4) |
---|---|---|---|---|
BenchmarkGin_GithubAll | 30000 | 48375 | 0 | 0 |
BenchmarkAce_GithubAll | 10000 | 134059 | 13792 | 167 |
BenchmarkBear_GithubAll | 5000 | 534445 | 86448 | 943 |
BenchmarkBeego_GithubAll | 3000 | 592444 | 74705 | 812 |
BenchmarkBone_GithubAll | 200 | 6957308 | 698784 | 8453 |
BenchmarkDenco_GithubAll | 10000 | 158819 | 20224 | 167 |
BenchmarkEcho_GithubAll | 10000 | 154700 | 6496 | 203 |
BenchmarkGocraftWeb_GithubAll | 3000 | 570806 | 131656 | 1686 |
BenchmarkGoji_GithubAll | 2000 | 818034 | 56112 | 334 |
BenchmarkGojiv2_GithubAll | 2000 | 1213973 | 274768 | 3712 |
BenchmarkGoJsonRest_GithubAll | 2000 | 785796 | 134371 | 2737 |
BenchmarkGoRestful_GithubAll | 300 | 5238188 | 689672 | 4519 |
BenchmarkGorillaMux_GithubAll | 100 | 10257726 | 211840 | 2272 |
BenchmarkHttpRouter_GithubAll | 20000 | 105414 | 13792 | 167 |
BenchmarkHttpTreeMux_GithubAll | 10000 | 319934 | 65856 | 671 |
BenchmarkKocha_GithubAll | 10000 | 209442 | 23304 | 843 |
BenchmarkLARS_GithubAll | 20000 | 62565 | 0 | 0 |
BenchmarkMacaron_GithubAll | 2000 | 1161270 | 204194 | 2000 |
BenchmarkMartini_GithubAll | 200 | 9991713 | 226549 | 2325 |
BenchmarkPat_GithubAll | 200 | 5590793 | 1499568 | 27435 |
BenchmarkPossum_GithubAll | 10000 | 319768 | 84448 | 609 |
BenchmarkR2router_GithubAll | 10000 | 305134 | 77328 | 979 |
BenchmarkRivet_GithubAll | 10000 | 132134 | 16272 | 167 |
BenchmarkTango_GithubAll | 3000 | 552754 | 63826 | 1618 |
BenchmarkTigerTonic_GithubAll | 1000 | 1439483 | 239104 | 5374 |
BenchmarkTraffic_GithubAll | 100 | 11383067 | 2659329 | 21848 |
BenchmarkVulcan_GithubAll | 5000 | 394253 | 19894 | 609 |
(1)、在一定的时间内实现的总调用数,越高越好
(2)、单次操作耗时(ns/op),越低越好
(3)、堆内存分配 (B/op), 越低越好
(4)、每次操作的平均内存分配次数(allocs/op),越低越好
1.5 参考
Gin HitHub:https://github.com/gin-gonic/gin/
使用例子:https://github.com/gin-gonic/examples
1.6 用户
使用 Gin web 框架的知名项目:
- gorush:Go 编写的通知推送服务器。
- fnproject:原生容器,云 serverless 平台。
- photoprism:由 Go 和 Google TensorFlow 提供支持的个人照片管理工具。
- krakend:拥有中间件的超高性能 API 网关。
- picfit:Go 编写的图像尺寸调整服务器。
- gotify:使用实时 web socket 做消息收发的简单服务器。
- cds:企业级持续交付和 DevOps 自动化开源平台。