如何用go写微服务 构建微服务的十大

如何用go写微服务 构建微服务的十大(1)

现在,很多开源库都支持构建应用程序。我应该向你推荐一些库,它们可以帮助启动具有简单设计、干净代码和良好性能的项目。

01 CLI 命令(spf13/cobra)

如何用go写微服务 构建微服务的十大(2)

你想要构建一些 CLI 命令吗?

Cobra 既是一个用于创建强大的现代 CLI 应用程序的库,也是一个用于生成应用程序和命令文件的程序。

我使用这个库来管理命令应用程序,执行运行程序,初始化配置,并启动 Rest API。

基于 cobra 的应用组织结构:

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

app/main.go 的代码如下:

packagemain import( "app/cmd" ) funcmain(){ cmd.Execute() }

app/cmd/root.go 代码如下:

packagecmd varrootCmd=&cobra.Command{ Use:"hugo", Short:"Hugoisaveryfaststaticsitegenerator", Long:`AFastandFlexibleStaticSiteGeneratorbuiltwithlovebyspf13andfriendsinGo.Completedocumentationisavailableathttp://hugo.spf13.com`, Run:func(cmd*cobra.Command,args[]string){ //DoStuffHere }, } funcExecute(){ iferr:=rootCmd.Execute();err!=nil{ fmt.Println(err) os.Exit(1) } }

项目地址:https://github.com/spf13/cobra。

02 配置读取器(spf13/viper)

如何用go写微服务 构建微服务的十大(3)

Viper 是 Go 应用程序的完整配置解决方案。

Viper 支持以下格式配置:

  • JSON
  • TOML
  • YAML
  • HCL
  • INI
  • envfile
  • Java properties config files

例如 config/config.toml:

address="localhost" port="9090"

响应操作的文件 config.go:

funcReadConfig(){ viper.SetConfigName("config/config.toml") viper.SetConfigType("toml") err:=viper.ReadInConfig() iferr!=nil{ panic(fmt.Errorf("Fatalerrorconfigfile:%s\n",err)) } }

然后在 main.go 中使用 config 的值:

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

项目地址:https://github.com/spf13/viper。

03 Web 框架(labstack/echo)

如何用go写微服务 构建微服务的十大(4)

Echo 是一个高性能、极简主义的 Go Web 框架。

安装

//gogetgithub.com/labstack/echo/{version} gogetgithub.com/labstack/echo/v4

例子

packagemain import( "net/http" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" ) funcmain(){ //Echoinstance e:=echo.New() //Middleware e.Use(middleware.Logger()) e.Use(middleware.Recover()) //Routes e.GET("/",hello) //Startserver e.Logger.Fatal(e.Start(":1323")) } //Handler funchello(cecho.Context)error{ returnc.String(http.StatusOK,"Hello,World!") }

项目地址:https://github.com/labstack/echo。

04 依赖注入(uber-go/fx)

如何用go写微服务 构建微服务的十大(5)

我发现这个库非常有用,你不需要生成任何东西。只有代码。非常模块化和清晰的层次。

一个依赖注入的 Go 应用框架。

funcmain(){ fx.New(injectModule()).Run() } funcinjectModule()fx.Option{ returnfx.Options( fx.Provide( NewTimeOutContext, NewDbConn, ), repository.Module, service.Module, outbound.Module, server.Module, controller.Module, ) }

项目地址:https://github.com/uber-go/fx。

04 Swagger Generator, UI 和 Validation

如何用go写微服务 构建微服务的十大(6)

在 swagger 部分,我必须使用不同的 3 个库,因为我没有找到 1 个库同时包含这个 3 个库功能的。如果你有推荐,请评论告知。

a、Swagger generator (swaggo/swag)

Swag 将 Go 注释转换为 Swagger Documentation 2.0。

我们为流行的 Go Webb 框架[1]创建了各种各样的插件。这允许你快速集成一个现有的 Go 项目(使用 Swagger UI)。

支持的 Web 框架:

  • gin
  • echo
  • buffalo
  • net/http

Swag 已经处理了你那些 swagger 文件。所以你不再需要写 swagger.yml 或 swagger.json。你需要做的只是编写注释。看一个例子:

//@titleBlueprintSwaggerAPI //@version1.0 //@descriptionSwaggerAPIforGolangProjectBlueprint. //@termsOfServicehttp://swagger.io/terms/ //@contact.nameAPISupport //@contact.emailmartin7.heinz@gmail.com //@license.nameMIT //@license.urlhttps://github.com/MartinHeinz/go-project-blueprint/blob/master/LICENSE //@BasePath/api/v1 funcmain(){ ... r.GET("/swagger/*any",ginSwagger.WrapHandler(swaggerFiles.Handler)) ... }

项目地址:https://github.com/swaggo/swag。

b、Swagger UI (swaggo/echo-swagger)

因为我正在使用 echo,所以我为 swagger 选择了这个 user interface。

使用示例:

packagemain import( "github.com/labstack/echo/v4" "github.com/swaggo/echo-swagger" _"github.com/swaggo/echo-swagger/example/docs"//docsisgeneratedbySwagCLI,youhavetoimportit. ) //@titleSwaggerExampleAPI //@version1.0 //@descriptionThisisasampleserverPetstoreserver. //@termsOfServicehttp://swagger.io/terms/ //@contact.nameAPISupport //@contact.urlhttp://www.swagger.io/support //@contact.emailsupport@swagger.io //@license.nameApache2.0 //@license.urlhttp://www.apache.org/licenses/LICENSE-2.0.html //@hostpetstore.swagger.io //@BasePath/v2 funcmain(){ e:=echo.New() e.GET("/swagger/*",echoSwagger.WrapHandler) e.Logger.Fatal(e.Start(":1323")) }

项目地址:https://github.com/swaggo/echo-swagger。

c、Swagger validation (go-swagger/go-swagger)

这个包包含了 Swagger 2.0(又名 OpenAPI 2.0[2])的 golang 实现: 它知道如何序列化和反序列化 Swagger 规范。

安装:

gogetgithub.com/go-swagger/go-swagger/cmd/swagger

运行以验证:

swaggervalidateapi/docs/swagger.yaml

输出如下:

2021/01/3022:47:01 Theswaggerspecat"api/docs/swagger.yaml"isvalidagainstswaggerspecification2.0

项目地址:https://github.com/go-swagger/go-swagger。

06、自定义 Logger (sirupsen/logrus)

如何用go写微服务 构建微服务的十大(7)

Logrus 是 Go (golang)的结构化 Logger,完全兼容标准库 Log。

例子:

packagemain import( log"github.com/sirupsen/logrus" ) funcmain(){ log.WithFields(log.Fields{ "animal":"walrus", }).Info("Awalrusappears") }

项目地址:https://github.com/sirupsen/logrus。

07、Mock 生成器 (vektra/mockery)

一个 Mock 代码自动生成器

安装:

gogetgithub.com/vektra/mockery/v2/.../

生成 mock:

./bin/mockery--all

输出:

如何用go写微服务 构建微服务的十大(8)

如何用go写微服务 构建微服务的十大(9)

项目地址:https://github.com/vektra/mockery。

08、Migrate (golang-migrate/migrate)

用 Go 编写的数据库迁移工具。作为 CLI[3] 使用或作为库[4]导入。

支持如下数据库:

  • 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

安装:

$goget-u-dgithub.com/golang-migrate/migrate/cmd/migrate

创建迁移文件:

migratecreate-extsql-dirdatabase/migrations-seqcreate_user

运行升级版本:

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

降版本:

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

项目地址:< https://github.com/golang-migrate/migrate>。

09、Messaging (NSQ)

如何用go写微服务 构建微服务的十大(10)

NSQ 拓扑:

如何用go写微服务 构建微服务的十大(11)

NSQ 组件:

  1. nsqlookupd (daemon manage topologies / routes)
  2. nsqd (daemon manage receives, queues, and delivers messages)
  3. nsqadmin (default Web UI of nsq)

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

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

执行:

Torundocker: $docker-composeup-d orifusename(docker-compose-nsq.yml): $docker-compose-fdocker-compose-nsq.ymlup-d Tocheckcontainerdocker: $docker-composeps Toseelogs: $docker-composelogs Tochecknsqwebui:(assumingportis32770) $curlhttp://127.0.0.1:32770/ping

Go 代码目录:

CreateFolder: ├──consume │└──consume.go └──publish └──publish.go

consume.go 代码:

packagemain import( "log" "sync" "github.com/nsqio/go-nsq" ) funcmain(){ wg:=&sync.WaitGroup{} wg.Add(1) decodeConfig:=nsq.NewConfig() c,err:=nsq.NewConsumer("My_NSQ_Topic","My_NSQ_Channel",decodeConfig) iferr!=nil{ log.Panic("Couldnotcreateconsumer") } c.AddHandler(nsq.HandlerFunc(func(message*nsq.Message)error{ log.Println("NSQmessagereceived:") log.Println(string(message.Body)) returnnil })) err=c.ConnectToNSQD("127.0.0.1:4150") iferr!=nil{ log.Panic("Couldnotconnect") } log.Println("AwaitingmessagesfromNSQtopic\"MyNSQTopic\"...") wg.Wait() }

运行 consume.go:

$gorunconsume/consume.go

publish.go 代码:

packagemain import( "log" "github.com/nsqio/go-nsq" ) funcmain(){ config:=nsq.NewConfig() p,err:=nsq.NewProducer("127.0.0.1:4150",config) iferr!=nil{ log.Panic(err) } err=p.Publish("My_NSQ_Topic",[]byte("sampleNSQmessage")) iferr!=nil{ log.Panic(err) } }

运行 publish:

$gorunpublish/publish.go

项目地址:https://github.com/nsqio/go-nsq。

10、SQL (jmoiron/sqlx)

sqlx 是一个库,它为 go 的标准 database/sql 库提供了一组扩展。

我喜欢的 sqlx 是因为它们可以 scan 结构!使用简单。

StrucScan 的例子:

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

项目地址:https://github.com/jmoiron/sqlx。

11、附加的一些库

1)Go routine grouping (sync/errgroup):https://pkg.go.dev/golang.org/x/sync/errgroup

2)Fluent SQL generation for golang (Masterminds/squirrel):https://github.com/Masterminds/squirrel

3)Golang Linter (golangci/golangci-lint):https://github.com/golangci/golangci-lint

4)Circuit Breaker (gojek/heimdall):https://github.com/gojek/heimdall

5)Go tool generate tags (fatih/gomodifytags):https://github.com/fatih/gomodifytags

12、总结

要构建应用程序,我们应该知道有什么功能,特别是如果我们是团队协作,建议使用可读性强的代码,这样在成为遗留代码之前(也许 5-10 年之后) ,代码可以更容易维护。

构建应用程序的三个关键:

  1. 简单设计(项目结构和依赖关系)
  2. Clean Code (可读性和可维护性)
  3. Modular(模块化) (Solid & flexible skeleton)

为了封装所有这些库,我有一个模板或框架项目,其设计简单,代码清晰。看看这个:https://github.com/kecci/goscription。

以上就是我常用的 10 大 Go 框架/库和一些附加库。

我希望你喜欢我的推荐,如果你有其他的推荐,请留言!

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

作者:Kecci Kun

编译:polarisxu

参考资料

[1]

Go Webb 框架: https://github.com/swaggo/swag#supported-web-frameworks

[2]

OpenAPI 2.0: https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md

[3]

CLI: https://github.com/golang-migrate/migrate#cli-usage

[4]

库: https://github.com/golang-migrate/migrate#use-in-your-go-project

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页