Gear: 一個 Go web framework 的設計思考和討論
Gear 框架設計考量
Gear 是由 Teambition 開發的一個輕量級的、專注於可組合擴充套件和高效能的 Go 語言 Web 服務框架。
Gear 框架在設計與實現的過程中充分參考了 Go 語言下多款知名 Web 框架,也參考了 Node.js 下的知名 Web 框架,汲取各方優秀因素,結合我們的開發實踐,精心打磨而成。Gear 框架主要有如下特點:
- 基於中介軟體模式的業務處理控制流程。中介軟體模式使功能模組開發標準化、解耦、易於組合和整合到應用
- 框架級的錯誤和異常自動處理機制。開發者無需再擔心業務邏輯中的每一個錯誤,只需在中介軟體返回錯誤,交給框架自動處理,也支援自定義處理邏輯
- 整合了便捷的讀寫 HTTP Request/Response 物件的方法,使得 Web 應用開發更加高效
- 高效而強大的路由處理器,能定義出各種路由規則滿足業務邏輯需求
- 豐富的中介軟體生態,如 CORS, CSRF, Secure, Logging, Favicon, Session, Rate limiter, Tracing等
- 完整的 HTTP/2.0 支援
- 超輕量級,框架只實現核心的、共性的需求,可選需求均通過外部中介軟體或庫來滿足,確保應用實現的靈活自由,不被框架繫結束縛
目前 Gear 已經發布 v1.0.0
2017-03-05 更新
2016-10-22
起因
因公司技術轉型需要(見招聘貼 https://gocn.io/question/36 ),我最近一個月都在學習 Go 語言,研究 Go 語言下各種 Web 框架,主要有以下三個印象:
- Go 語言原生的
net/http
效率很低,第三方實現的fasthttp
效率極高,是原生 10 倍以上,封神榜上排名第二。 - Go 的 Web 框架非常多,但知名度高的框架基本上是基於
fasthttp
,除了 Asta謝 的Beego
。 - Web 框架不但多,很多看起來也相似,但各自都有自己的功能外掛和生態,API也非常繁雜。這大概是強型別引發的問題,很難像 Node.js 生態圈那樣共用他人的開源模組。
我在 Node.js 生態圈中做了一個 Web 框架:https://github.com/toajs/toa ,我把它搬到了 Go 生態,這就是 Gear: https://github.com/teambition/gear
Gear 特性和目標
- 充分利用 Go 語言原生介面,一方面原生實現總是在不斷進步優化;另一方面通用性更好,這點對於強型別來說很重要,儘量解耦型別依賴。
- 輕量級,框架本身只提供開發完整 Web 服務需要的核心功能,其它功能均通過中介軟體擴充套件。
- 充分發揮和擴充套件 Go 建議使用的
context.Context
能力。
關於效能
看過了太多的 benchmark,我以為 net/http
真弱雞,但其實不然,在我的 14寸 rMBP 的測試結果如下:
Gear 48307 vs Iris 70310
Gear with "net/http": 48307
> wrk 'http://localhost:3333/?foo[bar]=baz' -d 10 -c 100 -t 4
Running 10s test @ http://localhost:3333/?foo[bar]=baz
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.30ms 2.53ms 59.54ms 94.28%
Req/Sec 12.15k 1.56k 20.98k 81.75%
484231 requests in 10.02s, 63.27MB read
Requests/sec: 48307.40
Transfer/sec: 6.31MB
Iris with "fasthttp": 70310
> wrk 'http://localhost:3333/?foo[bar]=baz' -d 10 -c 100 -t 4
Running 10s test @ http://localhost:3333/?foo[bar]=baz
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.37ms 648.31us 15.60ms 89.48%
Req/Sec 17.75k 2.32k 39.65k 84.83%
710317 requests in 10.10s, 102.29MB read
Requests/sec: 70310.19
Transfer/sec: 10.13MB
目前 Gear 還只剛成型,沒有開始優化,另外據說 Go 1.8 的 net/http
有很大優化,兩項相加趕上 Iris 完全可能。
相關文章
- 對容器映象的思考和討論
- 討論設計模式和00思想設計模式
- 《Go web程式設計》ChitChat論壇GoWeb程式設計
- 討論個有關模組化設計的問題
- 關於網站設計的一點點討論網站
- 深入討論通用許可權元件的理論和設計實現。元件
- 一個“老”程式設計師的思考程式設計師
- 表結構設計討論
- 和開發討論的一個資料變更需求
- 各位道友,進來討論個介面設計問題!
- 一個XML資料統計問題,期待大家的討論XML
- 和開發同學討論的一個技術問題
- [討論]“消滅”程式設計師?程式設計師
- [技術討論]多使用者(多公司)的資料庫設計討論資料庫
- 一起寫個 WSGI Web FrameworkWebFramework
- 討論一個應用的解決方案
- 關於一個建立型模式的討論:模式
- [討論]關於一個設計方面的問題――主動物件和被動物件中的方法定義物件
- [技術討論]程式設計師的基本技能和素質程式設計師
- go 錯誤處理設計思考Go
- 關於 Angular 裡 module 和 Component 包含粒度的一個討論Angular
- 自創一個簡單的Web分散式解決方案,歡迎大家討論Web分散式
- 對於程式設計師職業生涯的一些討論程式設計師
- 討論下 RESTful 風格 API 的路由設計RESTAPI路由
- [討論] 似是而非的程式設計觀點程式設計
- 關於程式設計風格的討論 (轉)程式設計
- 設計模式討論之abstract factory篇設計模式
- 有關GO和Erlang的一些思考Go
- Go知識圖譜討論帖Go
- 討論:程式設計師高手和菜鳥的區別是什麼?程式設計師
- 【話題討論】漫談生產系統升級的一點思考
- 不太一樣的Go Web框架—程式設計正規化GoWeb框架程式設計
- 一個有趣的故事(請討論JdonFramework的各位進)Framework
- 經驗:一個秒殺系統的設計思考
- 作為一個程式設計師的學習思考程式設計師
- C#開發的兩個基本程式設計原則的深入討論(轉)C#程式設計
- [軟體工程]交換程式設計方法的深入討論軟體工程程式設計
- 討論:什麼才算是真正的程式設計能力?程式設計