您好,登錄后才能下訂單哦!
本篇內容介紹了“goframe, beego, iris和gin的區別有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
指標 | 說明 |
---|---|
基本介紹 | 來源各自官網。 |
模塊化設計 | 是否支持模塊化插拔設計、模塊之間低耦合設計,是否可以獨立使用其中某部分組件。 |
模塊完善度 | 框架提供的功能模塊是否豐富。模塊能否能覆蓋日常普遍的開發需求。 |
使用易用性 | 易用性不僅僅是值框架好不好用,更多是團隊能否在低成本下快速接入,長期來看能否低成本維護。 |
文檔完善性 | 參考官網提供的介紹資料,包括但不限于:文檔、視頻、示例、案例資料。同時,本地中文文檔支持也是參考項。 |
工程化完備 | 是否能夠快速接入項目開發,是否提供項目接入規范、設計模式、開發工具鏈,文檔是否完善、源碼是否易讀、是否便于長期維護。 |
開發模式 | 框架適用的開發模式,或者官方推薦的開發模式。 |
工程規范 | 項目接入時的開發規范,如目錄規范、設計規范、編碼規范、命名規范等。 |
社區活躍 | 官方與社區溝通是否便捷,問題是否能夠快速解答,BUG是否能夠快速響應處理。 |
開發工具鏈 | 項目開發時使用到的CLI開發工具,如初始化項目、交叉編譯、代碼生成、swagger、熱編譯能力等等。 |
Web: 性能測試 | 來源第三方評測 https://github.com/the-benchmarker/web-frameworks 。 |
Web: 路由沖突處理 | 存在路由注冊沖突時有無良好的解決方案,在業務項目開發中比較常見。 |
Web: 域名支持 | Web路由是否支持域名綁定,甚至多域名的綁定。 |
Web: 文件服務 | Web服務是否提供靜態資源的訪問能力。 |
Web: 優雅重啟/關閉 | Web服務在重啟時不會影響請求執行,關閉時會等待正在執行的請求處理完,新請求不再接入。 |
ORM | 框架是否自帶ORM組件,ORM組件是業務項目的核心組件。無論是自研還是通過第三方組件引入。 |
Session | 框架是否提供會話管理組件,無論是通用型Session組件,還是僅針對于Web服務的Session組件。 |
I18N支持 | 國際化組件支持(常用但非核心組件)。 |
配置管理 | 配置管理也是框架需要完備的核心組件能力。 |
日志組件 | 日志組件也是框架需要完備的核心組件能力。 |
數據校驗 | 數據校驗也是框架需要完備的核心組件能力。 |
緩存管理 | 緩存管理也是框架需要完備的核心組件能力。無論是內存還是Redis,無論是自研還是通過第三方組件引入。 |
資源打包 | 支持將依賴的文件資源例如靜態資源、配置文件等固定文件編譯到可執行文件中。框架組件自動支持資源檢索。 |
鏈路跟蹤 | 框架是否具備分布式鏈路跟蹤能力,分布式跟蹤在微服務架構中是必不可少的能力。 |
測試框架 | 框架是否支持單元測試接入,提供單元測試接入規范。無論是使用標準庫還是第三方測試框架。 |
突出優點 | 比較明顯的幾點優點。 |
突出缺點 | 比較明顯的幾點缺點。 |
以下部分對比參數涉及評分的部分,滿分總共按照10分為標準。
如果標記為"-"的部分,表示不支持或者需要引入第三方插件支持。
以下特性如果官網提供文檔則直接提供文檔地址,找不到文檔但是筆者知道有就會簡單標注。
各個"框架"功能特性實現不同,在文檔、功能、易用性上存在較大差異,各位朋友可自行查閱鏈接。
| GoFrame | Beego | Iris | Gin |
---|---|---|---|---|
比較版本 | v1.15.2 | v1.12.3 | v12.0.2 | v1.6.3 |
項目類型 | 開源(國內) | 開源(國內) | 開源(海外) | 開源(海外) |
開源協議 | MIT | Apache-2 | BSD-3-Clause | MIT |
框架類型 | 模塊化框架 | Web框架 | Web"框架" | Web"框架" |
基本介紹 | 工程完備、簡單易用,模塊化、高質量、高性能、企業級開發框架。 | 最簡單易用的企業級Go應用開發框架。 | 目前發展最快的Go Web框架。提供完整的MVC功能并且面向未來。 | 一個Go語言寫的HTTP Web框架。它提供了Martini風格的API并有更好的性能。 |
項目地址 | github.com/gogf/gf | github.com/beego/beego | github.com/kataras/iris | github.com/gin-gonic/gin |
官網地址 | goframe.org | beego.me | iris-go.com | gin-gonic.com |
模塊化設計 | 是 | - | - | - |
模塊完善度 | 10 | 6 | 4 | 2 |
使用易用性 | 9 | 9 | 9 | 10 |
文檔完善度 | 10 | 8 | 6 | 4 |
工程化完備 | 10 | 8 | 5 | 1 |
社區活躍 | 9 | 10 | 9 | 10 |
開發模式 | 模塊引入、三層架構、MVC | MVC | MVC | - |
工程規范 | 分層設計、對象設計 | 項目結構 | - | - |
開發工具鏈 | gf工具鏈 | bee工具鏈 | - | - |
Web: 性能測試 | 10 | 8 | 8 | 9 |
Web: HTTPS | HTTPS & TLS | 支持 | CustomHttpConfiguration | 支持 |
Web: HTTP2 | - | - | 支持 | 支持 |
Web: WebSocket | WebSocket服務 | 有 | 有 | - |
Web: 分組路由 | 路由注冊-分組路由 | Namespace | GroupingRoutes | 有 |
Web: 路由沖突處理 | 有 | - | 有 | - |
Web: 域名支持 | 域名綁定 | - | - | - |
Web: 文件服務 | 靜態文件服務 | 靜態文件處理 | ServingStaticFiles | 有 |
Web: 多端口/實例 | 多端口監聽、多實例監聽 | - | RunMultipleServiceUsingIris | - |
Web: 優雅重啟/關閉 | 平滑重啟特性 | 熱升級 | GracefulShutdownOrRestart | GracefulRestartOrStop |
ORM | ORM文檔 | ORM文檔 | - | - |
Session | Session | Session | 有 | - |
I18N支持 | I18N | I18N | Localization | - |
模板引擎 | 模板引擎 | View設計 | TemplateRendering | HtmlRendering |
配置管理 | 配置管理 | 參數配置 | - | CustomHttpConfig |
日志組件 | 日志組件 | Logging | - | - |
數據校驗 | 數據校驗 | 表單數據驗證 | - | CustomValidators |
緩存管理 | 緩存管理 | Cache | - | - |
資源打包 | 資源管理 | bee工具bale命令 | - | - |
鏈路跟蹤 | 鏈路跟蹤 | - | - | - |
測試框架 | 單元測試 | - | Testing | Testing |
突出優點 | goframe主要以工程化和企業級方向為主,特別是模塊化設計和工程化設計思想非常棒。針對業務項目而言,提供了開發規范、項目規范、命名規范、設計模式、開發工具鏈、豐富的模塊、高質量代碼和文檔,社區活躍。作者也是資深的PHP開發者,PHP轉Go的小伙伴會倍感親切。 | beego開源的比較早,最早的一款功能比較全面的Golang開發框架,一直在Golang領域有著比較大的影響力,作者謝大多年組織著國內影響力比較大GopherCN活動。beego有著比較豐富的開發模塊、開箱即用,提供了基于MVC設計模式的項目結構、開發工具鏈,主要定位為Web開發,當然也可以用于非Web項目開發。 | iris主要側重于Web開發,提供了Web開發的一系列功能組件,基于MVC開發模式。iris這一年發展比較快,從一個Web Server的組件,也慢慢朝著beego的設計方向努力。 | gin專注于輕量級的Web Server,比較簡單,易于理解,路由和中間件設計不錯,可以看做替代標準庫net/http.Server的路由加強版web server。獻給愛造輪子的朋友們。 |
突出缺點 | 開源時間較晚,推廣過于佛系,目前主要面向國內用戶,未推廣海外。 | 起步較早,自謝大創業后,近幾年發展較慢。非模塊化設計,對第三方重量級模塊依賴較多。 | 號稱性能最強,結果平平。非模塊化設計。最近兩年開始朝beego方向發展,但整體框架能力還不完備,需要加油。 | 功能簡單易用,既是優點,也是缺點。 |
不同的需求場景,存在不同的選擇。選擇適合的工具,解決適合的問題。
開源不存在孰好孰壞之分,開源作者能夠本著開源精神給大家分享技術成果用以學習和使用,這本身就是一件非常不易并且值得稱道的事情。
最后,筆者在這里跟大家分享一下自己所在團隊的情況,以及在Golang
技術棧轉型過程中所走的彎路,希望能在框架選型這一環節,能給大家作一定參考。
團隊轉型Golang
技術棧的一些背景。主要幾點:
團隊后端最初的主要技術棧為PHP
,由于業務發展需要,進行微服務改造。第一版微服務采用了PHP
+JsonRpc
的通信方式。
隨著項目增多,公司也組件了自己的DevOps
團隊,底層部署轉向了Docker
+Kubernetes
容器架構,并且引入了Golang
技術棧。
由于一些痛點,通過一段時間對PHP
和Golang
的比較,團隊決定快速轉型Golang
技術棧,主要痛點如下:
PHP
項目在業務復雜后、項目中后期的開發和維護成本整體偏高。主要原因還是其過高的靈活性,非結構化的變量設計,參差不齊的開發人員素質。
上云容器化部署后,PHP
的DevOps
效率太低。復雜的Composer
版本管理,超大的Docker
鏡像大小,都影響著DevOps
的效率。相比較而言,Golang
效率極其高效。
JsonRpc
通信協議設計下,接口的擴展性和靈活性很高,但服務之間很難快速確定接口的輸入與輸出定義,只能根據文檔和示例進行對接和維護。由于代碼和文檔分離,大部分場景下接口文檔維護往往滯后于接口變化。隨著服務的不斷增加,非結構化的通信協議管理使得服務接口的開發和維護成本進一步提高。
JsonRpc
的通信協議本質基于HTTP1.x
+Json
,執行效率過低,算不上真正的微服務通信協議,很難對接上主流的服務治理框架。相比較基于HTTP2.x
的gRPC
協議有著成熟微服務開發框架和服務治理解決方案。
業務梳理的考量,PHP
到Golang
技術棧的遷移,其實也是一次技術重構的契機,在技術重構的過程中也重新梳理業務系統設計,償還技術債務。
Golang
確實足夠簡單,相比較其他的解釋類開發語言,沒有過多的語法糖和語言特性,因此團隊上手很快,并快速完成了一部分業務系統的技術重構。但隨之而來的是更加嚴重的痛點。主要幾點:
輪子過多:Golang
實在太簡單了,以至于我們的團隊成員爆發了壓抑許久的悶騷勁,充分發揮"造后不管"的造輪精神,開發/封裝了許多大大小小的輪子。這些輪子均能滿足最基本的功能,例如:日志、配置、緩存等等。但輪子并不是實現一個基礎功能的半成品就了事,需要保證功能性、穩定性、擴展性和可維護性,要能結合更多生產實踐驗證,更需要能夠長期維護、持續進行迭代改進。否則,就是一堆大小不一的成人玩具。造輪一時爽,維護火葬場。直到現在,我們還在為分散在100
多個Golang
項目中的數十個成人玩具做大統一的事情痛苦不已。當然,這個問題也跟組織架構和團隊管理也有很大關系。
不成體系:
我們堅信一個package
只做一件事情,并且特地使用單倉庫包的形式進行包管理,相當于每個package
都是獨立維護的git
倉庫。其實單倉庫包和package
設計并不存在必要性,反而獨立的單倉庫包提高了組件和框架的維護成本。
這種單倉庫包設計難以形成技術體系,在團隊技術管理上,難以形成統一的技術框架。單倉包顯得很孤立,而一個技術體系的建立除了需要制定規范和標準,更需要技術框架來準確落地。一個成體系的、統一的技術框架,至少涉及到數十個基礎技術組件,不可能完全孤立設計。每一個package
的基礎功能實現都很簡單,但是如何能夠統一組織在一起卻不是一件簡單的事情,這需要團隊的技術管理者需要有一定的技術底蘊、格局和前瞻性,而不是和普通開發者那樣眼界只能局限于package
本身。
這種孤立的單倉庫包設計,對于業務項目的規范化約束不強,每一個組件都可以獨立替換,也至于痛點1的問題越發嚴重(連日志組件都好幾套,雖然都滿足基本的日志規范設計)。最終,我們最初引以為傲的單倉庫包設計,最終變成了一堆散沙。例如,就連需要增加標準化的鏈路跟蹤功能,由于單倉庫包過于散亂和不統一,使得推進改進成本極其高昂。
除了使得技術體系難以建立,技術規范難以準確落地之外,每個組件的易用性也設計得較差。舉個簡單例子,我們的日志組件、緩存組件、數據庫組件、HTTP/gRPC Server組件都需要對接配置管理功能,單倉包需要保證低耦合設計,因此開發者在使用的時候需要先手動讀取配置、并轉換為目標配置對象、并注入到對應的組件初始化方法中,隨后才能將該對象運用到業務邏輯中,若干個業務項目均是重復此步驟。其實goframe
在這塊的易用性設計就挺不錯,每個包當然是獨立設計的,在統一的技術框架體系下,再獨立提供一個耦合的單例模塊將常用的對象進行單例化封裝,自動實現配置讀取、配置對象轉換、配置對象注入及組件對象初始化,開發者僅需要調用一個單例方法即可。而這個常用單例模塊,成為了我們技術框架體系的一部分,極大地提高了業務項目的開發和維護效率。
版本不一致:在業務項目不斷增多之后,輪子版本不一致性也越來越明顯。什么是版本不一致?舉個例子。我們有個輪子叫做httpClient
,總共發布了10
來個版本;我們總共有100
多個Golang
項目,幾乎每個版本都在使用。我們提交了一個bug fix
,卻難以讓所有項目都能更新。對其他的輪子也是類似的情況,況且我們也有數十個各種輪子,被各個項目獨立使用中。
經過反思總結,總結了以下幾點:
團隊需要一個統一的技術框架,而不是東拼西湊的一堆單倉庫包。
我們只需要維護一個框架的版本,而不是維護數十個單倉庫包的版本。
框架的組件必須模塊化、低耦合設計,保證內部組件也可以獨立引用。
核心組件嚴格禁止單倉庫包設計,并且必須由框架統一維護。
走過這么多彎路之后,我們決心建立一套成體系的Golang
開發框架。除了要求團隊能夠快速學習,維護成本低,并且我們最主要的訴求,是核心組件不能是半成品,框架必須是上過大規模生產驗證的,穩定和成熟的。隨著,我們重新對行業中流行的技術框架做了技術評估,包括上面說的那些框架。原本的初衷是想將內部的各個輪子統一做一個成體系的框架,在開源項目中找一些有價值的參考。
后來找到了goframe
,仔細評估和學習了框架設計,發現框架設計思想和我們的經驗總結如出一則!
這里不得不提一件尷尬的事情。其實最開始轉Golang
之前(2019年中旬)也做過一些調研,那時goframe
版本還不高,并且我們負責評估的團隊成員有一種先入為主的思想,看到模塊和文檔這么多,感覺應該挺復雜,性能應該不高,于是沒怎么看就PASS。后來選擇一些看起來簡單的開源輪子自己做了些二次封裝。
這次經過一段時間的仔細調研和源碼學習,得出一個結論,goframe
框架的框架架構、模塊化和工程化設計思想非常棒,執行效率很高,模塊不僅豐富,而且質量之高,令人驚嘆至極!相比較我們之前寫的那些半成品輪子,簡直就是小巫見大巫。團隊踩了一年多的坑,才發現團隊確實需要一個統一的技術框架而不是一堆不成體系的輪子,其實人家早已給了一條明光大道,并且一直在前面默默努力。
經過團隊內部的調研和討論,我們決定使用goframe
逐步重構我們的業務項目。由于goframe
是模塊化設計的,因此我們也可以對一些模塊做必要的替換。重構過程比較順利,基礎技術框架的重構并不會對業務邏輯造成什么影響,反而通過goframe
的工程化思想和很棒的開發工具鏈,在統一技術框架后,極大地提高了項目的開發和維護效率,使得團隊可以專心于業務開發,部門也陸續有了更多的產出。目前我們已經有大部門業務項目專向了goframe
。平臺每日流量千萬級別。
“goframe, beego, iris和gin的區別有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。