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

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

http://www.gorillatoolkit.org/

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章