構建微服務的十大 Golang 框架和庫

2021-12-29 InfoQ 架構頭條
現在已經有很多開源庫 golang 支持構建應用程式,這些庫設計簡單,代碼乾淨,性能良好,本文為大家精心挑選了十個實用的框架和庫。

你想生成一些 CLI 命令嗎?

Cobra 既是一個創建強大的現代 CLI 應用程式的庫,也是一個生成應用程式和命令文件的程序。

我使用這個庫來管理命令應用程式,執行 runner 應用程式,初始化配置,並啟動 Rest API。

基於 Cobra 的應用組織結構:

├── app│ ├── main.go│ ├── cmd│ └── root.go

在 app/main.go 中:

package mainimport (   "app/cmd")func main() {   cmd.Execute()}

在 app/cmd/root.go 中:

package cmdvar rootCmd = &cobra.Command{   Use:   "hugo",   Short: "Hugo is a very fast static site generator",   Long: `A Fast and Flexible Static Site Generator built with love by spf13 and friends in Go. Complete documentation is available at http://hugo.spf13.com`,   Run: func(cmd *cobra.Command, args []string) {         },}func Execute() {   if err := rootCmd.Execute(); err != nil {      fmt.Println(err)      os.Exit(1)   }}

Cobra:https://github.com/spf13/cobra

Viper 是一個完整的 Go 應用配置解決方案。

Viper 可以讀取以下內容:

JSON

TOML

YAML

HCL

INI

envfile 以及Java 屬性配置文件

示例 config/config.toml :

address="localhost"port="9090"

讀取 config.go:

func ReadConfig() {   viper.SetConfigName("config/config.toml")   viper.SetConfigType("toml")   err := viper.ReadInConfig()   if err != nil {      panic(fmt.Errorf("Fatal error config file: %s \n", err))   }}

在 main.go 中使用 config 中的 value:

func main() {   address := viper.Get("address")   port := viper.Get("port")   fmt.Printf("address: %s", address)   fmt.Printf("port: %s", port)}

Viper:https://github.com/spf13/viper

高性能、極簡主義的 Go Web 框架

安裝:

// go get github.com/labstack/echo/{version}go get github.com/labstack/echo/v4

示例:

package mainimport (  "net/http"  "github.com/labstack/echo/v4"  "github.com/labstack/echo/v4/middleware")func main() {    e := echo.New()    e.Use(middleware.Logger())  e.Use(middleware.Recover())    e.GET("/", hello)    e.Logger.Fatal(e.Start(":1323"))}func hello(c echo.Context) error {  return c.String(http.StatusOK, "Hello, World!")}

我發現這個庫非常有用,你不需要生成任何東西。只是代碼。非常模塊化,層次清晰。

一個基於依賴注入的 Go 應用框架。

func main() {    fx.New(injectModule()).Run()}func injectModule() fx.Option {    return fx.Options(        fx.Provide(              NewTimeOutContext,              NewDbConn,         ),        repository.Module,         service.Module,         outbound.Module,         server.Module,         controller.Module,    )}

Uber-go/fx: https://github.com/uber-go/fx

在 swagger 部分,我必須使用不同的 3 個庫,因為我找不到任何一個庫可以在一個庫中包含 3 個庫。

 a. Swagger 生成器 (swaggo/swag)

Swag 將 Go 注釋轉換為 Swagger 文檔 2.0。

我們已經為流行的 Go Web 框架 創建了各種插件。這使你可以快速地與現有的 Go 項目集成(使用 Swagger UI)。

支持的 Web 框架:

Swag 已經處理了你的 swagger 文檔。所以你不再需要寫swagger.yml或swagger.json。你需要做的就是寫注釋。這是一個例子:

func main() {    ...    r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))    ...}

swaggo/swag:https://github.com/swaggo/swag

 b. Swagger UI (swaggo/echo-swagger)

因為我用的是 echo,所以我選擇這個作為 swagger 的用戶界面。

使用示例:

package mainimport (    "github.com/labstack/echo/v4"    "github.com/swaggo/echo-swagger"    _ "github.com/swaggo/echo-swagger/example/docs" )func main() {    e := echo.New()    e.GET("/swagger/*", echoSwagger.WrapHandler)    e.Logger.Fatal(e.Start(":1323"))}

swaggo/echo-swagger:https://github.com/swaggo/echo-swagger

 c. Swagger 驗證 (go-swagger/go-swagger)

這個包包含了 Swagger 2.0(也就是 OpenAPI 2.0)的 golang 實現:它知道如何序列化和反序列化 swagger 規範。

安裝:

go get github.com/go-swagger/go-swagger/cmd/swagger

鍵入此命令以驗證:

swagger validate api/docs/swagger.yaml

輸出:

2021/01/30 22:47:01 The swagger spec at "api/docs/swagger.yaml" is valid against swagger specification 2.0

go-swagger/go-swagger:https://github.com/go-swagger/go-swagger

6自定義記錄器 (sirupsen/logrus)

Logrus 是一個適用於 Go(golang) 的結構化記錄器,與標準庫記錄器完全 API 兼容。

示例:

package mainimport (  log "github.com/sirupsen/logrus")func main() {  log.WithFields(log.Fields{    "animal": "walrus",  }).Info("A walrus appears")}

sirupsen/logrus:https://github.com/sirupsen/logrus

Golang 的模擬代碼自動生成器

安裝:

go get github.com/vektra/mockery/v2/.../

生成模擬:

輸出:

vektra/mockery:https://github.com/vektra/mockery

8遷移 (golang-migrate/migrate)

用 Go 編寫的資料庫遷移。作為 CLI 使用或作為庫導入。

資料庫驅動程序運行遷移:

PostgreSQL

Redshift

Ql

Cassandra

SQLite(todo #165)

SQLCipher

MySQL/MariaDB

Neo4j

MongoDB

CrateDB(todo #170)

Shell(todo #171)

Google Cloud Spanner

CockroachDB

ClickHouse

Firebird

MS SQL Server

安裝:

$ go get -u -d github.com/golang-migrate/migrate/cmd/migrate

鍵入命令創建遷移文件:

migrate create -ext sql -dir database/migrations -seq create_user

鍵入命令運行遷移:

migrate -database "mysql://user:pass@tcp(localhost:3600)/user" -path=database/migrations up

鍵入命令中斷遷移:

migrate -database "mysql://user:pass@tcp(localhost:3600)/user" -path=database/migrations down

golang-migrate/migrate:https://github.com/golang-migrate/migrate

NSQ 拓撲:

NSQ 組件:

docker-compose 示例:(nsqlookupd, nsqd, nsqadmin)

version: '3'services:nsqlookupd:image: nsqio/nsqcommand: /nsqlookupdports:- "4160:4160"- "4161:4161"nsqd:image: nsqio/nsqcommand: /nsqd --lookupd-tcp-address=nsqlookupd:4160depends_on:- nsqlookupdports:- "4150:4150"- "4151:4151"nsqadmin:image: nsqio/nsqcommand: /nsqadmin --lookupd-http-address=nsqlookupd:4161depends_on:- nsqlookupdports:- "4171:4171"

執行:

運行 docker:$ docker-compose up -d或者,如果使用名稱 (docker-compose-nsq.yml):$ docker-compose -f docker-compose-nsq.yml up -d檢查容器 docker:$ docker-compose ps查看日誌:$ docker-compose logs檢查 nsq Web UI(假設埠為 32770):$ curl http://127.0.0.1:32770/ping

在 golang 中:

創建文件夾:├── consume│   └── consume.go└── publish    └── publish.go

consume.go:

package mainimport ("log""sync""github.com/nsqio/go-nsq")func main() {wg := &sync.WaitGroup{}wg.Add(1)decodeConfig := nsq.NewConfig()c, err := nsq.NewConsumer("My_NSQ_Topic", "My_NSQ_Channel", decodeConfig)if err != nil {log.Panic("Could not create consumer")}c.AddHandler(nsq.HandlerFunc(func(message *nsq.Message) error {log.Println("NSQ message received:")log.Println(string(message.Body))return nil}))err = c.ConnectToNSQD("127.0.0.1:4150")if err != nil {log.Panic("Could not connect")}log.Println("Awaiting messages from NSQ topic \"My NSQ Topic\"...")wg.Wait()}

運行 consume.go:

$ go run consume/consume.go

publish.go:

package mainimport ("log""github.com/nsqio/go-nsq")func main() {config := nsq.NewConfig()p, err := nsq.NewProducer("127.0.0.1:4150", config)if err != nil {log.Panic(err)}err = p.Publish("My_NSQ_Topic", []byte("sample NSQ message"))if err != nil {log.Panic(err)}

運行 publish.go:

$ go run publish/publish.go

nsqio/go-nsq:https://github.com/nsqio/go-nsq

sqlx 是一個庫,它在 Go 的標準 database/sql 庫上提供了一組擴展。

我喜歡 sqlx 的一點是它們可以進行結構掃描。快速而簡單的使用。

結構掃描示例:

  place := Place{}    rows, err := db.Queryx("SELECT * FROM place")    for rows.Next() {        err := rows.StructScan(&place)        if err != nil {            log.Fatalln(err)        }         fmt.Printf("%#v\n", place)    }

jmoiron/sqlx:https://github.com/jmoiron/sqlx

Go 例程分組 (sync/errgroup)

https://pkg.go.dev/golang.org/x/sync/errgroup

為 golang 生成流暢的 SQL (Masterminds/squirrel)。

https://github.com/Masterminds/squirrel

Golang Linter (golangci/golangci-lint)

https://github.com/golangci/golangci-lint

斷路器 (gojek/heimdall)

https://github.com/gojek/heimdall

Go 工具生成標籤 (fatih/gomodifytags)

https://github.com/fatih/gomodifytags

要建立應用程式,我們應該知道我們有什麼特性,特別是如果我們想建立持續的應用程式和團隊之間的合作。我建議有一個堅實的、可讀性強的代碼,這樣在成為遺留代碼之前(也許 5~10 年後),它可以更容易維護。

構建應用的 3 個關鍵:

簡單設計(項目結構和依賴關係)

乾淨的代碼(可讀和可維護)

模塊化(實心骨架和柔性骨架)

為了把這些庫都包裝起來,我有一個設計簡單、代碼乾淨的模板或骨架項目。請看:https://github.com/kecci/goscription

作者介紹:

Kecci Kun,軟體工程師。

原文連結:

https://keccikun.medium.com/top-10-framework-golang-library-to-build-microservice-391a2bb4c2cb

快狗打車的業務架構設計迭代實踐

點個在看少個 bug 👇

相關焦點

  • Golang指南:頂級Golang框架、IDE和工具列表
    Golang框架Web框架可以幫助開發人員儘可能方便快捷地構建應用程式。Go語言還比較新,所以使用的框架帶有充足的文檔很重要。這裡有9個框架可幫助你使用Go語言構建項目。1、Revel作為Go語言的高效生產力框架,Revel包含的Hot Code Reload工具可以讓你在每次更改文件時重建項目。它還包括各種全面和高性能的功能,因此你不需要找外部庫集成到框架中。2、BeegoBeego是一個完整的MVC框架,有自己的日誌庫、ORM和Web框架。你不需要再去安裝第三方庫。
  • 微服務等於Spring Cloud?了解微服務架構和框架
    部署不靈活:構建時間長,任何小修改必須重新構建整個項目,這個過程往往很長穩定性不高:一個微不足道的小問題,可以導致整個應用掛掉擴展性不夠:無法滿足高並發情況下的業務需求所以,現在主流的設計一般會採用微服務架構。
  • Go web和微服務實戰教程推薦
    自土撥鼠2021元旦建立Go招聘交流群以來,加了很多同學,包括還沒/剛畢業的學生、從其他技術棧(PHP、JAVA、C++等)轉Go的、也有隻學過Go語法的沒有接觸過實戰的同學和一些多年工作經驗的大佬等。其中不少同學問有沒有Go實戰方面的教程推薦呢?所以這裡土撥鼠趁周末給大家推薦一波Go方面的實戰教程系列,僅供參考。
  • Micronaut:面向未來的微服務和雲原生應用框架
    >用以在構建微服務系統時提高開發人員的生產力該框架從Spring和Grails獲得靈感,提供了熟悉的開發流程,但是最小化了啟動時間和內存使用。Spring Boot和Grails等框架依賴Spring IoC(反轉控制)容器,使用反射機制在運行時分析應用程式類,然後將它們連接在一起來構建應用的依賴關係圖。反射元數據還用於為事務管理等功能生成代理。這些框架給開發人員帶來了許多好處,包括提高生產力、減少冗餘代碼和創建更具表現力的應用程式代碼。許多此類框架是圍繞單體應用設計的。
  • 怎樣構建Golang Dockerfiles?
    Docker 提供了一些出色的構建時功能和基本映像,我們可以用它們來實現輕量、安全和高效的應用程式構建。本文會介紹為什麼 Golang 可以很好地展示這些特性,因為 Golang 可以編譯為單個二進位文件(或一組二進位文件)。這篇文章的示例所關注的焦點是極簡主義。儘管這些示例很基礎,但它們非常重要,你可以在這些概念基礎上為大型 Golang 項目引入更多最佳實踐,以提高安全性和效率。
  • 微服務是什麼?十分鐘了解微服務架構
    我們的定義是,組件是可獨立更換和升級的軟體單元。微服務架構一樣會用到各種庫,但這種架構會把軟體給拆分成各種不同的服務來實現組件化。選擇的基礎設施素來愚蠢(愚蠢是因為僅作為消息路由器)——像RabbitMQ或ZeroMQ一樣不僅僅是提供可靠的異步架構來簡單實現——智能仍然存在於生產和消費信息的終點上;在服務中。在整體結構中,正在執行中的組件通過方法調用或函數調用進行通信。將一個巨大的框架改成一個微服務框架時遇到的最大的問題在於改變通信方式。
  • 整潔架構(Clean Architecture)的Go微服務: 程序結構
    點擊上方藍色「Go語言中文網」關注我們,領全套Go資料,每天學習 Go 語言我使用 Go 和 gRPC 創建了一個微服務,並試圖找出最佳的程序結構,它可以用作我未來程序的模板。我有 Java 背景,並發現自己在 Java 和 Go 之間掙扎,它們之間的編程理念完全不同。我寫了一系列關於在項目工作中做出的設計決策和取捨的文章。
  • Java開發人員的十大測試框架和庫
    在本文中,我將與大家分享10種最好、最基本的工具、框架和庫,它們可以幫助Java開發人員在各種Java項目上編寫單元測試和集成測試。幾乎所有主要的IDE,例如Eclipse、NetBeans和IntelliJ,都提供JUnit集成,這意味著你可以從這些IDE編寫和運行單元測試。
  • 谷歌Knative:用於構建、部署和管理無伺服器工作負載的K8s框架
    在 Google Cloud Next 2018 上,谷歌發布了 Knative,將其稱為「基於「Kubernetes 的平臺,用來構建、部署和管理現代 serverless 工作負載」。該框架試圖將開發雲原生應用在三個領域的最佳實踐結合起來,這三個領域指的是構建容器(和函數)、為工作負載提供服務(和動態擴展)以及事件。
  • 從 Spring Cloud 看懂一個微服務框架的「五臟六腑」
    Spring Cloud 是一個基於 Spring Boot 實現的微服務框架,它包含了實現微服務架構所需的各種組件。註:Spring Boot 簡單理解就是簡化 Spring 項目的搭建、配置、組合的框架。因為與構建微服務本身沒有直接關係,所以本文不對 Spring Boot 進行展開。
  • 為 Java 程式設計師而生的 10+測試框架和庫
    以下是 10 個優秀的測試框架和庫,以及它們常見用法的概述。關於 Java 程式設計師今年應該學習什麼,例如程式語言,庫和框架等,如果只能學習或提高其中一項,那必然是自動化測試技能。測試是專業程式設計師區別於業餘程式設計師的一項指標,作為專業程式設計師,並非必須採用 TDD,BDD 或其它測試方法論,但最低標準是通過編寫代碼的方式,來自動化測試自己的代碼。
  • 微服務架構設計實踐總結和思考
    注意微服務和微服務模塊暴露的API接口是兩個概念,這本身也是進行微服務邊界劃分和微服務管控的兩種顆粒度。在主流的微服務開發框架實現中,類似Spring CLoud的實現,對於Eureka,Cloud Gateway網關等實際都是到微服務這個粒度,也就是服務註冊和接入的是微服務模塊,而不是一個個獨立的API接口服務。
  • 使用Golang快速構建WEB應用
    如果發現問題或者有好的建議請回復我我回及時更正。 1.Abstract在學習web開發的過程中會遇到很多困難,因此寫了一篇類似綜述類的文章。作為路線圖從web開發要素的index出發來介紹golang開發的學習流程以及Example代碼。在描述中多是使用代碼來描述使用方法不會做過多的說明。最後可以方便的copy代碼來實現自己的需求。
  • 基於Spring Boot和Spring Cloud實現微服務架構
    Spring 頂級框架談及微服務,作為當前主流的企業框架Spring,它提供了一整套相關的頂級項目,能讓開發者快速的上手實現自己的應用,今天就介紹下Spring旗下各個頂級項目:Spring IO platform:用於系統部署,是可集成的,構建現代化應用的版本平臺,具體來說當你使用maven
  • 基於 Spring Boot 和 Spring Cloud 實現微服務架構
    Spring 頂級框架談及微服務,作為當前主流的企業框架Spring,它提供了一整套相關的頂級項目,能讓開發者快速的上手實現自己的應用,今天就介紹下Spring旗下各個頂級項目:Spring cloud子項目目前來說spring主要集中於spring boot(用於開發微服務)和spring cloud相關框架的開發,我們從幾張圖著手理解,然後再具體介紹:
  • 雲計算和微服務關係 - CSDN
    重度使用者是那些走在微服務架構改造前沿,具備微服務規劃和體系,有自己研發實力的企業,通常是以技術見長的大型網際網路公司。2、15% 左右的調研企業引入了SpringCloud、Dubbo等微服務主流開發框架此次調研中,6%的企業已經部分引入了Spring Cloud 開發框架,Spring Cloud 也被開發者認為是最好的開發框架。
  • 基於Spring Boot和Spring Cloud實現微服務架構學習
    Spring Boot:旨在簡化創建產品級的 Spring 應用和服務,簡化了配置文件,使用嵌入式web伺服器,含有諸多開箱即用微服務功能,可以和spring cloud聯合部署。Spring Framework:即通常所說的spring 框架,是一個開源的Java/Java EE全功能棧應用程式框架,其它spring項目如spring boot也依賴於此框架。
  • Golang 入門 : 配置代理
    直接設置環境變量 http_proxy 和 https_proxy 就行了:export http_proxy=http:export https_proxy=http:比如筆者在區域網中共享了代理 192.168.21.1:1080:$ export
  • 在線學習Go編程的頂級Golang教程
    3.使用Google的Go(golang)程式語言進行Web開發向具有15年以上教學經驗的計算機科學大學教授學習Web編程。課程評分:4.6 / 5.0(共3668個評分)Go是當今用於創建Web應用程式,Web API,微服務和其他分布式服務的功能最強大,性能最強且可擴展的程式語言。