從頭構(gòu)建 Go Web 框架(一):介紹
時間:2023-05-29 07:45:01 | 來源:網(wǎng)站運營
時間:2023-05-29 07:45:01 來源:網(wǎng)站運營
從頭構(gòu)建 Go Web 框架(一):介紹:本文寫于 2014 年,對于 golang 十幾年的發(fā)展歷程而言,這已經(jīng)是古董級別的一篇文章了,但通用的思想概念依然沒有變。
我希望通過這個系列文章,讓大家都現(xiàn)有的 Go Web 框架能有更深的認(rèn)識。
訪問:原文地址,譯文如下:
Martini 發(fā)布之后,迅速成為了最受大家歡迎的 Go 語言 Web 框架,且現(xiàn)在依舊是如此。但必須指出的是,它不符合常規(guī)習(xí)慣,非常慢,概念也有不足。它教了我們一堆錯誤的做法。但因為它上手容易,許多開發(fā)人員仍在使用。
似乎是存在即合理!
我決定寫一系列文章,基于現(xiàn)有庫從頭編寫組件來構(gòu)建自己的 Web 框架。在開始前,我搜羅和閱讀了市面上絕大部分關(guān)于如何編寫 Go Web 應(yīng)用的資料。我希望,通過系列文章能教授 Go Web 開發(fā)人員一些最佳實踐,同時能提醒老 Go 開發(fā)人員什么才是 Web 開發(fā)的最佳實踐。
注:每個項目都是具有獨特性的,最佳實踐并非適用于所有場景。
概要
本系列不僅能讓你了解 Go 中 Web 開發(fā)的最佳實踐,還會讓你了解其他常見問題的解決方案及如何正確運用。
- 第 1 部分:簡介
- 第 2 部分:Go 中間件:最佳實踐和示例
- 第 3 部分:中間件數(shù)據(jù)共享
- 第 4 部分:第三方路由
- 第 5 部分:使用 MongoDB 實現(xiàn) JSON-API
- 附加福利:上傳文件到 s3
框架該具備什么能力
市面主要有兩種類型的 Web 框架。
一種是內(nèi)置所有功能,類似 Rails 的框架,能幫你快速構(gòu)建與引導(dǎo)項目。Go 中類似框架有:Beego 和 Revel。
另一種,類似于 Sinatra 的框架,提供路由和一些內(nèi)置功能,但不會提供 ORM 等功能。 多數(shù) Go 框架都采用了這種風(fēng)格,如 Martini、Goji、gocraft/web 等。
框架與庫
最近,發(fā)生了一場爭論,主題是,我們究竟是使用框架還是使用庫呢?
首先,我不反對框架,但 Go 有很棒的小包,能幫助我們非常容易地制作出自己的框架。特別是長期項目,自己動手是更明智的選擇。如果你想學(xué)習(xí)圍棋,最好了解一切是如何運作的。
爭論詳情查看以下文章:
- The Case for Go Web Frameworks
- Go, frameworks, and Ludditry
- Frameworks: Necessary for large-scale software
- Framework vs Library
框架功能
我們將專注于后一種類型,因為涵蓋 Beego 或 Revel 中的每個功能將意味著針對該主題編寫一整本書!
框架主要包含 3 個部分,分別是:
- 一是 router,負責(zé)接收 request 并路由到指定 handler;
- 二是 middleware,handler 前后新增的復(fù)用性代碼;
- 三是 handler 處理程序,負責(zé)處理請求并寫入響應(yīng)。
常見的中間件 Middleware:
- error/panic
- logging
- security
- sessions
- cookies
- body parsing
Go Web 框架現(xiàn)狀
現(xiàn)在,許多 Go Web 框架的問題在于,它們的組件僅適用于自身,是不可替換的。
假設(shè)現(xiàn)在有這樣一些小包,只有路由器,或只有中間件系統(tǒng),或者只有中間件,且它們彼此兼容,我們就可以將它們組合使用。 但現(xiàn)實是,這類項目數(shù)量極少,除了 Gorilla 之外,基本沒什么知名度。當(dāng)然,即使是 Gorilla,在 Github 上的追隨者與其他大多數(shù)其他框架,依然少很多。
Go 的 Middleware 系統(tǒng)并沒有統(tǒng)一的約定慣例。與 Ruby (Rack)、Node.js (Connect.js)、Clojure (Ring) 和其他語言不同。 每個框架,如 Negroni、Goji、Gin、gocraft/web 等,都在重新定義自己的中間件工作方式,重用開源中間件變得不可能。
什么才是新開發(fā)人員的最佳實踐?