2014 在 Go 中構(gòu)建套接字服務(wù)器幾年后,我突然需要為 Javascript 和 Objective-C 客戶端構(gòu)建一些基于 HTTP 的 REST API。擁有 Rails 背景,我對通用 MVC 框架抱有很高的期望。然而,像 Ruby 中的 Sinatra 這樣的框架在簡單 REST 端點(diǎn)的簡單性之間取得了很好的平衡。為此我選擇繼續(xù)使用 Go,因?yàn)樗男阅芎挽o態(tài)類型,我認(rèn)為在不需要在傳統(tǒng) Web 應(yīng)用程序樣式開發(fā)中進(jìn)行大量模板和表單的項(xiàng)目中會長期勝出。 比戈Beego看起來是一個功能齊全的 MVC 框架,可能與 Rails 處于同一級別。它不會試圖變小。它有自己的日志庫、ORM 和 Web 框架。 社區(qū):Beego社區(qū)相當(dāng)大。然而,使用它的大多數(shù)公司似乎都是中國人,所以這個社區(qū)肯定存在語言障礙。由于大型中文站點(diǎn)使用該框架,因此它可能可以擴(kuò)展到大量流量。 最大的特點(diǎn):由于這是一個成熟的 MVC 框架,您不必在網(wǎng)上搜索大量庫。很多問題馬上就消失了,例如要使用什么日志框架以及如何構(gòu)建應(yīng)用程序。這些功能可以在新項(xiàng)目開始時節(jié)省大量時間。 馬提尼Martini受 Sinatra 的啟發(fā),具有非常輕量級框架的感覺。它處理基本的事情,比如路由、異常處理和做中間件的常用方法。最初在 Go 社區(qū)中有一些強(qiáng)烈反對,因?yàn)樗泻芏喾瓷浼夹g(shù)來清除路由中的 API 結(jié)構(gòu)。它可以做很酷的事情,比如根據(jù)類型將不同的數(shù)據(jù)集動態(tài)注入到處理程序中(請參閱最佳功能示例)。這種在 Ruby 框架中很常見的“魔法”在 Go 社區(qū)中引起了很大的轟動。以至于作者正在研究一個更簡單的框架,稱為Negroni。然而,在我看來,它并沒有像馬提尼那樣提供那么多的價值。 社區(qū):盡管是一個小社區(qū),但它似乎仍然非常活躍,大約有 20 個左右的活躍插件,我也有一個可以集成到 GetSentry源中。鑒于框架的口頭禪是小,所以沒有那么多需要添加的東西是有道理的。 最大的特點(diǎn):由于框架使用反射,它可以動態(tài)地將數(shù)據(jù)插入處理函數(shù)中,根據(jù)您的需要,請參見下面的示例。您甚至可以動態(tài)添加新服務(wù)。
大猩猩Gorilla可能是最大和運(yùn)行時間最長的 Gi Web 框架,它是一個模塊化框架,可以為用戶提供盡可能多或盡可能少的資源。例如,在一個項(xiàng)目中,我們只是將 Sessions 包取出并重新用于 Auth。我認(rèn)為 Gorilla 很好,因?yàn)楹芏嘟M件都可以通過直接 社區(qū):Gorilla 可能擁有所有框架中最大的英語社區(qū)。它顯示了 GitHub 上可用的博客文章和中間件的剪切量。 最大的特點(diǎn):我認(rèn)為最近有很多關(guān)于使用 Web 套接字動態(tài)更新Meteor.js 等框架中的應(yīng)用程序的炒作。Gorilla 具有開箱即用的 Web 套接字,因此您可以將與 Web 套接字完全相同的代碼連接到 REST 端點(diǎn),而無需使用像 Pusher 這樣的第三方服務(wù)。 圍棋我真的很想至少簡要地談?wù)?/font>這個框架。我認(rèn)為 net/http 的最大問題之一是無法將上下文傳遞給您的處理程序鏈。因此,您無法在中間件和處理程序之間輕松共享數(shù)據(jù)或事務(wù)。這個框架的目標(biāo)是超級最小化并解決這個問題。讓我給你看幾個簡單的例子 讓我們舉一個典型的例子,其中一些中間件授權(quán)用戶,然后將用戶對象放入會話中。
網(wǎng)絡(luò)/HTTP如果您閱讀 Go 郵件列表,您可能會被告知這是您需要的唯一框架。在某些方面它是真實(shí)的。我們僅使用 net/http 構(gòu)建了一個完整的 XMPP 服務(wù)器,并且運(yùn)行良好。然而,復(fù)雜的 Web 應(yīng)用程序往往需要中間件。有一些有趣的項(xiàng)目,例如interpose,它允許您將來自其他 GO Web 框架的中間件與標(biāo)準(zhǔn) net/http 混合和匹配。 社區(qū)社區(qū)顯然非常大,因?yàn)橛脩艨梢灾赜脕碜栽S多其他項(xiàng)目的位。然而,它的接口非常有限,并且并沒有真正定義任何擴(kuò)展中間件的標(biāo)準(zhǔn)方式。開箱即用的路由非常薄弱,因此您通常使用它的框架。 結(jié)論我們嘗試了幾個這樣的框架來感受一下。我們將 Martini 用于我們的 REST API。雖然我們喜歡它,但我認(rèn)為將來我會嘗試使用 GoCraft,因?yàn)樗p量級,但解決了與 Martini 相同的上下文問題。也許我們會采用一些 Martini 中間件作為實(shí)驗(yàn)。最初我們嘗試將 Gorilla 用于我們的管理系統(tǒng),我認(rèn)為這最終是一個大錯誤。它確實(shí)缺乏 RAILS 是多么固執(zhí)己見,以及許多用于制作真正基本的千篇一律的網(wǎng)絡(luò)應(yīng)用程序的小功能。對于直接基于傳統(tǒng)形式的 CRUD 應(yīng)用程序,我認(rèn)為我們將來會嚴(yán)重傾向于 Beego,因?yàn)樗娴母杏X像是一個完整的 MVC 功能集。 Matthew是一名黑客,他經(jīng)常在紐約和曼谷之間奔波。他為湯森路透編寫了大型 XMPP 服務(wù)器,將 Bloomberg.com 移植到 Ruby on Rails,甚至為 Gucci 從事電子商務(wù)工作。在他的許多合同之間,他經(jīng)營著一家名為 Langfight 的新創(chuàng)業(yè)公司。他經(jīng)營著曼谷 GO Lang Meetup,并發(fā)表了一篇名為 DistributedAgile 的關(guān)于外包的有趣方面的博客。博客上有一本關(guān)于外包的免費(fèi)電子書。你可以在推特上關(guān)注他@kanwisher
通過Flickr Creative Commons 提供的 特色圖片 |
|