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 完全可能。
相關文章
- 對容器映象的思考和討論
- 關於IC設計的一次討論
- 關於網站設計的一點點討論網站
- 討論個有關模組化設計的問題
- Hibernate 一個更新問題的 討論
- 一起寫個 WSGI Web FrameworkWebFramework
- 關於 Angular 裡 module 和 Component 包含粒度的一個討論Angular
- go 錯誤處理設計思考Go
- 討論下 RESTful 風格 API 的路由設計RESTAPI路由
- 經驗:一個秒殺系統的設計思考
- 不太一樣的Go Web框架—程式設計正規化GoWeb框架程式設計
- Go知識圖譜討論帖Go
- 關於 Service Worker 和 Web 應用對應關係的討論Web
- AI面臨的五個蛋白質設計問題,Nature找了一群專家來討論AI
- 程式設計師小白的個人思考程式設計師
- Go Web 程式設計之 Hello WorldGoWeb程式設計
- 一個關於月球車的筆試題--求討論筆試
- 一個超級簡單的 go Web 框架GoWeb框架
- 設計通用流程和可變點的方法一些思考
- Go Web 程式設計之 資料庫GoWeb程式設計資料庫
- web的一些設計Web
- 一個菜鳥管理的學習和思考(一)
- [iOS Monkey 討論帖] 整套新的 fastmonkey 討論iOSAST
- go + koa = ? 一個新的 Web 框架 goa 誕生GoWeb框架
- 線性思考、設計思考和系統思考三者權衡
- 使用Go寫一個簡易的MVC的Web框架GoMVCWeb框架
- TGDC | 一個遊戲程式設計師的堅持 —— 論向量化程式設計遊戲程式設計師
- Web3市場代幣化:一個供給和需求矩陣的思考框架Web矩陣框架
- MASA Framework - EventBus設計Framework
- 《程式設計師的數學》思考題(一)程式設計師
- Go Web 程式設計入門--編寫 Web 中介軟體GoWeb程式設計
- TRIZ理論在洗碗機設計中應用探討
- 討論
- Go Web 程式設計入門--路由器GoWeb程式設計路由器
- Go Web 程式設計入門--應用 ORMGoWeb程式設計ORM
- Go Web 程式設計--應用資料庫GoWeb程式設計資料庫
- 學習程式設計,python和GO語言應該選擇哪一個?程式設計PythonGo
- 討論《魔獸世界:暗影國度》副本“彼界”的設計失誤
- 有沒有一些大廠的高階架構技術討論討論架構