Go業務開發中常用的幾個開源庫

語言: CN / TW / HK

前言

哈嘍,大家好,我是 asong 。拖更了好久,這周開始更新。

最近總有一些初學 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

zapuber 開源的日誌庫,選擇 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 中鉤子方法

  • 支援 PreloadJoins 的預載入
  • 事務,巢狀事務,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-redisgo-sql-driverdidi/gendrygolang/groupcacheolivere/elastic/v7 等等,這些庫也是經常使用的,入門都比較簡單,就不這裡詳細介紹了。

如果大家也有經常使用的,比較好的開源庫,歡迎推薦給我,我也學習學習!!!

好啦,本文就到這裡了,素質三連(分享、點贊、在看)都是筆者持續創作更多優質內容的動力!我是 asong ,我們下期見。

建立了讀者交流群,歡迎各位大佬們踴躍入群,一起學習交流。入群方式:關注公眾號獲取。更多學習資料請到公眾號領取。

推薦往期文章: