Golang六款優(yōu)秀Web框架對比
Golang是一門快速增長的語言,專為構(gòu)建簡單、快速且可靠的軟件而設(shè)計(jì)。它提供的net/http庫對于HTTP協(xié)議實(shí)現(xiàn)非常好,基于此再構(gòu)造框架會更容易,因此生態(tài)中出現(xiàn)了很多框架。本文將從流行度、社區(qū)支持及內(nèi)建功能等角度對六款知名Go語言Web框架做對比。
六款Web框架
Beego 面向Go編程語言的開源高性能web框架
- https://github.com/astaxie/beego
- https://beego.me
Buffalo 使用Go語言快速構(gòu)建Web應(yīng)用
- https://github.com/gobuffalo/buffalo
- https://gobuffalo.io
Echo 高性能、極簡Go語言Web框架
- https://github.com/labstack/echo
- https://echo.labstack.com
Gin Go語言編寫的HTTP Web框架,它以更好的性能實(shí)現(xiàn)了類似Martini的API,性能更好
- https://github.com/gin-gonic/gin
- https://gin-gonic.github.io/gin
Iris 全宇宙最快的Go語言Web框架,完備MVC支持,擁抱未來
- https://github.com/kataras/iris
- https://iris-go.com
Revel Go語言的高效、全棧Web框架
- https://github.com/revel/revel
- https://revel.github.io
流行度

學(xué)習(xí)曲線

astaxie 和 kataras 分別為 Beego 和 Iris 整理了許多例子供開發(fā)者參考學(xué)習(xí)
核心功能
Web框架核心功能對比
幾個(gè)知名的Go語言Web框架(Echo、Gin和Buffalo)由于沒有完備支持所有功能,并不能算是真正意義上的Web框架,但大部分go社區(qū)認(rèn)為它們是的,因此,有必要將這幾個(gè)框架也列在表格中可以和Iris、Beego、Revel做比較。以上這些框架,除了Beego和Revel之外,都可以適配任意net/http中間件,其中一部分框架可以輕松地做適配,另外一些可能就需要額外的努力
詞匯解析
路由: 命名參數(shù)和通配符 支持注冊動態(tài)路徑
命名路徑參數(shù)示例
- // 路徑參數(shù) username 取值分別是 me,speedwheel
- "/user/{username}" 匹配到 "/user/me", "/user/speedwheel" 等等
通配符示例
- // 路徑參數(shù) path 對應(yīng)的分別是 /user/some/path/here 和 /user/this/is/a/dynamic/multi/level/path
- "/user/{path *wildcard}" 匹配到
- "/user/some/path/here",
- "/user/this/is/a/dynamic/multi/level/path" 等等
Iris也支持一個(gè)叫micros的功能,它可以被表示為 /user/{username: string} 或 /user/{username: int min(1)}
路由: 正則表達(dá)式 支持過濾動態(tài)路徑
- "/user/{id ^[0-9]$}" 匹配到 "/user/42" 但不會匹配 "/user/somestring"
路由: 分組 通過共用邏輯或中間件來處理有共同前綴的路徑組
- myGroup := Group("/user", userAuthenticationMiddleware)
- myGroup.Handle("GET", "/", userHandler)
- myGroup.Handle("GET", "/profile", userProfileHandler)
- myGroup.Handle("GET", "/signup", getUserSignupForm)
- /user
- /user/profile
- /user/signup
可以從分組中再創(chuàng)建子分組
- myGroup.Group("/messages", optionalUserMessagesMiddleware)
- myGroup.Handle("GET', "/{id}", getMessageByID)
- /user/messages/{id}
路由: 以上所有規(guī)則相結(jié)合而不產(chǎn)生沖突 這是一個(gè)高級且有用的功能,目前在Go語言框架方面只有Iris能支持這一功能。這意味著類似如 /{path wildcard}, /user/{username}和/user/static以及/user/{path wildcard}等路徑都可以在同一個(gè)路由中通過靜態(tài)路徑/user/static或通配符/user/{path *wildcard}來正確匹配
路由: 自定義HTTP異常 指可以自行處理請求錯(cuò)誤的情況。HTTP的錯(cuò)誤狀態(tài)碼>=400,例如,請求的資源不存在 NotFound 404
- OnErrorCode(404, myNotFoundHandler)
上述大多數(shù)Web框架只支持404,405及500錯(cuò)誤狀態(tài)的處理,Iris能夠支持任意錯(cuò)誤,Beego和Revel也能支持完備的HTTP錯(cuò)誤狀態(tài)碼
100%兼容net/http包 這意味著
- 這些框架能夠直接訪問 *http.Request 和 http.ResponseWriter 的上下文信息
- 一種將net/http handler轉(zhuǎn)換為特定框架類型handler的方法
中間件生態(tài)系統(tǒng) 框架會為你提供一個(gè)完整的引擎來定義流程、全局、單個(gè)或一組路由,而不需要自己用不同的中間件來封裝每一部分的handlers
類Sinatra風(fēng)格API 可以在運(yùn)行時(shí)中注入代碼來處理特定的 HTTP 方法(以及路徑參數(shù))
- .Get or GET("/path", gethandler)
- .Post or POST("/path", postHandler)
- .Put or PUT("/path", putHandler) and etc.
服務(wù)器程序: 自動啟用HTTPS 框架的服務(wù)器支持注冊及自動更新SSL證書來管理新傳入的SSL/TLS連接(https)
服務(wù)器程序: 優(yōu)雅關(guān)閉 當(dāng)按下CTRL+C關(guān)閉終端應(yīng)用程序時(shí),服務(wù)器將等待(特定的超時(shí)時(shí)間)其他的連接完成相關(guān)任務(wù)或觸發(fā)一個(gè)自定義事件來做清理工作(比如: 關(guān)閉數(shù)據(jù)庫),最后優(yōu)雅的終止服務(wù)
服務(wù)器程序: 多重監(jiān)聽 框架的服務(wù)器支持自定義的net.Listener或使用多個(gè)http服務(wù)器和地址為web應(yīng)用程序提供服務(wù)
完全支持HTTP/2 框架可以很好的處理https請求的http/2協(xié)議,并支持服務(wù)器push功能子域名 可以直接在Web應(yīng)用中注入子域名的路徑
- 輔助功能 意味著這個(gè)功能并不被這個(gè)框架原生支持,但是你仍舊可以通過啟用多個(gè) http 服務(wù)器來實(shí)現(xiàn)。缺點(diǎn)在于:主程序和子域名程序之間并不是連通的,默認(rèn)情況下,它們不能共享邏輯
會話(Sessions) 支持HTTP Sessions,且可以在自定義的handlers中使用sessions
- 一些 Web 框架支持后臺數(shù)據(jù)庫來儲存 sessions,以便在服務(wù)器重啟之后仍舊能獲得持久的 sessions
- Buffalo 使用 gorilla 的 sessions 庫,它比其他框架的實(shí)現(xiàn)略微慢了一點(diǎn)
- 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)
- }
Websockets 支持websocket通信協(xié)議,不同框架有不同的實(shí)現(xiàn)方式,其中Iris實(shí)現(xiàn)了websocket最多功能并提供了相對更容易使用的API
程序內(nèi)嵌對視圖(模版)的支持 通常情況下,你必須根據(jù) Web 應(yīng)用的可執(zhí)行文件一一對應(yīng)地轉(zhuǎn)換模版文件。內(nèi)嵌到應(yīng)用中意味著這個(gè)框架集成了 go-bindata ,因此在最終的可執(zhí)行文件中可以以 []byte 的形式將模版包含進(jìn)來
視圖引擎 框架支持模版加載、自定義及內(nèi)建模版功能,節(jié)省開發(fā)時(shí)間
視圖引擎: STD 框架支持通過標(biāo)準(zhǔn)的 html/template 解析器加載模版
視圖引擎: Pug 框架支持通過 Pug 解析器加載模版
視圖引擎: Django 框架支持通過 Django 解析器加載模版
視圖引擎: Handlebars 框架支持通過 Handlebars 解析器加載模版
視圖引擎: Amber 框架支持通過 Amber 解析器加載模版
渲染: Markdown, JSON, JSONP, XML... 框架提供一個(gè)簡單的方法來發(fā)送和自定義各種內(nèi)容類型的響應(yīng)
MVC Model-view-controller(MVC)模型是一種用于在計(jì)算機(jī)上實(shí)現(xiàn)用戶界面的軟件架構(gòu)模式,它將一個(gè)應(yīng)用程序分為互相關(guān)聯(lián)的三部分。這樣做的目的是為了:將信息的內(nèi)部處理邏輯、信息呈現(xiàn)給用戶以及從用戶獲取信息三者分離。MVC 設(shè)計(jì)模式將這三個(gè)組件解耦合,從而實(shí)現(xiàn)高效的代碼復(fù)用和并行開發(fā)
- Iris 支持完備的 MVC 功能, 可以在運(yùn)行時(shí)中注入
- Beego 僅支持方法和數(shù)據(jù)模型的匹配,可以在運(yùn)行時(shí)中注入
- Revel 支持方法,路徑和數(shù)據(jù)模型的匹配,只可以通過生成器注入(生成器是另外一個(gè)不同的軟件用于構(gòu)建你的 Web 應(yīng)用)
緩存 Web 緩存是一種用于臨時(shí)存儲(緩存)網(wǎng)頁文檔,如 HTML 頁面和圖像,來減緩服務(wù)器延時(shí)。一個(gè) Web 緩存系統(tǒng)緩存網(wǎng)頁文檔,使得后續(xù)的請求如果滿足特定條件就可以直接得到緩存的文檔。Web 緩存系統(tǒng)既可以指設(shè)備,也可以指軟件程序
文件服務(wù)器 可以注冊一個(gè)(物理的)目錄到一個(gè)路徑,使得這個(gè)路徑下的文件可以自動地提供給客戶端
文件服務(wù)器: 內(nèi)嵌入應(yīng)用 通常情況下,必須將所有的靜態(tài)文件(比如assets: CSS, JavaScript 文件等)與應(yīng)用程序的可執(zhí)行文件一起傳輸。支持此項(xiàng)功能的框架為你提供了在應(yīng)用中,以 []byte 的形式,內(nèi)嵌所有這些數(shù)據(jù)的機(jī)會。由于服務(wù)器可以直接使用這些數(shù)據(jù)而無需在物理位置查找文件,它們的響應(yīng)速度也將更快
響應(yīng)在發(fā)送前可以在整個(gè)生命周期中修改多次 當(dāng)框架支持此功能時(shí),可以在返回給客戶端之前檢索、重置或修改狀態(tài)碼、body及headers。默認(rèn)情況下,在基于 net/http 的 Web 框架中這是不可能的,因?yàn)檎暮蜖顟B(tài)碼一經(jīng)寫定就不能被檢索或修改。目前只有 Iris 通過 http_context 中內(nèi)建的的響應(yīng)寫入器(response writer)支持這個(gè)功能
Gzip 在一個(gè)路由的handler中,并且可以改變響應(yīng)寫入器(response writer)來發(fā)送一個(gè)用 gzip 壓縮的響應(yīng)時(shí),框架會負(fù)責(zé)響應(yīng)的頭部。如果發(fā)生任何錯(cuò)誤,框架應(yīng)該把響應(yīng)重置為正常,框架也應(yīng)該能夠檢查客戶端是否支持 gzip 壓縮gzip 是用于壓縮和解壓縮的文件格式和軟件程序
測試框架 可以使用框架特定的庫,來幫助你輕松地編寫更好的測試代碼來測試你的 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返回虛構(gòu)的Web應(yīng)用,它有一個(gè)針對/admin路徑的GET方法,及基本的身份驗(yàn)證邏輯保護(hù)。上面的簡單測試用例,用name和pass通過身份驗(yàn)證并訪問GET /admin,檢查它的響應(yīng)狀態(tài)是否為Status OK及響應(yīng)體是否為welcome
TypeScript轉(zhuǎn)譯器
在線編輯器
日志系統(tǒng) 自定義日志系統(tǒng)通過提供有用的功能,如日志輸出、格式化、日志級別分離及不同的日志記錄后端等,來擴(kuò)展原生日志包
維護(hù)和自動更新 以非侵入的方式通知框架的用戶即時(shí)更新
小結(jié)
框架一直是敏捷開發(fā)中的利器,能讓開發(fā)者很快上手并作出應(yīng)用。成長不會一蹴而就,會經(jīng)歷從入門到深入,再到精通框架的過程,找到學(xué)習(xí)和應(yīng)用它的價(jià)值,便不會入門就放棄了