當前位置:
首頁 > 科技 > 20 個好用的 Go 語言微服務開發框架

20 個好用的 Go 語言微服務開發框架

作者 | Peter Wayner

譯者 | 阿拉丁

2007 年,谷歌的一個團隊在調研計算機編程語言時,發現有數百種可用於開發軟體的語言,但沒有一種能提供谷歌真正需要的特性。有些語言太過底層,有些又太過複雜,有些特性對他們來說反而會礙手礙腳。谷歌的開發人員想要的語言要簡單到可以在幾個小時內學會,但又要複雜到足以應付現代互聯網的信息流。

他們的解決方案就是 Go 語言,這門語言對於 C 語言、Java 或 JavaScript 程序員來說——換句話說,就是所有的程序員——都很容易掌握。Go 語言提供了足夠的特性來編寫循環和代碼塊,但沒有一個特性是需要很長的時間才能掌握的。內置的常式經過優化,可以從互聯網獲取數據和發送數據。其他的東西——即使是非常聰明的想法——都被排除在外。

Go 語言是微服務開發團隊的一個很好的選擇。即使你的項目可能不需要像谷歌那樣向全世界提供電子郵件、地圖、搜索和其他雲服務,但仍然可能需要向用戶提供數十種不同的小型信息服務。

谷歌決定開源 Go 語言是一個明智之舉。這門語言培育了數千個開源項目,這些項目為你的 Web 項目提供了開箱即用的構建塊。這裡列出了 20 個最有趣的開源項目,用於構建基於 Go 語言的微服務系統。從專註於消息傳遞、路由、錯誤處理或 API 的小工具包,到用於構建 MVC Web 應用程序的更全面的框架,你將發現,使用 Go 語言開發微服務有著非常豐富的選擇。

Beego

https://beego.me/

Beego 框架提供了很多標準附加功能,例如全功能路由器和可用於執行 CRUD 操作的對象到資料庫映射工具。Bee 是 Beego 愛好者的最愛,它是一個快速而強大的命令行工具,用於構建、更新、打包和部署應用程序。Bee 可以從模板生成源代碼,並保持資料庫的最新狀態。

Buffalo

https://gobuffalo.io/en

Buffalo 團隊需要能夠將 Web 應用程序的所有部分組裝在一起的東西,包括應用程序本身的一些設計。他們把能夠安裝在一起的很多部件叫作「生態系統」。如果你想要路由——很少有人不需要——Buffalo 就包含了 Gorilla/Mux。如果你需要模板,Buffalo 傾向於使用 Plush,而不是使用內置的 Go 語言模板機制。資料庫連接模塊集合 Pop 可以幫你將資料庫信息轉換為 Go 對象。你還可以找到連接資料庫、處理 cookie 以及完成其他任務的標準方法。

Cobra

https://github.com/spf13/cobra

有時候,你只需要一個命令行界面。Cobra 提供了 CLI 的所有標準功能,因此你不必浪費時間實現代碼來查找 -h 或 -help 標誌。如果你的微服務需要對具有大量標誌和其他功能的命令行調用做出響應,那麼可以考慮集成 Cobra。

Docker

你當然可以在辦公室伺服器小黑屋裡的裸機上運行微服務,但越來越多的人將他們的代碼捆綁在 Docker 容器中,並將容器發到雲端。小型的包更容易處理大量不同的代碼塊,當你對微服務架構的願景要求你創建很多小的獨立代碼塊時,這將是一項有價值的服務。

值得一提的是,Docker 是用 Go 語言開發的,儘管在部署 Docker 容器時你可能永遠不會想到這一點。Docker 社區版是開源的,所以如果有必要,你可以參與其中,但很可能你只是將 Docker 作為部署微服務的工具。Go 語言愛好者之所以想要記住 Docker 是用 Go 語言開發的這一事實,是因為無處不在的 Docker 有力地證明了他們對這門語言的支持。

Echo

https://echo.labstack.com/

Echo 是一個極簡框架,但它提供了很多最重要的組件。路由器可以將 URL 拆解,然後將拆解的各個部份轉換為參數,因此你無需自行解析它們。然後,你可以混合使用身份驗證、表單解析、壓縮和合理性限制。你可以專註於從函數中返回正確的信息。

Errors

https://github.com/juju/errors

有時候,API 的用戶會傳遞錯誤的參數。你可以自己處理這些參數,也可以把它們創給 Errors,這是一個可以自動執行大部分跟蹤的庫,方便進行調試。當發生錯誤時,Errors 會使用注釋來詳細說明出錯的地方和位置。

Gin

https://github.com/gin-gonic/gin

Gin 是 Martini(https://github.com/go-martini/martini)的下一代框架。可以說,Gin 拋棄了那些額外的東西,專註於提供最有用的部分。花費大量時間構建 Node.js 微服務的開發人員會感到賓至如歸。你可以實例化一個對象,然後附加函數來處理特定的調用,這樣就可以創建一個微服務。Gin 負責處理路由,而你的函數處理業務邏輯。如果不去考慮標點符號,它的代碼甚至看起來有點像 Node.js 代碼。

Ginkgo

https://onsi.github.io/ginkgo/

測試可能是微服務開發當中最具挑戰性的事情。Ginkgo 通過行為驅動測試擴展了標準 Go 發行版的內置測試機制。Ginkgo 提供了一種高級機制,用於指定函數或服務應該產生哪些結果。結果通常使用 Ginkgo 提供的 Gomega 匹配器(http://onsi.github.io/gomega/)進行評估,但如果你願意,也可以使用不同的匹配器庫。

Ginkgo 是一個全面的框架,提供了各種選項,用於設置測試數據、運行測試以及在事後釋放測試數據。你只需要描述結果,然後讓 Ginkgo 處理其他的事情。

Goa

https://github.com/goadesign/goa

如果你是一個曾經使用 Ruby 和 Praxis 框架的開發人員,或者是一個欣賞設計語言的強大力量人,那麼你會在 Goa 中找到很多你喜歡的東西。你本身不需要編寫 Go 代碼。你使用 Goa DSL 為 API 編寫設計規範,然後 Goa 將其轉換為可執行的 Go 代碼。DSL 針對微服務 API 進行了優化,並強制你的設計遵循標準的架構。

Gorilla

Gorilla 項目提供了一系列你需要的模塊。Gorilla 的 Mux(http://www.gorillatoolkit.org/pkg/mux)路由器被很多其他框架使用,因為它太好用了。很多用戶之所以使用 Gorilla,是因為 websocket(http://www.gorillatoolkit.org/pkg/websocket)。

Gotify

https://github.com/gotify/server

同步一組微服務所面臨的一個挑戰是建立有效的消息傳遞節點。Gotify 是一個簡單的伺服器,用於發送和接收消息,將你的微服務集合與持續存儲的消息組合在一起。最有用的部分可能是它的 Web 介面,可幫助開發者應對最令人頭疼的調試問題。

Hugo

https://github.com/gohugoio/hugo

Hugo 是一種靜態站點生成器,可以用這個框架構建的微服務並不多,但如果網站只有有限的重複查詢答案時,這是一個值得考慮的選項。Hugo 一次生成答案,然後可以重複使用。如果你已經已 HTML 格式提供答案,那麼 Hugo 會非常有用。

Kite

https://github.com/koding/kite

如果你希望建立一個更加可控的服務群體,而不是通常的服務之間的互動,那麼可以考慮一下 Kite。Kite 的目標是讓微服務之間的通信協調變得更簡單一些。來自 Kite 以外的 API 調用通過 websocket 進入,然後 Kite 使用更快、更低級別的套接字連接(基於 dnode)傳遞新消息。中間有一個叫作 Kontrol 的服務註冊表和身份驗證服務。如果你需要經常交換消息和協調很多的操作,那麼在不同伺服器之間添加這一層會讓一切變得更快。

Logrus

https://github.com/sirupsen/logrus

要跟蹤 API 的流入和流出數據和可能產生的錯誤,通常需要將日誌寫入文件中。這個過程可以很簡單,比如在一個打開的文件中寫入一行行的數據,但通常使用完整的日誌框架會更好。Logrus 提供了格式化程序來標準化你的日誌輸出,並讓後續的自動化日誌文件分析變得更容易。不要嘗試自己開發日誌代碼,使用像 Logrus 這樣的庫會事半功倍。

Nano

https://github.com/pasztorpisti/nano

構建一個微服務並不需要太多東西,Nano 就是一個極簡主義的例子。它的實際代碼不會超過 200 行,如果算上注釋也只有 400 多行。你只需要幾行代碼就可以構建一個微服務——只包含處理請求所需的業務邏輯。這個框架還有一些其他不錯的特性,例如與語言無關的 API 結構,這樣你的 Go 代碼就可以與使用其他語言開發的服務發生交互。它還提供了一個測試過程來,可以嵌入你的本地測試常式。簡簡單單,但卻恰到好處。

Negroni

https://github.com/urfave/negroni

有些人看完 Martini 後,決定走一條更簡單的道路。他們剝離了路由器和其他一些東西,創建了 Negroni,這是一個非常小型的工具,除了處理標準文件、自定義請求、從基本錯誤中恢復以及保留日誌之外,它不會做更多的工作。如果你想要額外的東西,可以自己加入。Negroni 團隊也提供了一系列與可以與 Negroni 一起使用的小型項目。

Renderer

https://github.com/thedevsaddam/renderer

在準備輸出響應時,你需要獲取數據並將其插入到模板中。Renderer 提供了各種輸出格式(JSON、JSONP、XML、YAML、HTML、文件)和一個漂亮、快速和標準的模板引擎。

Revel

https://revel.github.io/

Revel 借鑒了 Webpack 的一個簡潔的特性,這讓 Revel 看起來就像一個 IDE 一樣,或者至少是 IDE 的一部分,每當你對代碼做出更改,它會持續地重新構建你的項目。當你保存修改後,Revel 會檢測到更改,然後就編譯代碼,如果沒有編譯錯誤,就啟動應用程序。因此,Revel 伺服器會自動部署修改的碼——在桌面上進行開發時這項功能非常好用,或許對於生產環境代碼部署來說也是有點誘人的。

這個框架本身功能齊全,它提供了模板、緩存、驗證和過濾器。如果你正在構建很多微服務,它還提供了一個模塊系統,讓你可以在項目之間共享一些 MVC 組件。

Testify

https://github.com/stretchr/testify

使用斷言的最簡單方法之一是使用 Testify,它是一個 Go 語言項目,還提供了模擬工具,用於快速測試大型微服務的各個部分。只需要幾行代碼就編寫一些基本測試用例。

Tollbooth

https://github.com/didip/tollbooth

在你發布 API 之後,當然希望來自世界各個角落的人都可以調用它。但當你的伺服器發生熔斷,或者你看一看為了獲得彈性而為雲託管賬戶支付的費用時,你可能會改變主意。Tollbooth 是一個用於限制傳入請求的輕量級系統。限制前門的流量就等於減少了對管道中微服務或資料庫的需求,讓一切保持運行順暢。

不使用框架

你只需從頭開始編寫 Go 代碼,不需要導入任何依賴項或者實例化任何控制對象。使用 Go 語言創建微服務其實很容易,因為它已經內置了很多基本代碼。這就是為什麼只用幾百行代碼就可以構建出像 Nano 這樣的框架。

監聽套接字、解壓縮 HTTP 請求等工作都是通過標準庫完成的。雖然框架提供了一些額外的功能,但很多時候如果你需要一個非常基本的微服務,就不需要用到框架。太多的「附加功能」可能反而會妨礙你,而且 Go 開發人員可能會說,太多的依賴反而讓 Go 語言變得更複雜。

英文原文:

https://www.infoworld.com/article/3326530/google-go/20-go-projects-for-mastering-microservices.html

本文彩蛋

關於微服務的好文章不計其數。但對於那些一直沒有親歷微服務或初次聽到這個概念的人來說,一份頂級的開源工具清單可能會讓他們學習微服務的過程更加事半功倍。你可以在 InfoQ 公眾號對話框回復關鍵詞:微服務,獲取我們推薦的 30 個用於微服務的頂級工具。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 InfoQ 的精彩文章:

對AI開發感興趣的你,現場挑戰從零打造AI應用模型
JS/CSS體積減少了67%,我們是如何做到的?

TAG:InfoQ |