我使用这个库来管理命令应用程序,执行 runner 应用程序,初始化配置,并启动 Rest API。
基于 Cobra 的应用组织结构:
在 app/main.go 中:
在 app/cmd/root.go 中:
Cobra:https://github.com/spf13/cobra
2配置读取器 (spf13/viper)
Viper 是一个完整的 Go 应用配置解决方案。
Viper 可以读取以下内容:
- JSON
- TOML
- YAML
- HCL
- INI
- envfile 以及Java 属性配置文件
示例 config/config.toml :
读取 config.go:
在 main.go 中使用 config 中的 value:
Viper:https://github.com/spf13/viper
3Web 框架 (labstack/echo)
高性能、极简主义的 Go Web 框架
安装:
示例:
4依赖注入 (uber-go/fx)
我发现这个库非常有用,你不需要生成任何东西。只是代码。非常模块化,层次清晰。
一个基于依赖注入的 Go 应用框架。
Uber-go/fx: https://github.com/uber-go/fx
5Swagger 生成器、UI 和验证
在 swagger 部分,我必须使用不同的 3 个库,因为我找不到任何一个库可以在一个库中包含 3 个库。
a. Swagger 生成器 (swaggo/swag)
Swag 将 Go 注释转换为 Swagger 文档 2.0。
Swag 将 Go 注释转换为 Swagger 文档 2.0。
我们已经为流行的 Go Web 框架 创建了各种插件。这使你可以快速地与现有的 Go 项目集成(使用 Swagger UI)。
支持的 Web 框架:
- gin
- echo
- buffalo
- net/http
Swag 已经处理了你的 swagger 文档。所以你不再需要写 swagger.yml 或 swagger.json 。你需要做的就是写注释。这是一个例子:
swaggo/swag:https://github.com/swaggo/swag
b. Swagger UI (swaggo/echo-swagger)
因为我用的是 echo,所以我选择这个作为 swagger 的用户界面。
使用示例:
swaggo/echo-swagger:https://github.com/swaggo/echo-swagger
c. Swagger 验证 (go-swagger/go-swagger)
这个包包含了 Swagger 2.0(也就是 OpenAPI 2.0)的 golang 实现:它知道如何序列化和反序列化 swagger 规范。
安装:
键入此命令以验证:
输出:
go-swagger/go-swagger:https://github.com/go-swagger/go-swagger
6自定义记录器 (sirupsen/logrus)
Logrus 是一个适用于 Go(golang) 的结构化记录器,与标准库记录器完全 API 兼容。
示例:
sirupsen/logrus:https://github.com/sirupsen/logrus
7模拟生成器 (vektra/mockery)
Golang 的模拟代码自动生成器
安装:
生成模拟:
输出:
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
安装:
键入命令创建迁移文件:
键入命令运行迁移:
键入命令中断迁移:
golang-migrate/migrate:https://github.com/golang-migrate/migrate
9消息传递 (NSQ)
NSQ 拓扑:
NSQ 组件:
- nsqlookupd (守护进程管理拓扑 / 路由)
- nsqd(守护进程管理接收、排队和传递消息)
- nsqadmin(nsq 的默认 Web UI)
docker-compose 示例:(nsqlookupd, nsqd, nsqadmin)
执行:
在 golang 中:
consume.go:
运行 consume.go:
publish.go:
运行 publish.go:
nsqio/go-nsq:https://github.com/nsqio/go-nsq
10SQL (jmoiron/sqlx)
sqlx 是一个库,它在 Go 的标准 database/sql 库上提供了一组扩展。
我喜欢 sqlx 的一点是它们可以进行结构扫描。快速而简单的使用。
结构扫描示例:
jmoiron/sqlx: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/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
12总结
要建立应用程序,我们应该知道我们有什么特性,特别是如果我们想建立持续的应用程序和团队之间的合作。我建议有一个坚实的、可读性强的代码,这样在成为遗留代码之前(也许 5~10 年后),它可以更容易维护。
构建应用的 3 个关键:
- 简单设计(项目结构和依赖关系)
- 干净的代码(可读和可维护)
- 模块化(实心骨架和柔性骨架)
为了把这些库都包装起来,我有一个设计简单、代码干净的模板或骨架项目。请看:https://github.com/kecci/goion
作者介绍:
Kecci Kun,软件工程师。
https://keccikun.medium.com/top-10-framework-golang-library-to-build-microservice-391a2bb4c2cb