大家好,今天小编来为大家解答以下的问题,关于Go 微服务最佳实践:TOP 10 框架与库,这个很多人还不知道,现在让我们一起来看看吧!
许多开源库现在支持构建应用程序。我应该向您推荐一些库,它们可以帮助您启动具有简单设计、干净代码和良好性能的项目。
01 CLI 命令(spf13/cobra)
您想构建一些CLI 命令吗?
Cobra 既是一个用于创建强大的现代CLI 应用程序的库,也是一个用于生成应用程序和命令文件的程序。我使用这个库来管理命令应用程序、执行运行器、初始化配置并启动Rest API。
基于Cobra的应用组织结构:
appmain.gocmdroot.goapp/main.go的代码如下:
packagemainimport('app/cmd')funcmain(){cmd.Execute()}app/cmd/root.go 代码如下:
packagecmdvarrootCmd=cobra.Command{Use:'hugo',Short:'Hugoisveryfaststaticsitegenerator',Long:`AFastandFlexibleStaticSiteGeneratorbuiltwithlovebyspf13andfriendsinGo.完整文档可在http://hugo.spf13.com`,Run:func(cm d*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)
Viper 是一个完整的Go 应用程序配置解决方案。
Viper 支持以下格式配置:
JSONTOMLYAMLHCLINIenvfileJava 属性配置文件,例如config/config.toml:
地址='localhost'端口='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)
Echo 是一个高性能、简约的Go Web 框架。
安装
//gogetgithub.com/labstack/echo/{版本}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!')}项目地址:https://github.com/labstack/echo。
04 依赖注入(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。
04 Swagger Generator, UI 和 Validation
在swagger 部分,我不得不使用3 个不同的库,因为我没有找到1 个库同时包含所有3 个库的功能。如果您有建议,请在评论中告诉我们。
a、Swagger generator (swaggo/swag)Swag 将Go 注释转换为Swagger 文档2.0。
我们为流行的Go Webb 框架创建了各种插件[1]。这使您可以快速集成现有的Go 项目(使用Swagger UI)。
支持的网络框架:
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、Swagger UI (swaggo/echo-swagger)由于我使用的是echo,所以我为swagger 选择了这个用户界面。
使用示例:
packagemainimport('github.com/labstack/echo/v4''github.com/swaggo/echo-swagger'_'github.com/swaggo/echo-swagger/example/docs'//docsis generatedbySwagCLI,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-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:01Theswaggerspecat'api/docs/swagger.yaml'isvalidagainstswaggerspecification2.0项目地址:https://github.com/go-swagger/go-swagger。
06、自定义 Logger (sirupsen/logrus)
Logrus是Go(golang)的结构化记录器,与标准库Log完全兼容。
例子:
packagemainimport(log'github.com/sirupsen/logrus')funcmain(){log.WithFields(log.Fields{'animal':'walrus',}).Info('Awalrusappears')}项目地址:https://github.com/西鲁普森/洛鲁斯。
07、Mock 生成器 (vektra/mockery)A 模拟代码自动生成器
安装:
gogetgithub.com/vektra/mockery/v2/./生成模拟:
./bin/mockery--所有输出:
项目地址:https://github.com/vektra/mockery。
08、Migrate (golang-migrate/migrate)Go 编写的数据库迁移工具。用作CLI[3] 或导入为库[4]。
支持以下数据库:
PostgreSQLRedshiftQlCassandraSQLite (todo #165)SQLCipherMySQL/MariaDBNeo4jMongoDBCrateDB (todo #170)Shell (todo #171)Google Cloud SpannerCockroachDBClickHouseFirebirdMS 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)
NSQ拓扑:
NSQ 组成部分:
nsqlookupd(守护进程管理拓扑/路由)nsqd(守护进程管理接收、排队和传递消息)nsqadmin(nsq的默认Web UI)基于docker-compose示例:(nsqlookupd,nsqd,nsqadmin)
版本:'3'services:nsqlookupd:image:nsqio/nsqcommand:/nsqlookupdports:-'4160:4160'-'4161:4161'nsqd:image:nsqio/nsqcommand:/ns qd --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:(假设portis32770)$cur lhttp://127.0.0.133 36032770/pingGo代码目录:
CreateFolder:consumeconsume.gopublishpublish.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('等待来自NSQtopic的消息\ 'MyNSQTopic\'.')wg.Wait()} 运行Consumer.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)}} 运行发布:
$gorunpublish/publish.go 项目地址:https://github.com/nsqio/go-nsq。
10、SQL (jmoiron/sqlx)sqlx 是一个库,为go 的标准数据库/sql 库提供了一组扩展。
我喜欢sqlx 的一点是它们可以扫描结构!使用简单。
StrucScan 示例:
place:=放置{}行,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/errgroup golang 的流畅SQL 生成(Masterminds/squirrel):https://github.com/Masterminds/squirrelGolang Linter(golangci/golangci- lint):https://github.com/golangci/golangci-lint断路器(gojek/heimdall)
:https://github.com/gojek/heimdallGo tool generate tags (fatih/gomodifytags):https://github.com/fatih/gomodifytags12、总结要构建应用程序,我们应该知道有什么功能,特别是如果我们是团队协作,建议使用可读性强的代码,这样在成为遗留代码之前(也许 5-10 年之后) ,代码可以更容易维护。 构建应用程序的三个关键: 简单设计(项目结构和依赖关系)Clean Code (可读性和可维护性)Modular(模块化) (Solid & flexible skeleton)为了封装所有这些库,我有一个模板或框架项目,其设计简单,代码清晰。看看这个:https://github.com/kecci/goscription。 我希望你喜欢我的推荐,如果你有其他的推荐,请留言!参考资料[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文章到此结束,如果本次分享的Go 微服务最佳实践:TOP 10 框架与库和的问题解决了您的问题,那么我们由衷的感到高兴!
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7828.html
用户评论
看了下这篇文章,感觉Go确实很适合做微服务!
有11位网友表示赞同!
我一直想学习Go开发微服务,这篇文章是个好开端!不知道哪些框架最常用?
有15位网友表示赞同!
我最近在研究Go微服务,现在还在探索合适框架,感谢分享文章内容!
有9位网友表示赞同!
终于有机会了解下Go的微服务生态系统了,期待学习新知识!
有9位网友表示赞同!
这篇文章能让我更好地理解Go中微服务的构建方法,很好!
有17位网友表示赞同!
需要关注一下国内外最受欢迎的Go微服务框架和库吧!
有12位网友表示赞同!
在实战项目中体验过Go微服务吗?哪个框架更适合实际应用场景?
有14位网友表示赞同!
想学习一些 Go 微服务的最佳实践,这篇文章能提供哪些帮助呢?
有17位网友表示赞同!
了解一下这些框架的优劣势和适用场景很重要!
有6位网友表示赞同!
这篇文章介绍的功能对比是否也很详细呢?
有12位网友表示赞同!
Go语言开发速度很快,微服务应该也更灵活吧?
有10位网友表示赞同!
文章提到十大框架,哪个最值得推荐使用呢?
有10位网友表示赞同!
不知道这些框架的使用难易程度如何,适合入门还是有一定经验的人?
有11位网友表示赞同!
学习Go需要掌握哪些基础知识才能更好地理解微服务框架?
有14位网友表示赞同!
期待看到一些开源示例代码,可以更容易上手!
有5位网友表示赞同!
这篇文章对不同规模项目的建议是什么呢?
有5位网友表示赞同!
希望文章能分享一下这些框架的性能表现和稳定性!
有19位网友表示赞同!
Go 微服务生态圈发展的趋势如何?值得我们长期关注吗?
有7位网友表示赞同!
构建微服务的最佳实践有哪些,除了框架选择还有什么要考虑的吗?
有16位网友表示赞同!