Go 業(yè)務開發(fā)中常用的幾個開源庫
本文轉(zhuǎn)載自微信公眾號「Golang夢工廠」,作者AsongGo。轉(zhuǎn)載本文請聯(lián)系Golang夢工廠公眾號。
前言
哈嘍,大家好,我是asong。拖更了好久,這周開始更新。
最近總有一些初學Go語言的小伙伴問我在業(yè)務開發(fā)中一般都使用什么web框架、開源中間件;所以我總結(jié)了我在日常開發(fā)中使用到的庫,這些庫不一定是特別完美的,但是基本可以解決日常工作需求,接下來我們就來看一下。
Gin
Gin是一個用Go編寫的Web框架,它是一個類似于martini但擁有更好性能的API框架?;粳F(xiàn)在每個Go初學者學習的第一個web框架都是Gin。在網(wǎng)上看到一個關(guān)于對各個Go-web框架受歡迎的對比:
來自網(wǎng)絡(luò)
我們可以看到Gin在社區(qū)受歡迎排第一,Gin 框架往往是進行 Web 應用開發(fā)的首選框架,許多公司都會選擇采用Gin框架進行二次開發(fā),加入日志,服務發(fā)現(xiàn)等功能,像Bilibili 開源的一套 Go 微服務框架 Kratos 就采用 Gin 框架進行了二次開發(fā)。
學習Gin通過他的官方文檔就可以很快入手,不過文檔時英文的,這個不用擔心,我曾翻譯了一份中文版,可以到我的公眾號后臺獲取,回復【gin】即可獲取。
github地址:https://github.com/gin-gonic/gin
zap
- zap是uber開源的日志庫,選擇zap他有兩個優(yōu)勢:
- 它非常的快
它同時提供了結(jié)構(gòu)化日志記錄和printf風格的日志記錄
大多數(shù)日志庫基本都是基于反射的序列化和字符串格式化的,這樣會導致在日志上占用大量CPU資源,不適用于業(yè)務開發(fā)場景,業(yè)務對性能敏感還是挺高的。zap采用了不同的方法,它設(shè)計了一個無反射、零分配的 JSON 編碼器,并且基礎(chǔ) Logger 力求盡可能避免序列化開銷和分配。通過在此基礎(chǔ)上構(gòu)建高級 SugaredLogger,zap 允許用戶選擇何時需要計算每次分配以及何時更喜歡更熟悉的松散類型的 API。
zap的基準測試如下:
來自官方文檔
可以看出zap的效率完全高于其他日志庫,選誰不用我明說了吧!!!
github地址:https://github.com/uber-go/zap
jsoniter
做業(yè)務開發(fā)離不開json的序列化與反序列化,標準庫雖然提供了encoding/json,但是它主要是通過反射來實現(xiàn)的,所以性能消耗比較大。jsoniter可以解決這個痛點,其是一款快且靈活的 JSON 解析器,具有良好的性能并能100%兼容標準庫,我們可以使用jsoniter替代encoding/json,官方文檔稱可以比標準庫快6倍多,后來Go官方在go1.12版本對 json.Unmarshal 函數(shù)使用 sync.Pool 緩存了 decoder,性能較之前的版本有所提升,所以現(xiàn)在達不到快6倍多。
來自官方文檔
github地址:https://github.com/json-iterator/go
對于jsoniter優(yōu)化原理感興趣的可以移步這里:http://jsoniter.com/benchmark.html#optimization-used
gorm
gorm是一個使用Go語言編寫的ORM框架,文檔齊全,對開發(fā)者友好,并且支持主流的數(shù)據(jù)庫:MySQL, PostgreSQL, SQlite, SQL Server。
個人覺得使用gorm最大的好處在于它是由國人開發(fā),中文文檔齊全,上手很快,目前大多數(shù)企業(yè)也都在使用gorm。我們來一下gorm的特性:
- 全功能 ORM
- 關(guān)聯(lián) (Has One,Has Many,Belongs To,Many To Many,多態(tài),單表繼承)
- Create,Save,Update,Delete,F(xiàn)ind 中鉤子方法
- 支持 Preload、Joins 的預加載
- 事務,嵌套事務,Save Point,Rollback To Saved Point
- Context、預編譯模式、DryRun 模式
- 批量插入,F(xiàn)indInBatches,F(xiàn)ind/Create with Map,使用 SQL 表達式、Context Valuer 進行 CRUD
- SQL 構(gòu)建器,Upsert,數(shù)據(jù)庫鎖,Optimizer/Index/Comment Hint,命名參數(shù),子查詢
- 復合主鍵,索引,約束
- Auto Migration
- 自定義 Logger
- 靈活的可擴展插件 API:Database Resolver(多數(shù)據(jù)庫,讀寫分離)、Prometheus…
- 每個特性都經(jīng)過了測試的重重考驗
- 開發(fā)者友好
github地址:https://github.com/go-gorm/gorm
官方文檔:https://gorm.io/zh_CN/docs/index.html
robfig/cron
github地址:https://github.com/robfig/cron
業(yè)務開發(fā)更離不開定時器的使用了,cron就是一個用于管理定時任務的庫,用 Go 實現(xiàn) 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年了,應該不會有人不知道依賴注入的作用了吧。我們本身也可以自己實現(xiàn)依賴注入,但是這是在代碼量少、結(jié)構(gòu)不復雜的情況下,當結(jié)構(gòu)之間的關(guān)系變得非常復雜的時候,這時候手動創(chuàng)建依賴,然后將他們組裝起來就會變的異常繁瑣,并且很容出錯。Go語言社區(qū)有很多依賴注入的框架,可以分為兩個類別:
依賴反射實現(xiàn)的運行時依賴注入:inject、uber、dig
使用代碼生成實現(xiàn)的依賴注入:wire
個人覺的使用wire進行項目管理是最好的,在代碼編譯階段就可以發(fā)現(xiàn)依賴注入的問題,在代碼生成時即可報出來,不會拖到運行時才報,更便于debug。
wire的使用也是非常的簡單,關(guān)于wire的使用我之前也寫了一篇文章,可以參考一下:https://mp.weixin.qq.com/s/Z4B7Tn8ikFIkXVGhXNbsVA
github地址:https://github.com/google/wire
ants
某些業(yè)務場景還會使用到goroutine池,ants就是一個廣泛使用的goroute池,可以有效控制協(xié)程數(shù)量,防止協(xié)程過多影響程序性能。ants也是國人開發(fā)的,設(shè)計博文寫的也很詳細的,目前很多大廠也都在使用ants,經(jīng)歷過線上業(yè)務檢驗的,所以可以放心使用。
github地址:https://github.com/panjf2000/ants
ants源碼不到1k行,建議大家賞析一下源碼~。
總結(jié)
本文列舉的幾個庫都是經(jīng)常被使用的開源庫,這幾個庫你都掌握了,基本的業(yè)務開發(fā)都沒有啥問題了,一些初學者完全可以通過這幾個庫達到入門水平。還有一些庫,比如:go-redis、go-sql-driver、didi/gendry、golang/groupcache、olivere/elastic/v7等等,這些庫也是經(jīng)常使用的,入門都比較簡單,就不這里詳細介紹了。