cookiecutter-go
- boilerplate, go project starter with
go-zero/gin/go-micro
. - go 微服务(
go-zero/gin/go-micro
)项目目录生成工具/脚手架. - 基于 cookiecutter 实现.
Feature:
-
mono repo
: 支持创建mono repo
, git 项目根目录. -
single app
: 支持创建single app
, 单个微服务目录. - 可单个使用, 也可同时组合使用
- usage:
- 先创建
mono-repo
根目录 - 切换到
app/
下, 创建single app
单个微服务目录.
- 先创建
Development Roadmap:
Intro:
go-zero
微服务:- 集成 air 工具, watch 项目代码,
自动编译 + hot reload
, 让 go 开发更丝滑(类 Python/Js) - rpc: 集成 grpc
- log: 集成 uber log
- db: 集成 gorm + mysql
- cache: 集成 redis
- mq: 集成 rabbitmq
- 服务发现: 集成 etcd
- cronjob: 集成 cronjob
- 集成 air 工具, watch 项目代码,
gin
微服务:- 集成 air 工具, watch 项目代码,
自动编译 + hot reload
, 让 go 开发更丝滑(类 Python/Js) - rpc: 集成 grpc
- log: 集成 uber log
- db: 集成 gorm + mysql
- cache: 集成 redis
- mq: 集成 rabbitmq
- 服务发现: 集成 etcd
- cronjob: 集成 cronjob
- 集成 air 工具, watch 项目代码,
go-micro
微服务:- 集成 air 工具, watch 项目代码,
自动编译 + hot reload
, 让 go 开发更丝滑(类 Python/Js) - rpc: 集成 grpc
- log: 集成 uber log
- db: 集成 gorm + mysql
- 集成 air 工具, watch 项目代码,
User Case:
- https://github.com/zeromicro/zeromall
- 基于 go-zero 的微服务
B2B2C电商平台
- 基于 go-zero 的微服务
Quick Start:
Install:
# Mac OS X 安装 cookiecutter:
brew install cookiecutter
# Debian/Ubuntu:
sudo apt-get install cookiecutter
Best Practice:
- choice 1: create
mono-repo
+single-app
- support templates:
go-zero
gin
go-micro
- support templates:
- choice 2: create
library-repo
1. Mono-Repo + Single-App
- 1.1 create
mono repo
:
git repo / project root.
根据命令行参数提升, 逐步创建.
cd your-workspace/
# 在当前目录下, 创建 go-zero mono repo 项目根目录
cookiecutter https://github.com/better-go/cookiecutter-go.git --directory="mono-repo/go-zero"
# 在当前目录下, 创建 gin mono repo 项目根目录
cookiecutter https://github.com/better-go/cookiecutter-go.git --directory="mono-repo/gin"
# 在当前目录下, 创建 go-micro mono repo 项目根目录
cookiecutter https://github.com/better-go/cookiecutter-go.git --directory="mono-repo/go-micro"
- 1.2 create
single app
folder:
cd your-mono-repo-app-create-root/
# 在当前目录下, 创建微服务目录: 使用 go-micro
cookiecutter https://github.com/better-go/cookiecutter-go.git --directory="single-app/go-zero"
# 在当前目录下, 创建微服务目录: 使用 gin
cookiecutter https://github.com/better-go/cookiecutter-go.git --directory="single-app/gin"
# 在当前目录下, 创建微服务目录: 使用 go-micro
cookiecutter https://github.com/better-go/cookiecutter-go.git --directory="single-app/go-micro"
- tips:
- 路径参数, 不要添加后缀 :
/
go_module_name
如果 和project_folder_name
不同, 要注意不要传错.
- 路径参数, 不要添加后缀 :
2. create library repo:
library-repo
cd your-workspace/
# 在当前目录下, 创建mono repo 项目根目录:
cookiecutter https://github.com/better-go/cookiecutter-go.git --directory="library-repo"
Generate Project Folder Structure:
-
Mono Repo:
-
目录结构简略说明: 对整体目录的 quick look.
-> % tree . -L 3
.
├── app
│ ├── basic // 基础服务: 通常是业务无关的
│ │ ├── demo // 示例:
│ │ └── user // 用户管理:
│ ├── biz // 业务服务: 根据业务切分
│ │ └── member // 会员服务:
│ │ └── order // 订单服务:
│ │ └── cart // 购物车服务:
│ └── std // 业务内统一定义:
│ ├── proto // 统一定义业务状态码
├── deploy // 部署脚本, 服务编排
│ ├── local
│ │ └── Makefile
│ └── staging
│ └── Makefile
├── infra // 基础设施
│ └── tool
└── pkg // 项目积累的 utility 代码库, 与业务无关
- 目录结构详细说明:
-> % tree . -L 6
.
├── LICENSE
├── Makefile
├── README.MD
├── app
│ ├── basic // 基础服务单元1 : 用户管理/推送/短信/等业务无关的通用服务
│ │ ├── demo // 单个微服务示例:
│ │ │ ├── cmd // 单服务启动入口: 包含 多个启动方式:
│ │ │ │ └── main.go // api server, grpc server, job server, admin server 启动
│ │ │ ├── configs // 外部中间件配置项: db,缓存,mq 等
│ │ │ │ └── configs.toml
│ │ │ ├── docs // 单服务自身文档
│ │ │ ├── internal // 业务逻辑(不对外暴露)
│ │ │ │ ├── dao // 数据层 read/write
│ │ │ │ │ ├── cache // 缓存 r/w
│ │ │ │ │ ├── db // db crud
│ │ │ │ │ ├── http // 调用本服务之外的 http api
│ │ │ │ │ ├── meta.go // dao 资源收敛
│ │ │ │ │ ├── mq // mq r/w
│ │ │ │ │ └── rpc // 调用本服务之外的 rpc(gRPC) api
│ │ │ │ ├── domain // 服务内业务拆分:
│ │ │ │ │ └── demo // 业务单元1 / 业务单元2
│ │ │ │ └── service // API 收敛层(对外收敛内部逻辑, 暴露 API: grpc/http/job/admin)
│ │ │ │ └── service.go
│ │ │ └── proto // 数据定义层: (可对外暴露)
│ │ │ ├── api // grpc + http api 定义
│ │ │ │ └── api.proto
│ │ │ ├── config // config toml 映射 model
│ │ │ │ └── config.proto
│ │ │ └── model // 内部 model
│ │ │ └── model.proto
│ │ └── user // 基础服务2:
│ │ ├── identity // 服务内
│ │ │ ├── Makefile
│ │ │ ├── cmd
│ │ │ │ └── main.go
│ │ │ ├── configs
│ │ │ │ └── configs.toml
│ │ │ ├── docs
│ │ │ ├── internal
│ │ │ │ ├── dao
│ │ │ │ ├── domain
│ │ │ │ └── service
│ │ │ ├── proto
│ │ │ │ ├── api
│ │ │ │ ├── config
│ │ │ │ └── model
│ │ │ └── readme.md
│ │ └── readme.md
│ ├── biz // 具体业务单元:
│ │ │── member // 会员服务
│ │ │ └── cmd
│ │ │ └── main.go
│ │ └── order // 订单服务
│ │ └── cmd
│ │ └── main.go
│ └── std // 项目业务内统一定义(业务状态码, 业务出错 msg 编号)
│ ├── Makefile
│ ├── proto
│ │ ├── config
│ │ │ └── config.proto
│ │ └── error
│ │ └── code.proto // 业务状态码
│ └── readme.md
├── deploy // 部署相关脚本: dockerfile 等
│ ├── local
│ │ └── Makefile
│ └── staging
│ └── Makefile
├── go.mod
├── go.sum
├── infra // 插件依赖服务: cli, 中间件等
│ └── tool
└── pkg // 项目中逐步积累的 utility 代码库
46 directories, 24 files
- single app:
-> % tree -L 3 ./single-app/{{cookiecutter.app_name}}
./single-app/{{cookiecutter.app_name}}
├── cmd
│ └── main.go
├── configs
│ └── configs.toml
├── internal
│ └── dao
│ └── db
├── proto
│ └── api
│ └── api.go
└── readme.md
7 directories, 4 files
调用链路说明:
- 代码调用链路说明: 以
app/basic/demo
服务为例(自顶向下调用)- Cmd 启动入口:
app/basic/demo/cmd/main.go
- Service 入口:
app/basic/demo/internal/service/service.go
- 对外 API 网关:
app/basic/demo/internal/service/outer/outer.go
- 对内 RPC 网关:
app/basic/demo/internal/service/inner/inner.go
- 对内 Admin API 网关:
app/basic/demo/internal/service/admin/admin.go
- 对内 Job 网关:
app/basic/demo/internal/service/job/job.go
- 对外 API 网关:
- Proto 数据定义:
- API 层:
app/basic/demo/proto/api/api.proto
- Config 层:
app/basic/demo/proto/config/config.proto
- Model 层:
app/basic/demo/proto/model/model.proto
- API 层:
- Router 路由注册:
app/basic/demo/internal/router/router.go
- Domain 业务领域:
- 某业务单元:
app/basic/demo/internal/domain/demo/demo.go
- 某业务单元:
- Dao 数据层操作:
- Meta 聚合(收敛 Dao 层资源):
app/basic/demo/internal/dao/meta.go
- DB 层:
app/basic/demo/internal/dao/db/db.go
- Cache 层:
app/basic/demo/internal/dao/cache/cache.go
- Meta 聚合(收敛 Dao 层资源):
- Cmd 启动入口:
User Manual:
- https://github.com/better-go/cookiecutter-go/wiki/manual
- 初始化好微服务目录, 如何使用.