幾個提升Go業務開發效率的流行框架和開源庫

2021-12-24 網管叨bi叨

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

關聯 (Has One,Has Many,Belongs To,Many To Many,多態,單表繼承)Create,Save,Update,Delete,Find 中鉤子方法事務,嵌套事務,Save Point,Rollback To Saved Point批量插入,FindInBatches,Find/Create with Map,使用 SQL 表達式、Context Valuer 進行 CRUDSQL 構建器,Upsert,資料庫鎖,Optimizer/Index/Comment Hint,命名參數,子查詢靈活的可擴展插件 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進行項目管理是最好的,在代碼編譯階段就可以發現依賴注入的問題,在代碼生成時即可報出來,不會拖到運行時才報,更便於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夢工廠」,如果喜歡他的文章推薦關注!

相關焦點

  • Go業務開發中常用的幾個開源庫
    最近總有一些初學Go語言的小夥伴問我在業務開發中一般都使用什麼web框架、開源中間件;所以我總結了我在日常開發中使用到的庫,這些庫不一定是特別完美的,但是基本可以解決日常工作需求,接下來我們就來看一下。GinGin是一個用Go編寫的Web框架,它是一個類似於martini但擁有更好性能的API框架。
  • 鬥魚開源 Go 微服務框架 Jupiter
    文章整理:加米谷大數據Jupiter 是鬥魚開源的,面向服務治理的 Golang 微服務框架,以開發效率和治理效率為核心目標,從統一開發規範、完善監控埋點、降低開發難度等多個維度來幫助 Gopher 開發高性能、高可靠性的微服務框架。
  • Android 須知2019流行的框架庫及開發語言
    這幾年優秀Android的開源庫不斷推出,新技術層出不窮,需要我們不斷去了解和掌握,在提高自身開發水平的同時,我們需要付出更多學習精力和時間。俗話說,打鐵還需自身硬,為了在這個日新月異的技術時代為了生存不被淘汰,必須要求自身掌握的技術不斷跟進時代腳步,所以我們必須付出才能得到回報,說沒有時間去學習的人永遠都會有找不完的藉口。好了,閒話不多說了,下面一起來看看流行的技術吧。
  • 5款適用於移動開發人員的開源工具、框架和庫
    沒錯,程式設計師的工作繁重且苦悶,所以一定要選擇合適的工具、框架和庫,進而加快整個開發速度。無論是剛接觸移動開發的程式設計師,還是自2008年以來一直在開發iOS應用程式的程式設計師,以下五款開源工具、框架和庫,都可以解決常見的問題,加快開發速度。這些工具將幫助移動開發程式設計師簡化常見任務的工作量,如處理網絡連接,屏幕尺寸和設備資源優化等。
  • 十大流行AI框架和庫的優缺點對比
    然而,由於各種庫和框架的發展,該領域發生了巨大改進。本文,我們將研究人工智慧的高質量庫的優缺點,以及它們特點。讓我們潛入並探索這些AI庫的世界!語言:C++或Python當你進入AI時,你會聽到的第一個框架之一就是Google的TensorFlow。TensorFlow是一個使用數據流圖進行數值計算的開源框架。
  • Dubbo-go v3.0 正式發布 ——打造國內一流開源 Go 服務框架
    董劍輝(github @Mulavar),Apache Dubbo Committer,目前主要關注的開源方向為 Dubbo、Flink、Calcite。Go 語言作為最流行的雲原生語言,近些年擁有很高的熱度,一度備受國內開源生態的關注,據筆者了解,眾多企業也在近年來從自身傳統技術棧轉型 Go 語言技術棧。Go 以其開發敏捷、易用性高、入門較為容易的優勢深受廣大開發者青睞。
  • 8個可以提高開發效率的JavaScript 庫
    這一切變化首要功能應該要給谷歌瀏覽器提供的開源核心,360 瀏覽器為中國用戶普及高級瀏覽器的努力,網絡提速政策的實時。隨著 5G 技術的發展普及,未來將有大量的應用場景將由前端來承擔。今天,我跟大家分享 8 個可以提高開發效率的 JavaScript 庫,不需要花時間自己去編寫常用的基礎函數,避免重複造輪子,讓更多的精力去優化應用場景的邏輯,也提高開發效率。
  • Go 指南:頂級 Go 框架、IDE 和工具列表
    它還包括各種全面和高性能的功能,因此你不需要找外部庫集成到框架中。2、BeegoBeego 是一個完整的 MVC 框架,有自己的日誌庫、ORM 和 Web 框架。你不需要再去安裝第三方庫。Gin Gonic 是一個極簡化的框架,僅包含最重要的庫和功能。這使得它非常適合開發高性能 REST API。此外,它比 Martini 快四十倍。你可以添加中間件、嵌套組、JSON 驗證以及渲染,並依然保持其最佳性能。
  • 又一個跨端框架來了! 騰訊開源內部跨端統一開發框架:Hippy!
    :Hippy  其實早在今年年初微信也出了一套:騰訊微信發布多端統一框架 Omi還有手機QQ騰訊客戶端團隊出品了:手機QQ 開源基於Flutter 的動態化框架 MXFlutter 。Hippy 跨端框架是由QQ 瀏覽器部門發起的,針對前端開發者推出的跨端解決方案。為業內現存問題,Hippy 緊貼 W3C 標準,遵從網頁開發各項規則,從前端開發人員角度出發,使用 Javascript 為開發語言,同時支持 React 和 Vue 兩種前端主流框架。對於前端開發者而言,Hippy 上手難度會更低,學習曲線會更平滑。
  • 構建微服務的十大 Golang 框架和庫
    現在已經有很多開源庫 golang 支持構建應用程式,這些庫設計簡單,代碼乾淨,性能良好,本文為大家精心挑選了十個實用的框架和庫。
  • 十大開源安卓應用程式的開發框架
    這些程序包大多數介於「編寫一次」和原生之間,彌補了JavaScript API和包裝器框架之間的差距,同時支持一些原生功能,比如攝像頭控制功能。相比早在2012年8月那次介紹的15種行動應用程式框架,這些程序包已有了大幅改進,這不足為奇。近些年來,移動框架不僅得益於使用更廣泛的HTML5,還得益於大幅改進的組件,這些組件提升了原生應用程式功能和性能。
  • 騰訊開源:微信和移動開發的 10 大項目
    框架的細節優化,Promise,Async Functions 的引入都是為了能讓開發小程序項目變得更加簡單,高效。同時 WePY 也是一款成長中的框架,大量吸收借鑑了一些優化前端工具以及框架的設計理念和思想。如果 WePY 有不足地方,或者你有更好的想法,歡迎提交 ISSUE 或者 PR。
  • 20 個好用的 Go 語言微服務開發框架
    Go 語言是微服務開發團隊的一個很好的選擇。即使你的項目可能不需要像谷歌那樣向全世界提供電子郵件、地圖、搜索和其他雲服務,但仍然可能需要向用戶提供數十種不同的小型信息服務。谷歌決定開源 Go 語言是一個明智之舉。這門語言培育了數千個開源項目,這些項目為你的 Web 項目提供了開箱即用的構建塊。這裡列出了 20 個最有趣的開源項目,用於構建基於 Go 語言的微服務系統。
  • Go技術日報(2021-01-31)——構建微服務的十大Go框架和庫
    /2021/01/lgpl_go.html[6]資料庫是如何使用 mmap 的 : https://brunocalza.me/but-how-exactly-databases-use-mmap/[7]構建微服務的十大 Go 框架和庫 : https://keccikun.medium.com/top-10-framework-golang-library-to-build-microservice
  • 2017最好的JavaScript框架、庫和工具 — SitePoint
    我所說的「最好」的意思是「最受歡迎和流行的項目」。我所列出的所有的免費/開源的項目可能沒有你喜歡使用的那個。已經宣告死亡的項目,比如:YUI不在本文所列的列表中,即使它還有很多的使用者。本文只討論客戶端的項目。一些能在服務端工作的純服務端框架,比如:Express.js 或者 Hapi不在本文的討論列表中。
  • 我項目中用的20個輪子 開發效率提升200% 建議收藏
    可以用來快速創建手機/後臺/內部應用的UI組件庫。我的博客,就是那這個組件庫製作的。網址:https://ant.design/React Bootstrap : BootStrap我在JQuery時代就開始使用,現在已經推出了React Bootstrap, 雖然UI設計上沒什麼出彩,但是快速完成個人小項目已經足夠了。
  • Go Web開發框架基本組成
    本文目的實現在Go語言開發,搭建基本的框架信息和較優秀的組件使用介紹給大家。從而可以快速上手Go語言開發工作。服務)層,負責處理業務邏輯DAO(Repository):負責數據與存儲相關功能一、加載配置加載演示配置yaml文件如下:name: "go_web"mode: "dev"port: 8084version
  • 知乎問答:為什麼 Go 的 Web 框架速度還不如 Java?
    當然這也沒什麼花頭,java 的很多框架和 go 的異步 IO 如出一轍, 說白了還是藉助 linux 作業系統中的 epoll 等來減少進程堵塞。於是很多跑分中,語言的執行效率變得次要,在充分優化和合理使用 nonblocking IO 的情況下,一些解釋型語言也能取得很好的成績。
  • 基於Vue框架的Web組件庫
    3、對於開源的組件庫,不選擇是因為:第一,很難完全符合垂直行業業務需求,需要進行二次封裝。尤其是對於複雜表格,不如自己寫;第二,可控性低,如果別人不再維護,要承擔風險;第三,有學習成本,如果換了新的組件庫,還要再學習一遍。因此,我們沉澱出一個適用於公司雲業務的企業級Web組件庫,提升設計師和前端人員的工作效率。
  • 為什麼很多公司轉型 Go 語言開發?Go 語言能做什麼
    在Uwork的業務場景下,一次API批量請求,往往會涉及對另外接口服務的多次調用,而在之前的PHP實現模式下,要做到並行調用是非常困難的,串行處理卻不能從根本上提高處理性能。而GO語言不一樣,通過協程可以方便的實現API的並行處理,達到處理效率的最大化。依賴Golang的高性能HTTP Server,提升系統吞吐能力,由PHP的數百級別提升到數千裡甚至過萬級別。