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