助你掌控微服務(wù)架構(gòu)的20個(gè)Go語(yǔ)言項(xiàng)目
譯文【51CTO.com快譯】從用于消息傳遞和路由的工具包到API設(shè)計(jì)和應(yīng)用程序框架,當(dāng)你需要構(gòu)建微服務(wù)的時(shí)候,Go語(yǔ)言擁有你需要的一切內(nèi)容。
當(dāng)Google的編碼團(tuán)隊(duì)在2007年瀏覽計(jì)算機(jī)語(yǔ)言時(shí),他們看到了數(shù)百種用于編寫軟件的非常好的工具,但是沒(méi)有一種工具能為谷歌提供合適的功能,一種能夠支持在谷歌龐大的服務(wù)器集合中構(gòu)建谷歌軟件包所有需求的語(yǔ)言。
有些語(yǔ)言太專注于堆棧的底層。有些又太復(fù)雜了,充斥著許多只會(huì)礙事的功能。而谷歌開(kāi)發(fā)人員想要一種簡(jiǎn)單的語(yǔ)言,可以在幾個(gè)小時(shí)內(nèi)學(xué)會(huì),但又足夠復(fù)雜,能夠處理現(xiàn)代互聯(lián)網(wǎng)上的信息流。
其解決方案就是Go,一種在C、Java或JavaScript環(huán)境下長(zhǎng)大的程序員都會(huì)熟悉的語(yǔ)言——換句話說(shuō),幾乎每個(gè)程序員都熟悉這種語(yǔ)言。Go擁有足夠的功能來(lái)編寫一些循環(huán)和編碼塊,但是又很少有需要你花大量時(shí)間才能掌握的高級(jí)特性。內(nèi)置的經(jīng)過(guò)優(yōu)化的程序可以方便的從互聯(lián)網(wǎng)上獲取數(shù)據(jù)。而除此以外的一切,無(wú)論看起來(lái)有多么巧妙,都被忽略了。
Go對(duì)于基于微服務(wù)架構(gòu)構(gòu)建應(yīng)用程序的團(tuán)隊(duì)來(lái)說(shuō)是一個(gè)很好的選擇,因?yàn)檫@些服務(wù)的體量對(duì)于谷歌今天所運(yùn)行的服務(wù)來(lái)說(shuō)不值一提。你的項(xiàng)目可能不會(huì)向全世界來(lái)提供電子郵件、地圖、搜索和無(wú)數(shù)其他的云服務(wù),但最終它仍可能會(huì)向用戶提供數(shù)十種不同的小型信息服務(wù)。每一個(gè)微服務(wù)項(xiàng)目相比來(lái)說(shuō)都只是谷歌服務(wù)的一個(gè)微版本或者納米版本。
谷歌決定開(kāi)源Go是一個(gè)明智之舉。這種語(yǔ)言培育了成千上萬(wàn)的項(xiàng)目,而最終這些項(xiàng)目為你的Web項(xiàng)目提供了基礎(chǔ)。這種豐富的傳統(tǒng)使得并行工作的團(tuán)隊(duì)能夠更容易的創(chuàng)建自己的服務(wù)群。
以下是20個(gè)最有趣的開(kāi)源項(xiàng)目,可用于幫助你構(gòu)建自己的Go微服務(wù)網(wǎng)絡(luò)。從專注于消息傳遞、路由、錯(cuò)誤處理或API的小工具包,到構(gòu)建MVC Web應(yīng)用程序的完整框架,你會(huì)發(fā)現(xiàn)許多的基于Go語(yǔ)言開(kāi)發(fā)的微服務(wù)工具包。
1.Beego
Beego框架包括了許多擁有額外標(biāo)準(zhǔn)的附加功能,例如全功能路由器和具有CRUD操作的對(duì)象到數(shù)據(jù)庫(kù)映射器,幾乎可以開(kāi)箱即用。 許多Beego粉絲最喜歡的工具就是 Bee tool了,這是一個(gè)快速而強(qiáng)大的命令行工具,用于構(gòu)建,更新,打包和部署應(yīng)用程序。 Bee tool能夠從模板生成源代碼并時(shí)刻保持最新的數(shù)據(jù)庫(kù)。
2.Buffalo
許多微服務(wù)框架所提供的功能都只是淺嘗輒止而已。 但Buffalo團(tuán)隊(duì)需要的是一個(gè)能夠組裝Web應(yīng)用程序的所有部分的東西,包括應(yīng)用程序本身的一些設(shè)計(jì)。他們喜歡稱之為“生態(tài)系統(tǒng)”,因?yàn)樵S多部件可以安裝在一起。如果你想要路由功能(很少有人不愿意),你就可以將Gorilla/Mux項(xiàng)目組裝進(jìn)來(lái)。如果你需要模板,Buffalo會(huì)更喜歡Plush而不是內(nèi)置的Go機(jī)制。一個(gè)名為Pop的泛數(shù)據(jù)庫(kù)連接模塊將幫助你將數(shù)據(jù)庫(kù)信息轉(zhuǎn)換為Go對(duì)象。你還可以找到連接數(shù)據(jù)庫(kù),處理Cookie以及完成幾乎所有其他你能夠想象到的標(biāo)準(zhǔn)方法。
3.Cobra
有時(shí)候,你只想為你的代碼提供一個(gè)命令行界面。Cobra已準(zhǔn)備好處理CLI的所有標(biāo)準(zhǔn)功能了,因此你無(wú)需再浪費(fèi)時(shí)間實(shí)現(xiàn)代碼來(lái)查找-h或-help標(biāo)志。如果你的微服務(wù)將響應(yīng)具有大量標(biāo)志和其他功能的命令行調(diào)用,那么你將需要集成Cobra。
4.Docker
你可以在任何機(jī)器上運(yùn)行你的微服務(wù)代碼,包括你辦公室中那個(gè)被遺忘已久的服務(wù)器機(jī)房中的老機(jī)器,但是越來(lái)越多的人開(kāi)始選擇將他們的代碼打包在Doker容器中,并將這些容器發(fā)送到云端。這些小軟件包使得處理大量不同的代碼塊變得更加容易——當(dāng)你對(duì)微服務(wù)體系結(jié)構(gòu)的愿景要求你創(chuàng)建許多獨(dú)立的小代碼塊時(shí),這是一項(xiàng)很有價(jià)值的服務(wù)。
值得一提的是Doker是用Go編寫的,盡管在部署Doker容器時(shí),你可能永遠(yuǎn)不需要去關(guān)心這個(gè)。Doker社區(qū)版是開(kāi)源的,所以如果你需要的話,你可以繼續(xù)使用它,但是很可能你只需要用Doker作為工具來(lái)部署你自己的微服務(wù)項(xiàng)目。Go粉絲想要記住Doker是用Go寫的,真正的原因是Doker的無(wú)處不在是對(duì)該語(yǔ)言的有力支持。
5.Echo
Echo是一個(gè)極簡(jiǎn)主義的框架,但它有許多最重要的組件來(lái)傳遞比特信息。其路由器將解析URL并將部分?jǐn)?shù)據(jù)轉(zhuǎn)換成參數(shù),這樣你就不需要解析它們了。然后,你就可以混合使用身份驗(yàn)證、表單解析、壓縮以及其他合理的限制。這讓你可以集中精力于從函數(shù)中返回正確的信息。
6.Errors
有時(shí),API的用戶會(huì)傳遞需要標(biāo)記的錯(cuò)誤參數(shù)。你可以自己處理這個(gè)問(wèn)題,也可以將它傳遞給Errors,這是一個(gè)庫(kù),它將自動(dòng)執(zhí)行大部分跟蹤以幫助調(diào)試。當(dāng)錯(cuò)誤發(fā)生時(shí),Errors會(huì)用注釋來(lái)包裝它,詳細(xì)說(shuō)明出了什么問(wèn)題,以及哪里出了問(wèn)題。
7.Gin
可能這個(gè)名稱聽(tīng)起來(lái)不太顯眼,但Gin項(xiàng)目其實(shí)是受歡迎的Martini框架的下一代。你可能會(huì)說(shuō)Gin只是扔掉了些多余的東西,并專注于那些最有魅力的部分而已。但那些花了大量時(shí)間來(lái)構(gòu)建Node.js微服務(wù)應(yīng)用程序的開(kāi)發(fā)人員則會(huì)感到賓至如歸。通過(guò)實(shí)例化對(duì)象,然后附加一個(gè)函數(shù)來(lái)處理特定調(diào)用,你就可以在Gin中創(chuàng)建一個(gè)微服務(wù)。Gin負(fù)責(zé)處理路由,而你的函數(shù)則負(fù)責(zé)提供業(yè)務(wù)邏輯。如果你忽略掉一些標(biāo)點(diǎn)符號(hào),它甚至看起來(lái)就像是Node.js的代碼。
8.Ginkgo
測(cè)試可能是微服務(wù)開(kāi)發(fā)中最具挑戰(zhàn)性的領(lǐng)域了。Ginkgo通過(guò)行為驅(qū)動(dòng)的測(cè)試擴(kuò)展了標(biāo)準(zhǔn)Go發(fā)行版的內(nèi)置測(cè)試機(jī)制。其測(cè)試語(yǔ)言提供了一種高級(jí)機(jī)制,用于拼寫出特定功能或服務(wù)應(yīng)該生成的內(nèi)容。結(jié)果通常是使用Ginkgo自己的Gomega匹配器來(lái)進(jìn)行評(píng)估的,但如果你愿意,也可以使用不同的匹配器庫(kù)。
Ginkgo是一個(gè)復(fù)雜的框架,具有各種選項(xiàng),用于設(shè)置測(cè)試數(shù)據(jù),運(yùn)行測(cè)試以及在事后切斷測(cè)試數(shù)據(jù)。這個(gè)結(jié)構(gòu)鼓勵(lì)你對(duì)結(jié)果進(jìn)行描述,然后讓Ginkgo來(lái)處理其他的所有事情。
9.Goa
如果你是一名過(guò)去使用Ruby和Praxis框架的開(kāi)發(fā)人員,或者你只是一個(gè)想要欣賞設(shè)計(jì)語(yǔ)言的力量和準(zhǔn)則的人,那么你會(huì)在Goa中找到許多喜歡的東西。你本身不需要寫Go代碼。你可以在Goa DSL中為API編寫一個(gè)設(shè)計(jì)規(guī)范,然后Goa就會(huì)將其轉(zhuǎn)換為執(zhí)行該工作的Go代碼。DSL針對(duì)微服務(wù)API進(jìn)行了優(yōu)化,并會(huì)強(qiáng)制你的設(shè)計(jì)符合標(biāo)準(zhǔn)架構(gòu)。
10.Gorilla
Gorilla項(xiàng)目是另一個(gè)旨在幫助你快速交付大部分你所需要模塊的大集合。Gorilla的Mux路由模塊被許多其他框架所使用,因?yàn)樗拇_非常好用。許多用戶指出websocket代碼是他們采用Gorilla的主要原因。
11.Gotify
同步一組微服務(wù)的挑戰(zhàn)之一是建立有效的消息傳遞節(jié)點(diǎn)。 Gotify是一個(gè)簡(jiǎn)單的服務(wù)器,用于發(fā)送和接收消息,將你的微服務(wù)集合與持續(xù)存儲(chǔ)的消息組合在一起。最有用的部分可能是其中用來(lái)幫助調(diào)試的Web界面,這是一項(xiàng)非常困難的任務(wù)。
12.Hugo
使用像Hugo這樣的靜態(tài)站點(diǎn)生成器可以構(gòu)建的微服務(wù)不多,但是當(dāng)重復(fù)查詢的答案數(shù)量有限時(shí),這就是一個(gè)值得考慮的選項(xiàng)了。Hugo會(huì)一次又一次地吐出答案,然后他們又會(huì)一次又一次地被送達(dá)。當(dāng)你的答案已經(jīng)以HTML格式提供時(shí),這個(gè)項(xiàng)目就非常有用。
13.Kite
如果你希望建立一個(gè)更加嚴(yán)格控制的服務(wù)群體,并且不希望服務(wù)之間的交互超過(guò)通常的數(shù)量,請(qǐng)了解一下Kite。Kite是為了讓使微服務(wù)通信的協(xié)調(diào)更加簡(jiǎn)單而生的。來(lái)自非Kites的API調(diào)用通過(guò)websocket進(jìn)入,然后就會(huì)使用更快,更低級(jí)別的套接字連接來(lái)(基于dnode)傳遞新消息。一個(gè)名為Kontal的服務(wù)注冊(cè)和認(rèn)證服務(wù)則位于中間。如果你需要頻繁的交換信息,協(xié)調(diào)許多操作,在不同服務(wù)器之間添加這一層互連可以使一切變得更快。
14.Logrus
跟蹤流入和流出API的數(shù)據(jù)及其可能產(chǎn)生的錯(cuò)誤通常意味著需要編寫日志文件。這個(gè)過(guò)程可以像將一行數(shù)據(jù)寫入一個(gè)打開(kāi)的文件一樣簡(jiǎn)單,但是包含一個(gè)完整的日志框架以及所有額外的特性和結(jié)構(gòu)通常是有意義的。Logrus提供了一個(gè)格式化程序來(lái)標(biāo)準(zhǔn)化你的輸出,并使以后任何日志文件分析的自動(dòng)化變得更加容易。請(qǐng)不要編寫自己的快速而骯臟的日志記錄代碼。使用像Logros這樣的庫(kù)吧。
15.Nano
建立一個(gè)微服務(wù)并不需要太多東西。簡(jiǎn)單的Nano項(xiàng)目是一個(gè)很好的例子。實(shí)際代碼不超過(guò)200行,如果算上評(píng)論,也只有400多行。然而,你可以用你自己的幾行代碼來(lái)建立一個(gè)微服務(wù)——一個(gè)將封裝處理請(qǐng)求所需的業(yè)務(wù)邏輯的微服務(wù)。這個(gè)框架還有一些其他的優(yōu)點(diǎn),比如一個(gè)語(yǔ)言無(wú)關(guān)的API結(jié)構(gòu),因此你的Go代碼可以很好地與其他語(yǔ)言編寫的任何其他服務(wù)一起使用。然后你還需要有一個(gè)很好的測(cè)試過(guò)程來(lái)嵌入你自己的本地測(cè)試程序。沒(méi)有更多的,但這就是重點(diǎn)。
16.Negroni
有些人不滿意Martini的復(fù)雜,決定采取一個(gè)更簡(jiǎn)單的方向發(fā)展。他們?nèi)サ袅寺酚晒δ芎推渌麕讉€(gè)部分來(lái)創(chuàng)建了Negroni,這是一個(gè)非常小的工具,除了提供一些標(biāo)準(zhǔn)文件、處理你的定制請(qǐng)求、從基本問(wèn)題中恢復(fù)并保存日志之外,它不會(huì)做更多的工作了。如果你想要額外的東西,你可以自己混合它們。 Negroni團(tuán)隊(duì)提供了一系列與他們合作的小型項(xiàng)目。
17.Renderer
當(dāng)你準(zhǔn)備輸出時(shí),你需要獲取數(shù)據(jù)并將其插入到模板中。 Renderer是一個(gè)提供各種輸出格式(JSON,JSONP,XML,YAML,HTML)和一個(gè)漂亮,快速和標(biāo)準(zhǔn)的模板引擎的項(xiàng)目。
18.Revel
Revel借用了Node.js的Webpack世界中的一個(gè)簡(jiǎn)潔的特性,能夠讓Revel像IDE一樣工作,或者至少是部分的IDE,每當(dāng)你對(duì)代碼進(jìn)行更改時(shí),它都會(huì)不斷地重建你的項(xiàng)目。一旦你按下save,框架就會(huì)感知到變化,編譯代碼,如果沒(méi)有編譯錯(cuò)誤,就會(huì)啟動(dòng)應(yīng)用程序。因此,Revel服務(wù)器將自動(dòng)部署對(duì)其代碼的更改——這非常適合在桌面上開(kāi)發(fā),對(duì)于生產(chǎn)中的代碼來(lái)說(shuō)可能有點(diǎn)太誘人了。
該框架本身功能齊全,具有功能最豐富的所有主要和次要機(jī)制。這意味著模板、緩存、驗(yàn)證和過(guò)濾器會(huì)在數(shù)據(jù)流經(jīng)請(qǐng)求管道時(shí)對(duì)其進(jìn)行操作。如果你正在構(gòu)建許多微服務(wù),那么也有一個(gè)模塊系統(tǒng)允許你在項(xiàng)目之間共享一些MVC組件。
19.Testify
使用經(jīng)典斷言測(cè)試的最簡(jiǎn)單的方法之一是使用Testify,這是一個(gè)Go項(xiàng)目,它也提供了模擬工具來(lái)快速測(cè)試大量微服務(wù)的各個(gè)部分。只需幾行就可以編寫一些基本測(cè)試,然后自動(dòng)檢查代碼是否返回了正確的響應(yīng)。
20.Tollbooth
當(dāng)你第一次發(fā)布API時(shí),你希望世界上的每個(gè)人都調(diào)用它。但是,當(dāng)你的服務(wù)器崩潰——或者你看著你的云托管彈性服務(wù)賬單急速膨脹時(shí)——你就會(huì)改變主意的。Tollbooth是一個(gè)輕量級(jí)的系統(tǒng),用于將傳入請(qǐng)求限制為每秒一定數(shù)量。切斷入口的需求減少了管道下游對(duì)微服務(wù)或數(shù)據(jù)庫(kù)的需求,讓你能夠讓一切保持順利運(yùn)行。
21.None
“None”,我的意思是有時(shí)候你根本不需要使用任何框架。你只需從頭開(kāi)始編寫Go代碼,而無(wú)需導(dǎo)入任何內(nèi)容或?qū)嵗硞€(gè)控制對(duì)象。在Go中創(chuàng)建微服務(wù)很容易,因?yàn)镚o已經(jīng)內(nèi)置了許多基本代碼。這就是為什么可以用幾百行代碼構(gòu)建像Nano這樣的框架的原因。
所有在套接字上偵聽(tīng)、解包HTTP請(qǐng)求的工作,都是在標(biāo)準(zhǔn)發(fā)行版中的一個(gè)標(biāo)準(zhǔn)庫(kù)中完成的。當(dāng)然,一些框架可以添加一些規(guī)則或特性,但是很多時(shí)候,如果你只是編寫一個(gè)非?;镜奈⒎?wù),你就不需要它了。因?yàn)樗械?ldquo;附加功能”都可能會(huì)妨礙這一過(guò)程,并導(dǎo)致一些Go開(kāi)發(fā)人員最終覺(jué)得代碼變得更加復(fù)雜了。如果你只是在線上進(jìn)行監(jiān)聽(tīng),并根據(jù)收到的信息做出一些基本決定,那么你可能什么都不需要做。
原文標(biāo)題:20 Go language projects for mastering microservices,作者:Peter Wayner
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】