幾個提升 Go 業務開發效率的流行框架和開源庫
最近總有一些初學Go
語言的小夥伴問我在業務開發中一般都使用什麼 web 框架、開源中間件;所以我總結了我在日常開發中使用到的庫,這些庫不一定是特別完美的,但是基本可以解決日常工作需求,接下來我們就來看一下。
Gin
Gin
是一個用Go
編寫的Web
框架,它是一個類似於martini
但擁有更好性能的API
框架。基本現在每個Go
初學者學習的第一個web
框架都是Gin
。在網上看到一個關於對各個 Go-web 框架受歡迎的對比:
我們可以看到Gin
在社區受歡迎排第一,Gin 框架往往是進行 Web 應用開發的首選框架,許多公司都會選擇採用Gin
框架進行二次開發,加入日誌,服務發現等功能,像 Bilibili 開源的一套 Go 微服務框架 Kratos 就採用 Gin 框架進行了二次開發。
學習Gin
通過他的官方文檔就可以很快入手,不過文檔時英文的,這個不用擔心,我曾翻譯了一份中文版,可以到我的公衆號後臺獲取,回覆【gin】即可獲取。
github 地址:https://github.com/gin-gonic/gin
zap
zap
是uber
開源的日誌庫,選擇zap
他有兩個優勢:
-
它非常的快
-
它同時提供了結構化日誌記錄和 printf 風格的日誌記錄
大多數日誌庫基本都是基於反射的序列化和字符串格式化的,這樣會導致在日誌上佔用大量CPU
資源,不適用於業務開發場景,業務對性能敏感還是挺高的。zap
採用了不同的方法,它設計了一個無反射、零分配的 JSON 編碼器,並且基礎 Logger 力求儘可能避免序列化開銷和分配。通過在此基礎上構建高級 SugaredLogger,zap 允許用戶選擇何時需要計算每次分配以及何時更喜歡更熟悉的鬆散類型的 API。
zap
的基準測試如下:
可以看出zap
的效率完全高於其他日誌庫,選誰不用我明說了吧!!!
github 地址:https://github.com/uber-go/zap
jsoniter
做業務開發離不開json
的序列化與反序列化,標準庫雖然提供了encoding/json
,但是它主要是通過反射來實現的,所以性能消耗比較大。jsoniter
可以解決這個痛點,其是一款快且靈活的 JSON 解析器,具有良好的性能並能 100% 兼容標準庫,我們可以使用 jsoniter 替代 encoding/json,官方文檔稱可以比標準庫快 6 倍多,後來 Go 官方在 go1.12 版本對 json.Unmarshal 函數使用 sync.Pool 緩存了 decoder,性能較之前的版本有所提升,所以現在達不到快 6 倍多。
github 地址:https://github.com/json-iterator/go
對於jsoniter
優化原理感興趣的可以移步這裏:http://jsoniter.com/benchmark.html#optimization-used
gorm
gorm
是一個使用Go
語言編寫的ORM
框架,文檔齊全,對開發者友好,並且支持主流的數據庫:MySQL
, PostgreSQL
, SQlite
, SQL Server
。
個人覺得使用gorm
最大的好處在於它是由國人開發,中文文檔齊全,上手很快,目前大多數企業也都在使用gorm
。我們來一下gorm
的特性:
-
全功能 ORM
-
關聯 (Has One,Has Many,Belongs To,Many To Many,多態,單表繼承)
-
Create,Save,Update,Delete,Find 中鉤子方法
-
支持
Preload
、Joins
的預加載 -
事務,嵌套事務,Save Point,Rollback To Saved Point
-
Context、預編譯模式、DryRun 模式
-
批量插入,FindInBatches,Find/Create with Map,使用 SQL 表達式、Context Valuer 進行 CRUD
-
SQL 構建器,Upsert,數據庫鎖,Optimizer/Index/Comment Hint,命名參數,子查詢
-
複合主鍵,索引,約束
-
Auto Migration
-
自定義 Logger
-
靈活的可擴展插件 API:Database Resolver(多數據庫,讀寫分離)、Prometheus…
-
每個特性都經過了測試的重重考驗
-
開發者友好
github 地址:https://github.com/go-gorm/gorm
官方文檔:https://gorm.io/zh_CN/docs/index.html
robfig/cron
github 地址:https://github.com/robfig/cron
業務開發更離不開定時器的使用了,cron
就是一個用於管理定時任務的庫,用 Go 實現 Linux 中crontab
這個命令的效果,與 Linux 中crontab
命令相似,cron
庫支持用 5 個空格分隔的域來表示時間。cron
上手也是非常容易的,看一個官方的例子:
package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New()
c.AddFunc("@every 1s", func() {
fmt.Println("tick every 1 second run once")
})
c.Start()
time.Sleep(time.Second * 10)
}
針對cron
的使用可以參考這篇文章:https://segmentfault.com/a/1190000023029219
之前我也寫了一篇cron
的基本使用,可以參考下:https://mp.weixin.qq.com/s/Z4B7Tn8ikFIkXVGhXNbsVA
wire
都1202
年了,應該不會有人不知道依賴注入的作用了吧。我們本身也可以自己實現依賴注入,但是這是在代碼量少、結構不復雜的情況下,當結構之間的關係變得非常複雜的時候,這時候手動創建依賴,然後將他們組裝起來就會變的異常繁瑣,並且很容出錯。Go 語言社區有很多依賴注入的框架,可以分爲兩個類別:
-
依賴反射實現的運行時依賴注入:inject、uber、dig
-
使用代碼生成實現的依賴注入:wire
個人覺的使用wire
進行項目管理是最好的,在代碼編譯階段就可以發現依賴注入的問題,在代碼生成時即可報出來,不會拖到運行時才報,更便於debug
。
wire
的使用也是非常的簡單,關於wire
的使用我之前也寫了一篇文章,可以參考一下:https://mp.weixin.qq.com/s/Z4B7Tn8ikFIkXVGhXNbsVA
github 地址:https://github.com/google/wire
ants
某些業務場景還會使用到goroutine
池,ants
就是一個廣泛使用的 goroute 池,可以有效控制協程數量,防止協程過多影響程序性能。ants
也是國人開發的,設計博文寫的也很詳細的,目前很多大廠也都在使用ants
,經歷過線上業務檢驗的,所以可以放心使用。
github 地址:https://github.com/panjf2000/ants
ants
源碼不到1k
行,建議大家賞析一下源碼~。
總結
本文列舉的幾個庫都是經常被使用的開源庫,這幾個庫你都掌握了,基本的業務開發都沒有啥問題了,一些初學者完全可以通過這幾個庫達到入門水平。還有一些庫,比如:go-redis
、go-sql-driver
、didi/gendry
、golang/groupcache
、olivere/elastic/v7
等等,這些庫也是經常使用的,入門都比較簡單,就不這裏詳細介紹了。
如果大家也有經常使用的,比較好的開源庫,歡迎推薦給我,我也學習學習!!!
本文轉載自公衆號「Golang 夢工廠」,如果喜歡他的文章推薦關注!
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/6G_wUY1nxJp9vwBKQ8_-pA