Gear: 一個 Go web framework 的設計思考和討論

zensh發表於2016-10-22

Gear 框架設計考量

Gear 是由 Teambition 開發的一個輕量級的、專注於可組合擴充套件和高效能的 Go 語言 Web 服務框架。

Gear 框架在設計與實現的過程中充分參考了 Go 語言下多款知名 Web 框架,也參考了 Node.js 下的知名 Web 框架,汲取各方優秀因素,結合我們的開發實踐,精心打磨而成。Gear 框架主要有如下特點:

  1. 基於中介軟體模式的業務處理控制流程。中介軟體模式使功能模組開發標準化、解耦、易於組合和整合到應用
  2. 框架級的錯誤和異常自動處理機制。開發者無需再擔心業務邏輯中的每一個錯誤,只需在中介軟體返回錯誤,交給框架自動處理,也支援自定義處理邏輯
  3. 整合了便捷的讀寫 HTTP Request/Response 物件的方法,使得 Web 應用開發更加高效
  4. 高效而強大的路由處理器,能定義出各種路由規則滿足業務邏輯需求
  5. 豐富的中介軟體生態,如 CORS, CSRF, Secure, Logging, Favicon, Session, Rate limiter, Tracing等
  6. 完整的 HTTP/2.0 支援
  7. 超輕量級,框架只實現核心的、共性的需求,可選需求均通過外部中介軟體或庫來滿足,確保應用實現的靈活自由,不被框架繫結束縛

目前 Gear 已經發布 v1.0.0

《Gear 框架設計考量》

2017-03-05 更新


2016-10-22

起因

因公司技術轉型需要(見招聘貼 https://gocn.io/question/36 ),我最近一個月都在學習 Go 語言,研究 Go 語言下各種 Web 框架,主要有以下三個印象:

  1. Go 語言原生的 net/http 效率很低,第三方實現的 fasthttp 效率極高,是原生 10 倍以上,封神榜上排名第二。
  2. Go 的 Web 框架非常多,但知名度高的框架基本上是基於 fasthttp,除了 Asta謝 的 Beego
  3. Web 框架不但多,很多看起來也相似,但各自都有自己的功能外掛和生態,API也非常繁雜。這大概是強型別引發的問題,很難像 Node.js 生態圈那樣共用他人的開源模組。

我在 Node.js 生態圈中做了一個 Web 框架:https://github.com/toajs/toa ,我把它搬到了 Go 生態,這就是 Gear: https://github.com/teambition/gear

Gear 特性和目標

  1. 充分利用 Go 語言原生介面,一方面原生實現總是在不斷進步優化;另一方面通用性更好,這點對於強型別來說很重要,儘量解耦型別依賴。
  2. 輕量級,框架本身只提供開發完整 Web 服務需要的核心功能,其它功能均通過中介軟體擴充套件。
  3. 充分發揮和擴充套件 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 完全可能。

相關文章