分享

对 5 个 Go Web 框架的调查

 一本正经地胡闹 2021-12-03

2014

在 Go 中构建套接字服务器几年后,我突然需要为 Javascript 和 Objective-C 客户端构建一些基于 HTTP 的 REST API。拥有 Rails 背景,我对通用 MVC 框架抱有很高的期望。然而,像 Ruby 中的 Sinatra 这样的框架在简单 REST 端点的简单性之间取得了很好的平衡。为此我选择继续使用 Go,因为它的性能和静态类型,我认为在不需要在传统 Web 应用程序样式开发中进行大量模板和表单的项目中会长期胜出。

比戈

Beego看起来是一个功能齐全的 MVC 框架,可能与 Rails 处于同一级别。它不会试图变小。它有自己的日志库、ORM 和 Web 框架。

社区:

Beego社区相当大。然而,使用它的大多数公司似乎都是中国人,所以这个社区肯定存在语言障碍。由于大型中文站点使用该框架,因此它可能可以扩展到大量流量。

最大的特点:

由于这是一个成熟的 MVC 框架,您不必在网上搜索大量库。很多问题马上就消失了,例如要使用什么日志框架以及如何构建应用程序。这些功能可以在新项目开始时节省大量时间。

马提尼

Martini受 Sinatra 的启发,具有非常轻量级框架的感觉。它处理基本的事情,比如路由、异常处理和做中间件的常用方法。最初在 Go 社区中有一些强烈反对,因为它有很多反射技术来清除路由中的 API 结构。它可以做很酷的事情,比如根据类型将不同的数据集动态注入到处理程序中(请参阅最佳功能示例)。这种在 Ruby 框架中很常见的“魔法”在 Go 社区中引起了很大的轰动。以至于作者正在研究一个更简单的框架,称为Negroni然而,在我看来,它并没有像马提尼那样提供那么多的价值。

社区:

尽管是一个小社区,但它似乎仍然非常活跃,大约有 20 个左右的活跃插件,我也有一个可以集成到 GetSentry源中鉴于框架的口头禅是小,所以没有那么多需要添加的东西是有道理的。

最大的特点:

由于框架使用反射,它可以动态地将数据插入处理函数中,根据您的需要,请参见下面的示例。您甚至可以动态添加新服务

1
2
3
4
5
6
7
8
9
m.Get("/", func(res http.ResponseWriter, req *http.Request) { // res and req are injected by Martini
  res.WriteHeader(200) // HTTP 200
})
m.Get("/", func() {
  // show something
})
m.Get("/", func(c *Context, r render.Render) {
  // show something
})

大猩猩

Gorilla可能是最大和运行时间最长的 Gi Web 框架,它是一个模块化框架,可以为用户提供尽可能多或尽可能少的资源。例如,在一个项目中,我们只是将 Sessions 包取出并重新用于 Auth。我认为 Gorilla 很好,因为很多组件都可以通过直接net/http重用

社区:

Gorilla 可能拥有所有框架中最大的英语社区。它显示了 GitHub 上可用的博客文章和中间件的剪切量。

最大的特点:

我认为最近有很多关于使用 Web 套接字动态更新Meteor.js 等框架中的应用程序的炒作Gorilla 具有开箱即用的 Web 套接字,因此您可以将与 Web 套接字完全相同的代码连接到 REST 端点,而无需使用像 Pusher 这样的第三方服务。

围棋

我真的很想至少简要地谈谈这个框架我认为 net/http 的最大问题之一是无法将上下文传递给您的处理程序链。因此,您无法在中间件和处理程序之间轻松共享数据或事务。这个框架的目标是超级最小化并解决这个问题。让我给你看几个简单的例子

让我们举一个典型的例子,其中一些中间件授权用户,然后将用户对象放入会话中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
router := web.New(YourContext{})
router.Middleware((*YourContext).UserAuthRequired)
router.Put("/users/:id", (*YourContext).UsersUpdate)
func (c *YourContext) UserAuthRequired(rw web.ResponseWriter, r *web.Request, next web.NextMiddlewareFunc) {
    //Auth the user and put the data into the context
    user := userFromSession(r)  // Pretend like this is defined. It reads a session cookie and returns a *User or nil.
    if user != nil {
        c.User = user
        next(rw, r)
    }
}
func (c *YourContext) Root(rw web.ResponseWriter, req *web.Request) {
    if c.User != nil {
        fmt.Fprint(rw, "Hello,", c.User.Name)
    } else {
        fmt.Fprint(rw, "Hello, anonymous person")
    }
}

网络/HTTP

如果您阅读 Go 邮件列表,您可能会被告知这是您需要的唯一框架。在某些方面它是真实的。我们仅使用 net/http 构建了一个完整的 XMPP 服务器,并且运行良好。然而,复杂的 Web 应用程序往往需要中间件。有一些有趣的项目,例如interpose,它允许您将来自其他 GO Web 框架的中间件与标准 net/http 混合和匹配。

社区

社区显然非常大,因为用户可以重用来自许多其他项目的位。然而,它的接口非常有限,并且并没有真正定义任何扩展中间件的标准方式。开箱即用的路由非常薄弱,因此您通常使用它的框架。

结论

我们尝试了几个这样的框架来感受一下。我们将 Martini 用于我们的 REST API。虽然我们喜欢它,但我认为将来我会尝试使用 GoCraft,因为它更轻量级,但解决了与 Martini 相同的上下文问题。也许我们会采用一些 Martini 中间件作为实验。最初我们尝试将 Gorilla 用于我们的管理系统,我认为这最终是一个大错误。它确实缺乏 RAILS 是多么固执己见,以及许多用于制作真正基本的千篇一律的网络应用程序的小功能。对于直接基于传统形式的 CRUD 应用程序,我认为我们将来会严重倾向于 Beego,因为它真的感觉像是一个完整的 MVC 功能集。

Matthew是一名黑客,他经常在纽约和曼谷之间奔波。他为汤森路透编写了大型 XMPP 服务器,将 Bloomberg.com 移植到 Ruby on Rails,甚至为 Gucci 从事电子商务工作。在他的许多合同之间,他经营着一家名为 Langfight 的新创业公司。他经营着曼谷 GO Lang Meetup,并发表了一篇名为 DistributedAgile 的关于外包的有趣方面的博客。博客上有一本关于外包的免费电子书。你可以在推特上关注他@kanwisher

通过Flickr Creative Commons 提供的 特色图片

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多