Github项目地址: [go-starter](https://github.com/PinkHello/go-starter) # go-starter 小型项目快速开发脚手架 为了快速开发验证最小 MVP,我整合了我们常用go第三方库集成、诸如 echo 、swag 、viper 、nsq 、logrus 、fx 、xorm 、cobra 等,为了快速进入业务开发,模板式开发。 -------------- ## 集成的第三方库与技术 - Github Actions - 自定义Logger [logrus](https://github.com/sirupsen/logrus) - CLI命令 [cobra](https://github.com/spf13/cobra) - 配置读取器 [viper](https://github.com/spf13/viper) - Web框架 [echo](https://github.com/labstack/echo) - 依赖注入 [fx](https://github.com/uber-go/fx) - ORM [xorm](https://github.com/go-xorm/xorm) - Swagger generator [swag](https://github.com/swaggo/swag) [echo-swagger](https://github.com/swaggo/echo-swagger) - Messaging [NSQ](https://github.com/nsqio/nsq) - golangci-lint [golangci-lint](https://github.com/golangci/golangci-lint) - Migrate [migrate](https://github.com/golang-migrate/migrate) - ...... -------------- ## 项目代码结构分层 ```shell - app # 主程序入口 - cmd - ... - config # 配置相关 - deploy # ci/cd相关, 镜像相关 - mysql # mysql docker-compose - nsq # nsq docker-compose - ... # 其他部署相关 - docs # swag 生成的 swagger2.0 文档目录 - internal # 核心业务逻辑 - controller # http handler(controller层) - http # http sever 启动入口 - lib # 核心基础 - models # 模型 - nsq # nsq producer 和 nsq consumer 启动入口与业务 - repository # repository 层 - service # service层 - utils # 工具通用(工具方法、常量、通用错误定义) - ... - ... ``` -------------- ## 构建发布依赖 ### swag 生成最新的Swagger文档 ```shell > swag init -g app/main.go ``` 产生的swagger地址为 http://{IP}:{PORT}/swagger/index.html ### 构建和发布镜像 - 本地 ```shell > cd . > docker build . --file deploy/Dockerfile --tag {ImageTag} ``` - github action > 在CI内部已经做了自动化构建和发布镜像( `github` 当前项目下`secrets`配置的 { secrets.ACCESS_USERNAME } 的值是 `docker hub 用户名`) ### BE初始化和启动部署 1. 创建`docker`自定义网络`go_starter_network` ```shell > docker network create go_starter_network ``` 2. `mysql`启动 与 `nsq`启动 ```shell # MYSQL 启动 > cd deploy/mysql > docker-compose up -d # NSQ 启动 > cd deploy/nsq > docker-compose up -d ``` 3. BE后端服务启动 ```shell # go-starter 启动 > cd deploy > docker-compose up -d ``` 4. 访问健康坚持接口 ```shell http://{IP}:{PORT}/ ``` -------------- ### 其他文件相关描述 - Dockerfile -- Docker镜像分为两阶段构建, Builder阶段 与 打包阶段。 ```dockerfile # Builder阶段构建二进制可执行文件 FROM golang:1.16.1-alpine3.13 as builder ...... RUN CGO_ENABLED=0 GOOS=linux go build -o go_starter app/main.go # 打包阶段 FROM alpine ...... # 从构建阶段COPY生成的可执行文件 COPY --from=builder /app/go_starter /app # ...... ``` - Uber 依赖框架 fx. [fx 开发包详细说明](https://pkg.go.dev/go.uber.org/fx) ```go //上面的代码不写了 ...... var ( httpCmd = &cobra.Command{ Use: "http", Short: "Start Http REST API", Run: initHTTP, } ) func initHTTP(cmd *cobra.Command, args []string) { fx.New(inject()).Run() } // 注意前后依赖关系,顺序启动。 func inject() fx.Option { return fx.Options( fx.Provide( config.NewConfig, utils.NewTimeoutContext, ), libs.XormModule, repository.Module, service.Module, controller.Module, nsq.ProducerModule, nsq.ConsumerModule, http.Module, ) } ``` - swag 说明 `doc 目录下为自动生成的,不需要更改,需要更改的化话需要更高主要上面的注释`