当前位置: 首页 > 后端技术 > PHP

用于构建微服务的十大Golang框架和库

时间:2023-03-30 02:43:55 PHP

CLI命令(spf13/cobra)你想生成一些CLI命令吗?Cobra既是一个用于创建强大的现代CLI应用程序的库,也是一个用于生成应用程序和命令文件的程序。我使用这个库来管理命令应用程序、执行运行器应用程序、初始化配置以及启动RestAPI。基于Cobra的应用组织结构:├──app│├──main.go│├──cmd│└──root.goinapp/main.go:packagemainimport("app/cmd")funcmain(){cmd.Execute()}在app/cmd/root.go中:packagecmdvarrootCmd=&cobra.Command{Use:"hugo",Short:"Hugoisaveryfaststaticsitegenerator",Long:`AFastandFlexible由spf13和朋友用Go语言构建的静态站点生成器。完整的文档可以在http://hugo.spf13.com上找到,运行:func(cmd*cobra.Command,args[]string){//DoStuffHere},}funcExecute(){iferr:=rootCmd。执行();err!=nil{fmt.Println(err)os.Exit(1)}}Cobra:https://github.com/spf13/cobraconfigreader(spf13/viper)Viper是一个完整的Go应用程序配置解决方案。Viper可以读取以下内容:JSONTOMLYAMLHCLINIenvfile和Java属性配置文件示例config/config.toml:address="localhost"port="9090"Readconfig.go:funcReadConfig(){viper.SetConfigName("config/config.toml")viper.SetConfigType("toml")err:=viper.ReadInConfig()iferr!=nil{panic(fmt.Errorf("Fatalerrorconfigfile:%sn",err))}}在main.go中使用配置中的值:funcmain(){address:=viper.Get("address")port:=viper.Get("port")fmt.Printf("address:%s",address)fmt.Printf("port:%s",port)}Viper:https://github.com/spf13/viperWeb框架(labstack/echo)version}gogetgithub.com/labstack/echo/v4示例:packagemainimport("net/http""github.com/labstack/echo/v4""github.com/labstack/echo/v4/middleware")funcmain(){//Echo实例e:=echo.New()//中间件e.Use(middleware.Logger())e.Use(middleware.Recover())//路由e.GET("/",hello)//启动服务器e.记录器。致命的(e.Start(":1323"))}//Handlerfunchello(cecho.Context)error{returnc.String(http.StatusOK,"Hello,World!")}依赖注入(uber-go/fx)我找到了这个库非常有用,你不需要生成任何代码。非常模块化,具有清晰的层次结构。一个基于依赖注入的Go应用程序框架。funcmain(){fx.New(injectModule()).Run()}funcinjectModule()fx.Option{returnfx.Options(fx.Provide(NewTimeOutContext,NewDbConn,),repository.Module,service.Module,出站.Module,server.Module,controller.Module,)}Uber-go/fx:https://github.com/uber-go/fxSwagger生成器,UI和swagger部分的验证,我必须使用不同的3个库,因为我找不到任何可以将3个库合二为一的库。A。SwaggerGenerator(swaggo/swag)Swag将Go注释转换为Swagger文档2.0。我们为流行的GoWeb框架创建了各种插件。这使您可以快速与现有的Go项目集成(使用SwaggerUI)。支持的Web框架:ginechobuffalonet/httpSwag已经处理了您的swagger文档。因此您不再需要编写swagger.yml或swagger.json。您需要做的就是写评论。这是一个示例://@titleBlueprintSwaggerAPI//@version1.0//@descriptionSwaggerAPIforGolangProjectBlueprint。//@termsOfServicehttp://swagger.io/terms//@contact.nameAPI支持//@contact.emailmartin7.heinz@gmail.com//@license.nameMIT//@license.urlhttps://github.com/MartinHeinz/go-project-blueprint/blob/master/LICENSE//@BasePath/api/v1funcmain(){...r.GET("/swagger/*any",ginSwagger.WrapHandler(swaggerFiles.Handler))...}swaggo/swag:https://github.com/swaggo/swagb。SwaggerUI(swaggo/echo-swagger)因为我用的是echo,所以选择这个作为swaggerUI。用法示例:packagemainimport("github.com/labstack/echo/v4""github.com/swaggo/echo-swagger"_"github.com/swaggo/echo-swagger/example/docs"//文档由生成SwagCLI,你必须导入它。)//@titleSwaggerExampleAPI//@version1.0//@descriptionThisisasampleserverPetstoreserver.//@termsOfServicehttp://swagger.io/terms///@contact.nameAPI支持//@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/v2funcmain(){e:=echo.New()e.GET("/swagger/*",echoSwagger.WrapHandler)e.Logger.Fatal(e.Start(":1323"))}swaggo/echo-swagger:https://github.com/swaggo/ech...c。SwaggerValidation(go-swagger/go-swagger)这个包包含Swagger2.0(又名OpenAPI2.0)的golang实现:它知道如何序列化和反序列化swagger规范。安装:gogetgithub.com/go-swagger/go-swagger/cmd/swagger键入此命令进行验证:swaggervalidateapi/docs/swagger.yaml输出:2021/01/3022:47:01swagger规范位于"api/docs/swagger.yaml"对swaggerspecification2.0有效Go(golang)的记录器,与标准库记录器完全兼容API。示例:packagemainimport(log"github.com/sirupsen/logrus")funcmain(){log.WithFields(log.Fields{"animal":"walrus",}).Info("Awalrusappears")}sirupsen/logrus:https://github.com/sirupsen/l...MockGenerator(vektra/mockery)Golang的mock代码自动生成器安装:gogetgithub.com/vektra/mockery/v2/.../Generatemocks:./bin/mockery--all输出:vektra/mockery:https://github.com/vektra/moc...Migrate(golang-migrate/migrate)用Go编写的数据库迁移。用作CLI或作为库导入。数据库驱动运行迁移:PostgreSQLRedshiftQlCassandraSQLite(todo#165)SQLCipherMySQL/MariaDBNeo4jMongoDBCrateDB(todo#170)Shell(todo#171)GoogleCloudSpannerCockroachDBClickHouseFirebirdMSSQLServer安装:$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/migrations下载golang-migrate/migrate:https://github.com/golang-mig...Messaging(NSQ)NSQTopology:NSQComponents:nsqlookupd(daemonmanagestopology/routing)nsqd(daemonmanagesreceiving,queuing,anddeliveringmessages)nsqadmin(nsq的默认WebUI)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-composeup-d或者,如果使用name(docker-compose-nsq.yml):$docker-compose-fdocker-compose-nsq.ymlup-d检查容器docker:$docker-composeps查看日志:$docker-composelogs检查nsqwebUI(假设端口是32770):$curlhttp://127.0.0.1:32770/ping在golang中:创建文件夹:├──consume│└──consume.go└──publish└──publish.goconsume.go:packagemainimport("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("无法创建消费者")}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("无法连接")}log.Println("Awaiting来自NSQ主题“我的NSQ主题”...”)wg.Wait()}runconsume.go:$gorunconsume/consume.gopublish.go:packagemainimport("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.go:$gorunpublish/publish.gonsqio/go-nsq:https://github.com/nsqio/go-nsqSQL(jmoiron/sqlx)sqlx是一个在Go的标准数据库/sql库之上提供一组扩展的库我喜欢sqlx的地方在于它们可以进行结构扫描。快速且易于使用。结构扫描示例:place:=Place{}rows,err:=db.Queryx("SELECT*FROMplace")forrows.Next(){err:=rows.StructScan(&place)iferr!=nil{log.Fatalln(err)}fmt.Printf("%#vn",place)}jmoiron/sqlx:https://github.com/jmoiron/sqlxadditionaladditionalGo例程分组(同步/错误组)https://pkg.go.dev/golang.org...为golang(Masterminds/squirrel)生成流畅的SQL。https://github.com/Mastermind...GolangLinter(golangci/golangci-lint)https://github.com/golangci/g...Breaker(gojek/heimdall)https://github.com/gojek/heim...Go生成标签的工具(fatih/gomodifytags)https://github.com/fatih/gomo...应用程序和团队。我建议拥有可靠、可读的代码,以便在它成为遗留代码(可能5-10年后)之前更容易维护。构建应用程序的3个关键:简单的设计(项目结构和依赖项)干净的代码(可读性和可维护性)模块化(坚实而灵活的骨架)