Table of Contents
使用 go-coco cli 构建一个新项目:
# 安装 go-coco cli
go install github.com/iftechio/go-coco@latest
# 创建项目目录
mkdir <proj_root>
cd <proj_root>
# 确保 `go-coco` 在包含 `go.mod` 的目录下运行
go mod init <app_name>
go-coco init <micro_service_name>
Notes:
- 使用
app.Manager
组织需要启动的微服务应用 - 使用
config
解析来自 toml 和 env 的应用变量配置 - 使用
infra
快速构建基础层组件 - 使用
wire
将应用和组件打包注入
go get github.com/iftechio/go-coco@latest
提供各类服务或者功能的应用组件,通过 app.Manager
整合,根据环境变量配置决定启动哪些应用,并自动处理优雅退出的问题,同时负责初始化和销毁所需要使用的基础设施组件。Manager
提供 RegisterApp
和 RegisterInfra
方法来注册 App 和 Infra 实例。
classDiagram
App <.. HTTPServer
App <.. GRPCServer
App <.. Cronjob
App <.. Looper
Manager *-- App
Manager *-- Infra
Infra <.. Sentry
Infra <.. Redis
Infra <.. Mongo
一个 App 实例需要实现如下接口,可以通过嵌入 app.AlwaysEnabled
来标识总是自动启用的 App (例如用于健康检查的 HTTPServer)
type App interface {
Start() error // 应用的启动入口,包含初始化流程
IsEnabled() bool // 应用启动的检测条件,例如 consumer 的环境变量开关是否开启等
}
一些辅助工具包:
app/server/xecho
对 echo/v4 的封装,帮助快速构建一个 HTTPServerapp/server/xgrpc
对 grpc 的封装,帮助快速构建一个 GRPCServerapp/looper
用于快速构建一个循环任务应用(Looper),目前提供SinglePod
工作模式
提供各类基础层组件,如第三方组件、数据仓储、消息中间件等。
包内提供了以下组件的实现:
- Redis: github.com/go-redis/redis
- Mongo: go.mongodb.org/mongo-driver
- Sentry: github.com/getsentry/sentry-go
- Kafka: github.com/segmentio/kafka-go
一个自定义的 Infra 实例需实现如下接口,可通过嵌入 infra.Coco
来实现
package infra
type Infra interface {
CocoInfra()
}
提供通用的 toml 和 env 解析工具,帮助快速构建一个系统配置实例
提供常用的组件包
go-coco 提供了便捷的 cli 工具用于快速生成一个基于 wire 的微服务项目。特色是可按需选择 Apps 和 Infras,生成的项目开箱即用。开发者只需修改一些项目特定的配置(如环境变量、配置等) ,然后便可将精力放在实现 service 本身的具体业务逻辑上了。
go install github.com/iftechio/go-coco@latest
首先你需要安装 wire。同时,由于 go-coco cli 提供了基于 protobuf + grpc-gateway 的实现方案生成,如果你希望在项目中使用 http + grpc 这样的解决方案,需要提前安装 buf
wire.go
是 wire 依赖注入框架的配置文件,定义了如何使用 wire 来自动生成依赖注入代码,以简化依赖管理和对象的创建过程。为了方便在 IDE 中编写 wire.go 文件,可以为 IDE 所使用的 go language server 添加 wireinject
build tag 配置(以 gopls 为例)
"gopls": {
"build.buildFlags": [
"-tags=wireinject"
]
}
go-coco upgrade
go-coco version
Usage:
go-coco init [service] [flags]
Flags:
--alpine string alpine version used in docker image (default "3.16")
-h, --help help for init
-s, --skip-go-get skip go get mods
该命令需要在包含 go.mod 的项目中执行,如果想全新的目录开始,请先执行 go mod init
。命令执行后,会提示输入服务描述,并选择所需的 Apps 和 Infras。
[service]
可以使用.
此时服务名会设置成当前目录名;[service]
也可以加上 path 前缀,如app/post