20 个有用的 Go 语言微服务开发框架
2007 年,谷歌的一個(gè)團(tuán)隊(duì)在調(diào)研計(jì)算機(jī)編程語(yǔ)言時(shí),發(fā)現(xiàn)有數(shù)百種可用于開(kāi)發(fā)軟件的語(yǔ)言,但沒(méi)有一種能提供谷歌真正需要的特性。有些語(yǔ)言太過(guò)底層,有些又太過(guò)復(fù)雜,有些特性對(duì)他們來(lái)說(shuō)反而會(huì)礙手礙腳。谷歌的開(kāi)發(fā)人員想要的語(yǔ)言要簡(jiǎn)單到可以在幾個(gè)小時(shí)內(nèi)學(xué)會(huì),但又要復(fù)雜到足以應(yīng)付現(xiàn)代互聯(lián)網(wǎng)的信息流。
他們的解決方案就是 Go 語(yǔ)言,這門(mén)語(yǔ)言對(duì)于 C 語(yǔ)言、Java 或 JavaScript 程序員來(lái)說(shuō)——換句話說(shuō),就是所有的程序員——都很容易掌握。Go 語(yǔ)言提供了足夠的特性來(lái)編寫(xiě)循環(huán)和代碼塊,但沒(méi)有一個(gè)特性是需要很長(zhǎng)的時(shí)間才能掌握的。內(nèi)置的例程經(jīng)過(guò)優(yōu)化,可以從互聯(lián)網(wǎng)獲取數(shù)據(jù)和發(fā)送數(shù)據(jù)。其他的東西——即使是非常聰明的想法——都被排除在外。
Go 語(yǔ)言是微服務(wù)開(kāi)發(fā)團(tuán)隊(duì)的一個(gè)很好的選擇。即使你的項(xiàng)目可能不需要像谷歌那樣向全世界提供電子郵件、地圖、搜索和其他云服務(wù),但仍然可能需要向用戶提供數(shù)十種不同的小型信息服務(wù)。
谷歌決定開(kāi)源 Go 語(yǔ)言是一個(gè)明智之舉。這門(mén)語(yǔ)言培育了數(shù)千個(gè)開(kāi)源項(xiàng)目,這些項(xiàng)目為你的 Web 項(xiàng)目提供了開(kāi)箱即用的構(gòu)建塊。這里列出了 20 個(gè)最有趣的開(kāi)源項(xiàng)目,用于構(gòu)建基于 Go 語(yǔ)言的微服務(wù)系統(tǒng)。從專注于消息傳遞、路由、錯(cuò)誤處理或 API 的小工具包,到用于構(gòu)建 MVC Web 應(yīng)用程序的更全面的框架,你將發(fā)現(xiàn),使用 Go 語(yǔ)言開(kāi)發(fā)微服務(wù)有著非常豐富的選擇。
Beego
https://beego.me/
Beego 框架提供了很多標(biāo)準(zhǔn)附加功能,例如全功能路由器和可用于執(zhí)行 CRUD 操作的對(duì)象到數(shù)據(jù)庫(kù)映射工具。Bee 是 Beego 愛(ài)好者的最愛(ài),它是一個(gè)快速而強(qiáng)大的命令行工具,用于構(gòu)建、更新、打包和部署應(yīng)用程序。Bee 可以從模板生成源代碼,并保持?jǐn)?shù)據(jù)庫(kù)的最新?tīng)顟B(tài)。
Buffalo
https://gobuffalo.io/en
Buffalo 團(tuán)隊(duì)需要能夠?qū)?Web 應(yīng)用程序的所有部分組裝在一起的東西,包括應(yīng)用程序本身的一些設(shè)計(jì)。他們把能夠安裝在一起的很多部件叫作“生態(tài)系統(tǒng)”。如果你想要路由——很少有人不需要——Buffalo 就包含了 Gorilla/Mux。如果你需要模板,Buffalo 傾向于使用 Plush,而不是使用內(nèi)置的 Go 語(yǔ)言模板機(jī)制。數(shù)據(jù)庫(kù)連接模塊集合 Pop 可以幫你將數(shù)據(jù)庫(kù)信息轉(zhuǎn)換為 Go 對(duì)象。你還可以找到連接數(shù)據(jù)庫(kù)、處理 cookie 以及完成其他任務(wù)的標(biāo)準(zhǔn)方法。
Cobra
https://github.com/spf13/cobra
有時(shí)候,你只需要一個(gè)命令行界面。Cobra 提供了 CLI 的所有標(biāo)準(zhǔn)功能,因此你不必浪費(fèi)時(shí)間實(shí)現(xiàn)代碼來(lái)查找 -h 或 -help 標(biāo)志。如果你的微服務(wù)需要對(duì)具有大量標(biāo)志和其他功能的命令行調(diào)用做出響應(yīng),那么可以考慮集成 Cobra。
Docker
你當(dāng)然可以在辦公室服務(wù)器小黑屋里的裸機(jī)上運(yùn)行微服務(wù),但越來(lái)越多的人將他們的代碼捆綁在 Docker 容器中,并將容器發(fā)到云端。小型的包更容易處理大量不同的代碼塊,當(dāng)你對(duì)微服務(wù)架構(gòu)的愿景要求你創(chuàng)建很多小的獨(dú)立代碼塊時(shí),這將是一項(xiàng)有價(jià)值的服務(wù)。
值得一提的是,Docker 是用 Go 語(yǔ)言開(kāi)發(fā)的,盡管在部署 Docker 容器時(shí)你可能永遠(yuǎn)不會(huì)想到這一點(diǎn)。Docker 社區(qū)版是開(kāi)源的,所以如果有必要,你可以參與其中,但很可能你只是將 Docker 作為部署微服務(wù)的工具。Go 語(yǔ)言愛(ài)好者之所以想要記住 Docker 是用 Go 語(yǔ)言開(kāi)發(fā)的這一事實(shí),是因?yàn)闊o(wú)處不在的 Docker 有力地證明了他們對(duì)這門(mén)語(yǔ)言的支持。
Echo
https://echo.labstack.com/
Echo 是一個(gè)極簡(jiǎn)框架,但它提供了很多最重要的組件。路由器可以將 URL 拆解,然后將拆解的各個(gè)部份轉(zhuǎn)換為參數(shù),因此你無(wú)需自行解析它們。然后,你可以混合使用身份驗(yàn)證、表單解析、壓縮和合理性限制。你可以專注于從函數(shù)中返回正確的信息。
Errors
https://github.com/juju/errors
有時(shí)候,API 的用戶會(huì)傳遞錯(cuò)誤的參數(shù)。你可以自己處理這些參數(shù),也可以把它們創(chuàng)給 Errors,這是一個(gè)可以自動(dòng)執(zhí)行大部分跟蹤的庫(kù),方便進(jìn)行調(diào)試。當(dāng)發(fā)生錯(cuò)誤時(shí),Errors 會(huì)使用注釋來(lái)詳細(xì)說(shuō)明出錯(cuò)的地方和位置。
Gin
https://github.com/gin-gonic/gin
Gin 是 Martini(https://github.com/go-martini/martini)的下一代框架。可以說(shuō),Gin 拋棄了那些額外的東西,專注于提供最有用的部分。花費(fèi)大量時(shí)間構(gòu)建 Node.js 微服務(wù)的開(kāi)發(fā)人員會(huì)感到賓至如歸。你可以實(shí)例化一個(gè)對(duì)象,然后附加函數(shù)來(lái)處理特定的調(diào)用,這樣就可以創(chuàng)建一個(gè)微服務(wù)。Gin 負(fù)責(zé)處理路由,而你的函數(shù)處理業(yè)務(wù)邏輯。如果不去考慮標(biāo)點(diǎn)符號(hào),它的代碼甚至看起來(lái)有點(diǎn)像 Node.js 代碼。
Ginkgo
https://onsi.github.io/ginkgo/
測(cè)試可能是微服務(wù)開(kāi)發(fā)當(dāng)中最具挑戰(zhàn)性的事情。Ginkgo 通過(guò)行為驅(qū)動(dòng)測(cè)試擴(kuò)展了標(biāo)準(zhǔn) Go 發(fā)行版的內(nèi)置測(cè)試機(jī)制。Ginkgo 提供了一種高級(jí)機(jī)制,用于指定函數(shù)或服務(wù)應(yīng)該產(chǎn)生哪些結(jié)果。結(jié)果通常使用 Ginkgo 提供的 Gomega 匹配器(http://onsi.github.io/gomega/)進(jìn)行評(píng)估,但如果你愿意,也可以使用不同的匹配器庫(kù)。
Ginkgo 是一個(gè)全面的框架,提供了各種選項(xiàng),用于設(shè)置測(cè)試數(shù)據(jù)、運(yùn)行測(cè)試以及在事后釋放測(cè)試數(shù)據(jù)。你只需要描述結(jié)果,然后讓 Ginkgo 處理其他的事情。
Goa
https://github.com/goadesign/goa
如果你是一個(gè)曾經(jīng)使用 Ruby 和 Praxis 框架的開(kāi)發(fā)人員,或者是一個(gè)欣賞設(shè)計(jì)語(yǔ)言的強(qiáng)大力量人,那么你會(huì)在 Goa 中找到很多你喜歡的東西。你本身不需要編寫(xiě) Go 代碼。你使用 Goa DSL 為 API 編寫(xiě)設(shè)計(jì)規(guī)范,然后 Goa 將其轉(zhuǎn)換為可執(zhí)行的 Go 代碼。DSL 針對(duì)微服務(wù) API 進(jìn)行了優(yōu)化,并強(qiáng)制你的設(shè)計(jì)遵循標(biāo)準(zhǔn)的架構(gòu)。
Gorilla
http://www.gorillatoolkit.org/
Gorilla 項(xiàng)目提供了一系列你需要的模塊。Gorilla 的 Mux(http://www.gorillatoolkit.org/pkg/mux)路由器被很多其他框架使用,因?yàn)樗糜昧恕:芏嘤脩糁允褂?Gorilla,是因?yàn)?websocket(http://www.gorillatoolkit.org/pkg/websocket)。
Gotify
https://github.com/gotify/server
同步一組微服務(wù)所面臨的一個(gè)挑戰(zhàn)是建立有效的消息傳遞節(jié)點(diǎn)。Gotify 是一個(gè)簡(jiǎn)單的服務(wù)器,用于發(fā)送和接收消息,將你的微服務(wù)集合與持續(xù)存儲(chǔ)的消息組合在一起。最有用的部分可能是它的 Web 接口,可幫助開(kāi)發(fā)者應(yīng)對(duì)最令人頭疼的調(diào)試問(wèn)題。
Hugo
https://github.com/gohugoio/hugo
Hugo 是一種靜態(tài)站點(diǎn)生成器,可以用這個(gè)框架構(gòu)建的微服務(wù)并不多,但如果網(wǎng)站只有有限的重復(fù)查詢答案時(shí),這是一個(gè)值得考慮的選項(xiàng)。Hugo 一次生成答案,然后可以重復(fù)使用。如果你已經(jīng)已 HTML 格式提供答案,那么 Hugo 會(huì)非常有用。
Kite
https://github.com/koding/kite
如果你希望建立一個(gè)更加可控的服務(wù)群體,而不是通常的服務(wù)之間的互動(dòng),那么可以考慮一下 Kite。Kite 的目標(biāo)是讓微服務(wù)之間的通信協(xié)調(diào)變得更簡(jiǎn)單一些。來(lái)自 Kite 以外的 API 調(diào)用通過(guò) websocket 進(jìn)入,然后 Kite 使用更快、更低級(jí)別的套接字連接(基于 dnode)傳遞新消息。中間有一個(gè)叫作 Kontrol 的服務(wù)注冊(cè)表和身份驗(yàn)證服務(wù)。如果你需要經(jīng)常交換消息和協(xié)調(diào)很多的操作,那么在不同服務(wù)器之間添加這一層會(huì)讓一切變得更快。
Logrus
https://github.com/sirupsen/logrus
要跟蹤 API 的流入和流出數(shù)據(jù)和可能產(chǎn)生的錯(cuò)誤,通常需要將日志寫(xiě)入文件中。這個(gè)過(guò)程可以很簡(jiǎn)單,比如在一個(gè)打開(kāi)的文件中寫(xiě)入一行行的數(shù)據(jù),但通常使用完整的日志框架會(huì)更好。Logrus 提供了格式化程序來(lái)標(biāo)準(zhǔn)化你的日志輸出,并讓后續(xù)的自動(dòng)化日志文件分析變得更容易。不要嘗試自己開(kāi)發(fā)日志代碼,使用像 Logrus 這樣的庫(kù)會(huì)事半功倍。
Nano
https://github.com/pasztorpisti/nano
構(gòu)建一個(gè)微服務(wù)并不需要太多東西,Nano 就是一個(gè)極簡(jiǎn)主義的例子。它的實(shí)際代碼不會(huì)超過(guò) 200 行,如果算上注釋也只有 400 多行。你只需要幾行代碼就可以構(gòu)建一個(gè)微服務(wù)——只包含處理請(qǐng)求所需的業(yè)務(wù)邏輯。這個(gè)框架還有一些其他不錯(cuò)的特性,例如與語(yǔ)言無(wú)關(guān)的 API 結(jié)構(gòu),這樣你的 Go 代碼就可以與使用其他語(yǔ)言開(kāi)發(fā)的服務(wù)發(fā)生交互。它還提供了一個(gè)測(cè)試過(guò)程來(lái),可以嵌入你的本地測(cè)試?yán)獭:?jiǎn)簡(jiǎn)單單,但卻恰到好處。
Negroni
https://github.com/urfave/negroni
有些人看完 Martini 后,決定走一條更簡(jiǎn)單的道路。他們剝離了路由器和其他一些東西,創(chuàng)建了 Negroni,這是一個(gè)非常小型的工具,除了處理標(biāo)準(zhǔn)文件、自定義請(qǐng)求、從基本錯(cuò)誤中恢復(fù)以及保留日志之外,它不會(huì)做更多的工作。如果你想要額外的東西,可以自己加入。Negroni 團(tuán)隊(duì)也提供了一系列與可以與 Negroni 一起使用的小型項(xiàng)目。
Renderer
https://github.com/thedevsaddam/renderer
在準(zhǔn)備輸出響應(yīng)時(shí),你需要獲取數(shù)據(jù)并將其插入到模板中。Renderer 提供了各種輸出格式(JSON、JSONP、XML、YAML、HTML、文件)和一個(gè)漂亮、快速和標(biāo)準(zhǔn)的模板引擎。
Revel
https://revel.github.io/
Revel 借鑒了 Webpack 的一個(gè)簡(jiǎn)潔的特性,這讓 Revel 看起來(lái)就像一個(gè) IDE 一樣,或者至少是 IDE 的一部分,每當(dāng)你對(duì)代碼做出更改,它會(huì)持續(xù)地重新構(gòu)建你的項(xiàng)目。當(dāng)你保存修改后,Revel 會(huì)檢測(cè)到更改,然后就編譯代碼,如果沒(méi)有編譯錯(cuò)誤,就啟動(dòng)應(yīng)用程序。因此,Revel 服務(wù)器會(huì)自動(dòng)部署修改的碼——在桌面上進(jìn)行開(kāi)發(fā)時(shí)這項(xiàng)功能非常好用,或許對(duì)于生產(chǎn)環(huán)境代碼部署來(lái)說(shuō)也是有點(diǎn)誘人的。
這個(gè)框架本身功能齊全,它提供了模板、緩存、驗(yàn)證和過(guò)濾器。如果你正在構(gòu)建很多微服務(wù),它還提供了一個(gè)模塊系統(tǒng),讓你可以在項(xiàng)目之間共享一些 MVC 組件。
Testify
https://github.com/stretchr/testify
使用斷言的最簡(jiǎn)單方法之一是使用 Testify,它是一個(gè) Go 語(yǔ)言項(xiàng)目,還提供了模擬工具,用于快速測(cè)試大型微服務(wù)的各個(gè)部分。只需要幾行代碼就編寫(xiě)一些基本測(cè)試用例。
Tollbooth
https://github.com/didip/tollbooth
在你發(fā)布 API 之后,當(dāng)然希望來(lái)自世界各個(gè)角落的人都可以調(diào)用它。但當(dāng)你的服務(wù)器發(fā)生熔斷,或者你看一看為了獲得彈性而為云托管賬戶支付的費(fèi)用時(shí),你可能會(huì)改變主意。Tollbooth 是一個(gè)用于限制傳入請(qǐng)求的輕量級(jí)系統(tǒng)。限制前門(mén)的流量就等于減少了對(duì)管道中微服務(wù)或數(shù)據(jù)庫(kù)的需求,讓一切保持運(yùn)行順暢。
不使用框架
你只需從頭開(kāi)始編寫(xiě) Go 代碼,不需要導(dǎo)入任何依賴項(xiàng)或者實(shí)例化任何控制對(duì)象。使用 Go 語(yǔ)言創(chuàng)建微服務(wù)其實(shí)很容易,因?yàn)樗呀?jīng)內(nèi)置了很多基本代碼。這就是為什么只用幾百行代碼就可以構(gòu)建出像 Nano 這樣的框架。
監(jiān)聽(tīng)套接字、解壓縮 HTTP 請(qǐng)求等工作都是通過(guò)標(biāo)準(zhǔn)庫(kù)完成的。雖然框架提供了一些額外的功能,但很多時(shí)候如果你需要一個(gè)非常基本的微服務(wù),就不需要用到框架。太多的“附加功能”可能反而會(huì)妨礙你,而且 Go 開(kāi)發(fā)人員可能會(huì)說(shuō),太多的依賴反而讓 Go 語(yǔ)言變得更復(fù)雜。
英文原文:https://www.infoworld.com/article/3326530/google-go/20-go-projects-for-mastering-microservices.html
總結(jié)
以上是生活随笔為你收集整理的20 个有用的 Go 语言微服务开发框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: python 运行日志logging代替
- 下一篇: mac安装mysql遇到的坑
