go語言幾個最快最好運用最廣的web框架比較(大多數人不瞭解的特性)
令人敬畏的Web框架
如果你為自己設計一個小應用程式,你可能不需要一個Web框架,但如果你正在進行生產,那麼你肯定需要一個,一個好的應用程式。
雖然您認為自己擁有必要的知識和經驗,但您是否願意自行編寫所有這些功能的程式碼?
您是否有時間找到生產級外部包來完成這項工作? 您確定這將與您應用的其餘部分保持一致嗎?
這些是推動我們使用框架的原因,如果其他人已經做了這些繁瑣且艱苦的工作,我們不想自己編寫所有必要的功能。
介紹
ofollow,noindex">Go 是一種快速增長的開源程式語言,旨在構建簡單,快速,可靠的軟體。 看看哪些 偉大的公司 使用Go來為他們的服務提供支援。
本文提供了所有必要的資訊,以幫助開發人員瞭解有關使用Go開發Web應用程式的最佳選項的更多資訊。
本文包含了最詳細的框架比較,通過從儘可能多的角度比較最知名的Web框架:流行度,支援和內建功能:
Beego:Go程式語言的開源,高效能Web框架。
- beego" target="_blank" rel="nofollow,noindex">https://github.com/astaxie/beego
- https://beego.me
Buffalo:快速Web開發w/Go。
Echo:高效能,極簡主義的Go Web框架。
Gin:用Go(Golang)編寫的HTTP Web框架。它具有類似Martini的API,具有更好的效能。
Iris:Go in the Universe中最快的Web框架。MVC功能齊全。今天擁抱未來。
Revel:Go語言的高生產力,全棧Web框架。
聲望
人氣排序(星級)
框架名稱 | 當前版本 | Watch | Stars | Forks | Issues Open | Issues Close | 框架誕生日 | 最近更新 | 作者 |
---|---|---|---|---|---|---|---|---|---|
beego | stable v1.10.0 | 1159 | 16762 | 3557 | 544 | 1667 | 2012 | 2018年7月31日 GMT+8 下午9:18 | @astaxie |
buffalo | stable 0.12.6 | 125 | 3317 | 259 | 51 | 508 | 2014 | 2018年8月15日 GMT+8 上午5:26 | @markbates |
Echo | stable 3.1 | 513 | 11474 | 1010 | 108 | 665 | 2015 | 2018年8月29日 GMT+8 上午11:49 | @vishr |
Gin | stable v1.stable | 915 | 20122 | 2377 | 126 | 805 | 2014 | 2018年9月1日 GMT+8 上午4:38 | @manucorporat |
Iris | stable v11 | 569 | 11604 | 1177 | 10 | 888 | 2016 | 2018年9月2日 GMT+8 上午12:27 | @kataras |
Revel | stable 0.19.0 | 546 | 10208 | 1260 | 63 | 769 | 2011 | 2018年7月13日 GMT+8 上午3:43 | @robfig |
學習曲線
框架名稱 | 示例 | 示例參考 | 實時支援 |
---|---|---|---|
beego | 49 | https://beego.me/docs | |
buffalo | 6 | https://gobuffalo.io/docs/installation | slack |
Echo | 20 | https://echo.labstack.com/cookbook/hello-world | |
Gin | 15 | https://github.com/gin-gonic/gin/tree/master/examples | gitter |
Iris | 92 | https://github.com/kataras/iris/tree/master/_examples | rocket chat |
Revel | 6 | http://revel.github.io/examples/index.html | gitter |
這裡的astaxie和kataras非常出色,其他框架將會有更多的例子,至少對我來說,如果我切換到一個新的框架,這是最快速掌握儘可能多的資訊的最有資源的地方。 一個例子就像1000個單詞。
核心功能
排序最多,功能較少
核心功能名稱 | Iris | Beego | Revel | Echo | Gin | Buffalo |
---|---|---|---|---|---|---|
路由器:命名路徑引數和萬用字元(Router: Named Path Parameters & Wildcard*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
路由器:正則表示式(Router: Regex*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
路由器:分組(Router: Grouping*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
路由器:以上所有混合無衝突(Router: All the above Mixed Without Conflict*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
路由器:自定義 HTTP 錯誤(Router: Custom HTTP Errors*) |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
與 net/http 100%相容(100% compatible with net/http*) |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
中介軟體生態系統(Middleware ecosystem*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Sinatra 風格API(Sinatra-like API*) |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
伺服器:自動 HTTPS (Server: Automatic HTTPS*) |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
伺服器:正常關機(Server: Gracefully Shutdown*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
伺服器:多監聽(Server: Multi Listeners*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
完整的 HTTP/2 (Full HTTP/2*) |
![]() |
![]() |
![]() |
![]() |
標準(standard) | 標準(standard) |
子域(Subdomains*) | ![]() |
次要(secondary) | 次要(secondary) | 次要(secondary) | 次要(secondary) | 次要(secondary) |
會話管理(Sessions*) | ![]() |
![]() |
![]() |
![]() |
![]() |
次要(secondary) |
Websockets | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
嵌入到應用(View (aka Templates) Embedded Into App*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
View檢視引擎 STD(View Engine: STD*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
View檢視引擎 Pug(View Engine: Pug*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
View檢視引擎 Django(View Engine: Django*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
View檢視引擎 Handlebars(View Engine: Handlebars*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
View檢視引擎 Amber(View Engine: Amber*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
資料渲染器:Markdown,JSON,JSONP,XML | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
MVC | ![]() |
![]() |
generator | ![]() |
![]() |
![]() |
快取(Caching*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
檔案伺服器(File Server*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
檔案伺服器:嵌入到應用程式(File Server: Embedded Into App*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
響應可以在傳送之前的生命週期中多次修改(Response can be Modified Many times through lifecycle before sent*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Gzip | ![]() |
![]() |
![]() |
(中介軟體) middleware | (中介軟體)middleware | (中介軟體) middleware |
測試框架(Testing Framework*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Typescript Transpiler | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
線上編輯(Online Editor*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
日誌系統(Logging System*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
維護和自動更新(Maintenance & Auto-Updates*) | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
效能(Performance) | ★★★★★ | ★★★ | ★★ | ★★★★★ | ★★★★★ | ★★★ |
Go中最著名的“Web框架”並不是真正的框架,這意味著:Echo,Gin和Buffalo並不是真正的(功能齊全的)Web框架但Go社群的大多數人都認為他們是。因此他們認為它們與Iris,Beego或Revel相當,因此,我們也有義務將它們納入此清單。
除了 Beego 和 Revel 之外,所有上述框架都可以適應任何中介軟體這是為 net/http 建立的,其中一些可以輕鬆地和其他人一起完成有一些黑客[甚至痛苦是這裡的選擇]。
詞彙
路由:命名路徑引數和萬用字元(Router: Named Path Parameters & Wildcard)
當您可以將處理程式註冊到具有動態路徑的路由時。
示例命名路徑引數:
"/user/{username}" 匹配 "/user/me", "/user/speedwheel" etc
路徑引數 username
匹配值分別是 me
和 speedwheel
。
示例萬用字元:
"/user/{path *wildcard}" matches to "/user/some/path/here", "/user/this/is/a/dynamic/multi/level/path" etc
path
路徑引數的值分別是 some/path/here
和 this/is/a/dynamic/multi/level/path
。
Iris也支援一種稱為巨集的功能,可以描述為/user/{username:string}或/user/{username:int min(1)}。
路由:正則表示式(Router: Regex)
當您可以使用帶有過濾器的動態路徑向具有過濾器的路徑註冊處理程式時,應該傳遞一些處理程式以執行處理程式。
示例:
"/user/{id ^[0-9]$}" matches to "/user/42" but not to "/user/somestring"
id路徑引數的值為42。
路由:分組(Router: Grouping)
當您可以將公共邏輯或中介軟體/處理程式註冊到共享相同路徑字首的特定路由組時。
示例:
myGroup := Group("/user", userAuthenticationMiddleware) myGroup.Handle("GET", "/", userHandler) myGroup.Handle("GET", "/profile", userProfileHandler) myGroup.Handle("GET", "/signup", getUserSignupForm)
- /user
- /user/profile
- /user/signup
您甚至可以從組中建立子組:
myGroup.Group("/messages", optionalUserMessagesMiddleware) myGroup.Handle("GET', "/{id}", getMessageByID)
- /user/messages/{id}
路由:以上所有混合無衝突(Router: All the above Mixed Without Conflict)
這是一個先進但有用的功能,我們許多人希望它由路由器或Web框架支援,目前只有Iris在Go世界中支援這一功能。
這意味著 /{path *wildcard}
和 /user/{username}
和 /user/static
和 /user/{path*wildcard}
之類的東西可以在同一個路由器中註冊,它可以正確匹配而不會受到靜態路徑的衝突(/user/static)或萬用字元(/{path*wildcard})。
路由:自定義HTTP錯誤(Router: Custom HTTP Errors)
當您可以為“錯誤”狀態程式碼註冊處理程式時。 錯誤http狀態程式碼是> = 400狀態程式碼, i.s Not Found 404
。
示例:
OnErrorCode(404, myNotFoundHandler)
上面的大多數Web框架僅支援404,405和500註冊,但像Iris,Beego和Revel這樣的功能完全支援任何狀態程式碼甚至任何錯誤程式碼(Iris僅支援任何錯誤)。
100% compatible with net/http (與net/http 100%相容)
意味著你有:
- 框架為您提供了直接訪問
*http.Request
和http.ResponseWriter
的上下文。 - 一種將
net/http
處理程式轉換為特定框架的Handler
型別的方法。
中介軟體生態系統 (Middleware ecosystem)
當您不必自己用中介軟體包裝每個處理程式時,框架會為您提供一個完整的引擎來定義流,全域性或每個路由或每組路由。 i.e Use(middleware), Done(middleware) etc.
類似 Sinatra API (Sinatra-like API)
類似於 Sinatra
的 APIRegister
在執行時處理程式中用於特定 HTTP
方法(和路徑引數)的路由。
示例:
.Get or GET("/path", gethandler) .Post or POST("/path", postHandler) .Put or PUT("/path", putHandler) and etc.
伺服器:自動HTTPS(Server: Automatic HTTPS)
當框架的伺服器支援註冊和自動續訂 SSL
認證以管理 SSL/TLS
傳入連線(https)時。 最著名的自動https提供程式是 letsencrypt 。
伺服器:正常關機 (Server: Gracefully Shutdown)
按CTRL + C關閉終端應用程式時; 伺服器將正常關閉,等待一些連線完成其工作(具有特定的超時)或觸發自定義事件以進行清理(即資料庫關閉)。
伺服器:多監聽(Server: Multi Listeners)
當框架的伺服器支援註冊自定義 net.Listener
或使用多個http伺服器和地址提供Web應用程式時。
完整的 HTTP/2
(Full HTTP/2)
當框架支援帶有 https
的 HTTP/2
和伺服器推送功能時。
子域(Subdomains)
當您可以直接從Web應用程式註冊每個x,y子域的路由。
這個框架不支援這個功能,但你仍然可以通過啟動多個http伺服器來實現它,這樣做的缺點是主應用程式和子域沒有連線,預設情況下不可能在它們之間共享邏輯。
會話(Sessions)
- 支援http會話並準備在特定處理程式中使用時。
- 一些Web框架支援後端資料庫來儲存會話,因此您可以在伺服器重新啟動之間獲得永續性。Buffalo使用gorilla會話,這些會話比其他實現慢一點。
示例:
func setValue(context http_context){ s := Sessions.New(http_context) s.Set("key", "my value") } func getValue(context http_context){ s := Sessions.New(http_context) myValue := s.Get("key") } func logoutHandler(context http_context){ Sessions.Destroy(http_context) }
Wiki: https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session
套接字(Socket/">WebSockets)
當框架支援websocket通訊協議時。 實現是不同的。
您應該搜尋他們的示例以檢視適合您的內容。 我嘗試所有這些的同事告訴我,與其他API相比,Iris使用更簡單的API實現了最具特色的 webosocket
連線。
Wiki: https://en.wikipedia.org/wiki/WebSocket
檢視(aka模板)嵌入到應用程式中
通常,您必須將所有模板檔案與Web應用程式的可執行檔案並行傳輸。 嵌入到應用程式意味著框架支援與 go-bindata
整合,因此最終的可執行檔案包含其中的模板,表示為 []byte
。
什麼是檢視引擎?
當框架支援模板載入,自定義和構建模板功能時,可以在關鍵部件上完成。
檢視引擎:STD
當框架支援通過標準 html/template
解析器載入模板時。
檢視引擎:Pug
當框架支援通過 Pug
解析器載入模板時。
檢視引擎:Django
當框架支援通過 Django
解析器載入模板時。
檢視引擎:Handlebars
當框架支援通過 Handlebars
解析器載入模板時。
檢視引擎:Amber
當框架支援通過 Amber
解析器載入模板時。
渲染:Markdown,JSON,JSONP,XML(Renderer: Markdown, JSON, JSONP, XML)
當框架的上下文為您提供一種簡單的方法來輕鬆地傳送/和自定義各種內容型別的響應。
MVC
模型 - 檢視 - 控制器(MVC)是用於在計算機上實現使用者介面的軟體架構模式。
它將給定的應用程式劃分為三個相互關聯的部分。
這樣做是為了將資訊的內部表示與向用戶呈現和接受資訊的方式分開。
MVC設計模式將這些主要元件分離,從而實現高效的程式碼重用和並行開發。
- Iris支援完整的MVC功能,可以在執行時註冊。
- Beego僅支援方法和模型匹配,可以在執行時註冊。
- Revel支援方法,路徑和模型匹配,只能通過生成器(必須執行以構建Web應用程式的不同軟體)註冊。
Wiki: https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
快取記憶體(Caching)
Web快取(或HTTP快取)是用於臨時儲存(快取)Web文件(例如HTML頁面和影象)的資訊科技,以減少伺服器滯後。
通過它的Web快取系統文件; 如果滿足某些條件,可以滿足後續要求。[1] Web快取系統可以指裝置或計算機程式。
Wiki: https://en.wikipedia.org/wiki/Web_cache
檔案伺服器(File Server)
當您可以將(物理)目錄註冊到將自動向客戶端提供此目錄檔案的路由時。
檔案伺服器:嵌入到應用程式(File Server: Embedded Into App)
通常,您必須傳輸所有靜態檔案(如資產; css,javascript檔案…)以及應用程式的可執行檔案。
支援此功能的框架使您有機會將所有這些資料嵌入到應用程式中,表示為 []byte
,它們的響應時間也更快,因為伺服器可以直接為它們提供服務,而無需在物理位置查詢檔案。
響應可以在傳送之前的生命週期中多次修改(Response can be Modified Many times through lifecycle before sent)
目前只有Iris通過其http_context中的內建響應編寫器支援此功能。
當框架支援此功能時,您可以在傳送到客戶端之前檢索或重置或修改寫入的狀態程式碼,正文和標題(在基於 net/http
的Web框架中,預設情況下這是不可能的,因為無法檢索或更改正文和狀態程式碼 書面)。
Gzip
當你在路由的處理程式中並且你可以更改響應編寫器以便使用gzip壓縮傳送響應時,框架應該處理已傳送的標頭檔案,如果發生任何錯誤,它應該將響應寫入恢復正常。
它也應該能夠檢查客戶端是否支援gzip。
gzip是一種檔案格式和用於檔案壓縮和解壓縮的軟體應用程式
Wiki: https://en.wikipedia.org/wiki/Gzip
測試框架(Testing Framework)
當您可以使用特定的框架庫測試HTTP時,它的工作就是幫助您輕鬆編寫更好的測試。
示例(目前,只有Iris支援):
func TestAPI(t *testing.T) { app := myIrisApp() tt := httptest.New(t, app) tt.GET("/admin").WithBasicAuth("name", "pass").Expect(). Status(httptest.StatusOK).Body().Equal("welcome") }
myIrisApp返回你想象中的Web應用程式,它有一個 /admin
的GET處理程式,受基本身份驗證保護。
上面的簡單測試檢查/admin是否以狀態OK響應,並且使用特定使用者名稱和密碼傳遞身份驗證,並且其正文為 welcome
。
Typescript Transpiler
Typescript
目標是成為ES6的超集,除了標準定義的所有新東西之外,還將新增一個靜態型別系統。
Typescript
還有一個轉換器,它將我們的 Typescript
程式碼(即ES6 +型別)轉換為ES5或ES3 javascript
程式碼,因此我們可以在今天的瀏覽器中使用它。
線上編輯(Online Editor)
線上編輯器藉助線上編輯器,您可以快速輕鬆地線上編譯和執行程式碼。
日誌系統(Logging System)
自定義日誌記錄系統通過提供諸如顏色編碼,格式化,日誌級別分離,不同日誌記錄後端等有用功能來擴充套件本機日誌包行為。
維護和自動更新(Maintenance & Auto-Updates)
以非侵入方式通知使用者“即時”更新框架。
本文翻譯於 https://github.com/speedwheel/awesome-go-web-frameworks