当前位置: 首页 > 科技观察

用于构建微服务的十大Go框架-库_0

时间:2023-03-22 14:16:06 科技观察

如今,许多开源库都支持构建应用程序。我应该向您推荐一些库,它们可以帮助您以简单的设计、干净的代码和良好的性能开始一个项目。01CLI命令(spf13/cobra)你想构建一些CLI命令吗?Cobra既是一个用于创建强大的现代CLI应用程序的库,也是一个用于生成应用程序和命令文件的程序。我使用这个库来管理命令应用程序、执行运行器、初始化配置和启动RestAPI。基于Cobra的应用组织结构:├──app│├──main.go│├──cmd│└──root.goapp/main.go代码如下:packagemainimport("app/cmd")funcmain(){cmd.Execute()}app/cmd/root.go代码如下:运行:func(cmd*cobra.Command,args[]string){//DoStuffHere},}funcExecute(){iferr:=rootCmd.Execute();err!=nil{fmt.Println(err)os.Exit(1)}}项目地址:https://github.com/spf13/cobra。02ConfigReader(spf13/viper)Viper是Go应用程序的完整配置解决方案。Viper支持以下格式的配置:JSONTOMLYAMLHCLINIenvfileJavaproperties配置文件如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)英尺。printf("port:%s",port)}项目地址:https://github.com/spf13/viper。03WebFramework(labstack/echo)Echo是一个高性能、极简的GoWeb框架。安装//gogetgithub.com/labstack/echo/{version}gogetgithub.com/labstack/echo/v4示例packagemainimport("net/http""github.com/labstack/echo/v4""github.com/labstack/echo/v4/middleware")funcmain(){//Echoinstancee:=echo.New()//Middlewaree.Use(middleware.Logger())e.Use(middleware.Recover())//Routese.GET("/",hello)//Startservere.Logger.Fatal(e.Start(":1323"))}//Handlerfunchello(cecho.Context)error{returnc.String(http.StatusOK,"Hello,World!")}item地址:https://github.com/labstack/echo。04DependencyInjection(uber-go/fx)我发现这个库非常有用,你不需要生成任何东西。只有代码。非常模块化和清晰的层次结构。用于依赖注入的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。04SwaggerGenerator、UI和Validation在swagger部分,我不得不使用3个不同的库,因为我还没有找到1个库同时包含这3个库的功能。如果您有推荐,请在评论中告诉我。A。Swagger生成器(swaggo/swag)Swag将Go注释转换为SwaggerDocumentation2.0。我们为流行的GoWebb框架[1]创建了各种各样的插件。这使您可以快速与现有的Go项目集成(使用SwaggerUI)。支持的Web框架:ginechobuffalonet/httpSwag已经可以处理您的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/v1funcmain(){...r.GET("/swagger/*any",ginSwagger.WrapHandler(swaggerFiles.Handler))...}项目地址:https://github.com/swaggo/swag。b.SwaggerUI(swaggo/echo-swagger)由于我用的是echo,所以swagger选择了这个用户界面。用法示例:packagemainimport("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/v2funcmain(){e:=echo.New()e.GET("/swagger/*",echoSwagger.WrapHandler)e.Logger.Fatal(e.Start(":1323"))}项目地址:https//github.com/swaggo/echo-招摇。C。Swagger验证(go-swagger/go-swagger)此包包含Swagger2.0(又名OpenAPI2.0[2])的golang实现:它知道如何序列化和反序列化Swagger规范。安装:gogetgithub.com/go-swagger/go-swagger/cmd/swagger运行验证:swaggervalidateapi/docs/swagger.yaml输出如下:2021/01/3022:47:01Theswaggerspecat"api/docs/swagger.yaml》isvalidagainstswaggerspecification2.0项目地址:https://github.com/go-swagger/go-swagger。06.自定义Logger(sirupsen/logrus)Logrus是Go(golang)的结构化Logger,完全兼容标准库Log。示例:packagemainimport(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/.../generatemock:./bin/mockery--alloutput:项目地址:https://github.com/vektra/嘲笑。08.Migrate(golang-migrate/migrate)是一个用Go编写的数据库迁移工具。用作CLI[3]或导入为库[4]。支持以下数据库:PostgreSQLRedshiftQlCassandraSQLite(todo#165)SQLCipherMySQL/MariaDBNeo4jMongoDBCrateDB(todo#170)Shell(todo#171)GoogleCloudSpannerCockroachDBClickHouseFirebirdMSSQLServerInstall:$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/migrationsupdown版本:migrate-database"mysql://user:pass@tcp(localhost:3600)/user"-path=database/migrationsdown项目地址:。09、Messaging(NSQ)NSQ拓扑:NSQ组件:nsqlookupd(daemonmanagetopologies/routes)nsqd(daemonmanagereceives,queues,anddeliveriesmessages)nsqadmin(defaultWebUIofnsq)basedondocker-compose示例:(nsqlookupd,nsqd,nsqadmin)version:'3'services:nsqlookupd:image:nsqio/nsqcommand:/nsqlookupdports:-"416??0:4160"-"416??1: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"执行:Torundocker:$docker-composeup-dorifusename(docker-compose-nsq.yml):$docker-compose-fdocker-compose-nsq.ymlup-dTocheckcontainerdocker:$docker-composepsToseelogs:$docker-composelogsTochecknsqwebui:(assumingportis32770)$curlhttp://127.0.0.1:32770/pingGo代码目录:CreateFolder:├──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("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:$gorunco??nsume/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.发布("My_NSQ_Topic",[]byte("sampleNSQmessage"))iferr!=nil{log.Panic(err)}}runpublish:$gorunpublish/publish.go项目地址:https://github.com/nsqio/go-nsq10,SQL(jmoiron/sqlx)sqlx是一个库,是标准的database/的gosql库提供了一组扩展。我喜欢sqlx,因为它们可以扫描结构!使用简单。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.附加库Go例程分组(sync/errgroup):https://pkg.go.dev/golang.org/x/sync/errgroupgolang的FluentSQL生成(Masterminds/squirrel):https://github.com/masterminds/squirrelGolangLinter(golangci/golangci-lint):https://github.com/golangci/golangci-lint断路器(gojek/heimdall):https://github.com/gojek/heimdallGo工具生成标签(fatih/gomodifytags):https://github.com/fatih/gomodifytags12.总结构建一个应用,我们应该知道有哪些功能是可用的,特别是如果我们在团队中工作,建议使用可读性强的代码,这使得代码在成为遗留代码之前更易于维护(可能从现在起5-10年)。构建应用程序的三个关键:简单设计(项目结构和依赖项)清洁代码(可读性和可维护性)模块化(坚固灵活的骨架)为了封装所有这些库,我有一个模板或框架项目,它的设计很简单,它的代码清楚了。检查一下:https://github.com/kecci/goscription。这就是我的前10个Go框架/库和一些附加组件。我希望你喜欢我的推荐,如果你有其他推荐,请发表评论!参考文献[1]GoWebb框架:https://github.com/swaggo/swag#supported-web-frameworks[2]OpenAPI2.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-去项目