golang 数据库框架
我已经将Go投入生产已经有一段时间了,非常享受它的快速和可靠。 较小的构建体大小,go例程提供的并发性以及您可以直接在机器上运行构建体的事实使Golang变得非常可爱。
标准软件包的性能如此之好,以至于您可以创建可用于生产环境的微服务,而无需任何外部库或框架。 但这并不意味着Go中没有提供更大灵活性或更快速度的框架,它们根本不是首选。
如果您向Go开发人员询问可以使用哪些Web框架或库,通常的答案是坚持使用标准库。 具有讽刺意味的是,“ golang框架”在google中的搜索结果最高是关于为什么不应该使用它们的原因。
有关HN上Go框架的问题的最高评论
我对标准库的替代方案进行了一些研究,以了解它们的性能并对其进行基准测试。 我将它们归类为微服务的基本组成部分。
所有基准测试均在以下配置上执行。 尽管标准基准时间仅为1s ,但我将所有测试运行了10s以使每个测试的周期保持一致。
Processor - 2.7 GHz Intel Core i7
RAM - 16GB - 16 GB 2133 MHz LPDDR3
OS - MacOS High Sierra
go version - go1.11.1
Bench Time 10s instead of standard 1s
go test -bench=. -benchtime=10s
路由
标准的http Go服务器提供了一个不错的路由器,该路由器可以读取查询参数,但无法读取命名参数,例如,
/students/:studentID/grades/:gradeID
任何具有上述嵌套资源的REST服务都必须已经使用外部路由库来解析它们。 杜松子酒,回音,比戈,大猩猩混蛋,枸杞是一些受欢迎的食物(根据他们的Github追随者)。 其中一些是功能完善的中间件框架,该框架也可以进行路由,而另一些只是路由库。
我针对这些库针对单个命名参数运行了基准测试,以下是结果。 Gin拥有最快的路由器,其次是Echo。
JSON序列化和反序列化
一旦API请求通过路由器命中并传递到控制器或处理程序,下一步就是在返回响应的同时对请求JSON或Encode进行解码。
Go有一个非常不错的encoding包,它支持json, XML, csv等多种格式,但是快速浏览一下替代方案就会发现大量的库。 我根据标准的encoding/json包对Jsoniter,EasyJson进行了基准测试,结果如下。
以下是编码结果,结果表明性能差异不明显。
但是对于解码JSON, jsoniter执行速度比标准编码包快5倍。
现在,如果您的请求已解码,则下一步可能是应用您的业务逻辑,并且可能需要执行一些数据库操作。
ORM与否?
大多数流行语言都依赖于框架来构建与数据库交互的微服务。 在Java世界中处于Hibernate状态,Active Record for Rails和Django ORM非常流行。 ORM的(对象关系映射器)有时有助于更好地处理事务,表之间的关系,并有助于避免编写用于简单联接的复杂SQL。
但是Go又有了一个非常好的database标准库,这使连接到关系数据库变得非常容易,而且速度也非常快。 但是,一个痛点是查询。 查询某些行时,必须手动映射行中的每个字段,然后将它们分配给struct 。 这可行,但很快就会变得混乱,使您编写很多代码。 sqlx是一个库,它使您可以将整行扫描到struct变量中。
尽管sqlx减少了编写用于构建CRUD的典型行数,但您仍然会多次写重复代码。 使用ORM可以减少它,并专注于您的业务逻辑。
我对database, database + sqlx, gorm , go-pg基准测试database, database + sqlx, gorm , go-pg用于查询,下面是结果。 出人意料的是, go-pg ,一个ORM进行比标准包快,甚至sqlx 。 GORM虽然在生态系统中非常有名,却相对较慢。
从Postgres DB查询20万条记录
在API调用的每个步骤中,都有更好的框架或外部库,这些框架或外部库将使您的响应速度更快,并提供一定的灵活性。
注意事项
尽管在速度上有一些改进是显而易见的,但仅此一个原因不应成为脱离标准库的原因。 应该考虑诸如测试代码的难易程度,对开源库的长期维护,对团队的学习曲线之类的事情。
尽管如此,我认为诸如echo + jsoniter + go-pg以及Go标准库的所有echo + jsoniter + go-pg功能将是构建微服务并避免冗余代码的最快方法。
请随时分享您对Go库的想法和经验。
翻译自: https://hackernoon.com/the-myth-about-golang-frameworks-and-external-libraries-93cb4b7da50f
golang 数据库框架