你的单体
Cinch
cinch
意 为简单的事 ,小 菜 .希望 把 复杂的 事 变得简单,提 升 开发效率 .
若 你想深入 学 习微服 务每个组件 ,建 议直接 看 Kratos官 方 文 档.本 项目整合 一些业务常用组件, 开箱即 用 , 并不会 把 每 个组件 都 介 绍那么详细.
Go
-当 前 Go版本 直接 上 v1.20
Proto
- proto协议同 时开启gRPC & HTTP支持 ,只 需开发一 次 接 口 ,不用 写 两套Jwt
- 认证,用 户登入 登 出 一 键搞定 Action
- 权限,基 于行为的权限校 验Redis
- 缓存,内 置 防 缓存穿 透 /缓存击穿/缓存雪崩 示 例 Gorm
-数 据 库ORM管理 框 架 ,可 自 行 扩展多 种数据 库类型 ,目前 使用 MySQL, 其他自 行 扩展Gorm Gen
- Gorm实体自 动生成 , 无需再 写 数 据 库实体 映 射 Tenant
-基 于Gorm的 schema层面的 多 租户(一个租户一个数据库schema)SqlMigrate
-数 据 库迁移 工具 ,每次 更新 平滑 迁移Asynq
-分布 式 定 时任务(异步任 务)Log
-日 志 ,在 Kratos基 础上增加 一 层包装 , 无需每 个方法 传入Embed
- go 1.16文 件 嵌入 属性 , 轻松将 静 态文件 打 包 到 编译后 的 二 进制应用中 Opentelemetry
- 链路追 踪,跨 服 务调用 可 快速 追 踪完整 链路Idempotent
-接 口 幂等性 (解 决重复点击或提 交)Pprof
-内 置 性能 分析 开关, 对并发/性能 测试友好 Wire
-依 赖注入 , 编译时完成 依 赖注入 Swagger
- Api文 档一键生成 , 无需在 代 码里写 注解 I18n
-国 际化支持 , 简单切 换多语言
go install github.com/go-cinch/cinch/cmd/cinch@latest
cinch new game
├── api // 各 个微服 务的proto/go文 件 , proto文 件 通 过submodule管理 包含 proto后 缀
│ ├── auth // auth服 务所需的go文 件 (通 过命令 生成 )
│ ├── auth-proto // auth服 务proto文 件
│ ├── reason
│ ├── reason-proto // 公共 reason(错误码建议统一 管理 , 不要 不同 服 务搞不同 的 )
│ ├── xxx // xxx服 务所需的go文 件 (通 过命令 生成 )
│ ├── xxx-proto // xxx服 务proto文 件
│ └── ...
├── cmd
│ └── game // 项目名
│ ├── main.go // 程 序 主 入口
│ ├── wire.go // wire依 赖注入
│ └── wire_gen.go
├── configs // 配置 文 件 目 录
│ ├── config.yml // 主 配置 文 件
│ ├── client.yml // 配置 grpc服 务client, 如auth
│ ├── gen.yml // gen gorm或 migrate会 用 到 的 配置 文 件
│ └── ... // 其他自 定 义配置 文 件 以yml/yaml结尾均 可
├── internal // 内部 逻辑代 码
│ ├── biz // 业务逻辑的 组装层, 类似 DDD 的 domain 层, data 类似 DDD 的 repo, 而 repo 接 口 在 这里定 义, 使用 依 赖倒置 的 原 则.
│ │ ├── biz.go
│ │ ├── reason.go // 定 义错误描述
│ │ ├── game.go // game业务
│ │ └── xxx.go // 其他业务
│ ├── conf
│ │ ├── conf.pb.go
│ │ └── conf.proto // 内部 使用 的 config的 结构定 义, 使用 proto格式 生成
│ ├── data // 业务数 据 访问, 包含 cache、db 等 封 装 , 实现了 biz 的 repo 接 口 . 我 们可能会 把 data 与 dao 混淆 在 一起 , data 偏重 业务的 含义, 它所要 做的是 将 领域对象重 新 拿出来 , 我 们去掉了 DDD 的 infra层.
│ │ ├── model // gorm gen生成 model目 录
│ │ ├── query // gorm gen生成 query目 录
│ │ ├── cache.go // cache层, 防 缓存击穿/缓存穿 透 /缓存雪崩
│ │ ├── client.go // 各 个微服 务client初 始 化
│ │ ├── ctx.go
│ │ ├── data.go // 数 据 初 始 化 , 如DB/Redis
│ │ ├── game.go
│ │ └── tracer.go // 链路追 踪tracer初 始 化
│ ├── db
│ │ ├── migrations // sql迁移文 件 目 录, 每 一次数据库变更都放在这里, 参考 https://github.com/rubenv/sql-migrate
│ │ │ ├── xxx.sql // sql文 件
│ │ │ └── ...
│ │ └── migrate.go // embed sql文 件
│ ├── pkg // 自 定 义扩展 包
│ │ ├── idempotent // 接 口 幂等性
│ │ ├── task // 异步任 务, 内部 调用asynq
│ │ └── xxx // 其他扩展
│ ├── server // http和 grpc实例的 创建和 配置
│ │ ├── middleware // 自 定 义中间件
│ │ │ ├── locales // i18n多 语言map配置 文 件
│ │ │ └── xxx.go // 一 些中间件
│ │ ├── grpc.go
│ │ ├── http.go
│ │ └── server.go
│ └── service // 实现了 api 定 义的服 务层, 类似 DDD 的 application 层, 处理 DTO 到 biz 领域实体的 转换(DTO -> DO), 同 时协同 各 类 biz 交互 , 但 是 不 应处理 复杂逻辑
│ ├── service.go
│ ├── game.go // game接 口 入口
│ └── xxx.go // 其他接 口 入口
├── third_party // api依 赖的第 三 方 proto, 编译proto文 件 需要 用 到
│ ├── cinch // cinch公共 依 赖
│ ├── errors
│ ├── google
│ ├── openapi
│ │── validate
│ └── ... // 其他自 定 义依赖
├─ .gitignore
├─ .gitmodules // submodule配置 文 件
├─ .golangci.yml // golangci-lint
├─ Dockerfile
├─ go.mod
├─ go.sum
├─ LICENSE
├─ Makefile
└─ README.md
启动项目
- go1.18+(
建 议使用 g)# sudo apt update # sudo apt install -y curl curl -sSL https://raw.githubusercontent.com/voidint/g/master/install.sh | bash source "$HOME/.g/env" # g --version # g version 1.5.0 g install 1.20 # go version # go version go1.20 linux/amd64 echo "export GOPATH=/home/ubuntu/go" >> ~/.bashrc # 设置go/bin
目 录到PATH,若 不 设置, go安 装 的 一些文件无法识别 echo "export PATH=$PATH:/home/ubuntu/.g/go/bin:/home/ubuntu/go/bin" >> ~/.bashrc source ~/.bashrc - 开启go modules
- mysql(
本地 测试建 议使用 docker-compose搭建) - redis(
本地 测试建 议使用 docker-compose搭建)#
安 装 docker sudo apt-get update curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install -y docker-ce # sudo docker -v # Docker version 23.0.1, build a5ee5b1 #国内 加速 安 装 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install -y docker-ce # sudo docker -v # Docker version 23.0.1, build a5ee5b1 #去 除 docker sudo sudo groupadd docker sudo gpasswd -a ${USER} docker sudo systemctl restart docker sudo chmod a+rw /var/run/docker.sock # docker -v # Docker version 23.0.1, build a5ee5b1 # docker-compose sudo curl -L https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose # docker-compose -v # Docker Compose version v2.10.2 # 简单启动一 个单机 版 mysql和 redis git clone https://github.com/go-cinch/compose cd compose/single #修 改 默 认密码 source myenv docker-compose -f docker-compose.db.yml up -d redis mysql # docker ps # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 918328d0aae1 mysql:8.0.19 "docker-entrypoint.s…" About an hour ago Up 59 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql # 918b2cfcd72e redis:7.0 "docker-entrypoint.s…" About an hour ago Up 59 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp redis - protoc
curl -LO https://github.com/protocolbuffers/protobuf/releases/download/v3.20.3/protoc-3.20.3-`uname -s`-`uname -m`.zip # apt install -y unzip sudo unzip protoc-3.20.3-`uname -s`-`uname -m`.zip -d /usr # protoc --version # libprotoc 3.20.3
- protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.30.0 # protoc-gen-go --version # protoc-gen-go v1.30.0
- git
sudo apt update sudo apt install -y git
- cinch cli
工具 go install github.com/go-cinch/cinch/cmd/cinch@latest # cinch -v cinch version v1.0.0
权限认证
git clone https://github.com/go-cinch/auth
# 可 以指定 tag
# git clone -b v1.0.3 https://github.com/go-cinch/auth
# 1.通 过模板 创建项目
cinch new game
# -r 指定 仓库 -b 指定 分 支
# cinch new game -r https://github.com/go-cinch/layout.git -b dev
# 2. 进入项目
cd game
# 创建个人开发分 支
git init -b mark/dev
# 如果你的git版本 较低
# git init
# git checkout -b mark/dev
# 3. 初 始 化 submodule(不 想 使用 可 忽 略 此步骤)
# -b指定 分 支 --name指定 submodule名称
git submodule add -b master --name api/auth-proto https://github.com/go-cinch/auth-proto.git ./api/auth-proto
# -b指定 分 支 --name指定 submodule名称
git submodule add -b master --name api/reason-proto https://github.com/go-cinch/reason-proto.git ./api/reason-proto
# 这里用 game作 为示例 , 按需修 改
# -b指定 分 支 --name指定 submodule名称
git submodule add -b master --name api/game-proto https://github.com/go-cinch/game-proto.git ./api/game-proto
# 删除一个已经存在的submodule
# git submodule deinit api/game-proto
# git rm --cached api/game-proto
# rm -rf .git/modules/api/game-proto
# rm -rf api/game-proto
# 4. 初 始 化 依 赖项(需确保 已 经安装 make)
# sudo apt install -y make
make init
# 5. 编译项目
make all
# 修 改 auth项目配置
cd auth
# 将 mysql/redis的 配置 修 改 成 你本地 配置
vim configs/config.yml
# 修 改 game项目配置
cd game
# 将 mysql/redis的 配置 修 改 成 你本地 配置
vim game/configs/config.yml
# 将 auth服 务host和 端 口 修 改 成 你本地 配置
vim game/configs/client.yml
# 启动auth
cd auth
cinch run
# 启动game
cd game
cinch run
# 启动auth
# 如果你用的 是 compose/single
export AUTH_DATA_DATABASE_DSN='root:mysqlrootpwd@tcp(127.0.0.1:3306)/auth?parseTime=True'
export AUTH_DATA_REDIS_DSN='redis://:redispwd@127.0.0.1:6379/0'
# 其他按需修 改
export AUTH_DATA_DATABASE_DSN='root:root@tcp(127.0.0.1:3306)/auth?parseTime=True'
export AUTH_DATA_REDIS_DSN='redis://127.0.0.1:6379/0'
cd auth
cinch run
# 启动game
# 如果你用的 是 compose/single
export GAME_DATA_DATABASE_DSN='root:mysqlrootpwd@tcp(127.0.0.1:3306)/game?parseTime=True'
export GAME_DATA_REDIS_DSN='redis://:redispwd@127.0.0.1:6379/0'
# 其他按需修 改
export GAME_DATA_DATABASE_DSN='root:root@tcp(127.0.0.1:3306)/game?parseTime=True'
export GAME_DATA_REDIS_DSN='redis://127.0.0.1:6379/0'
# 设置auth服 务
export GAME_CLIENT_AUTH='127.0.0.1:6160'
cd game
cinch run
Tip: 环境变量
前 缀可在 cmd/xxx/main.go中 修 改 ,参 见环境变量前 缀
auth
curl http://127.0.0.1:6060/idempotent
# 输出如下说明服 务通了 只 是 没 有 权限, 出 现其他 说明配置 有 误
# {"code":401, "reason":"UNAUTHORIZED", "message":"token is missing", "metadata":{}}
game
curl http://127.0.0.1:8080/hello/world
# 输出如下说明服 务通了 只 是 没 有 权限, 出 现其他 说明配置 有 误
# {"code":401, "reason":"UNAUTHORIZED", "message":"token is missing", "metadata":{}}
至 此,微 服 务已启动完 毕, auth以及game,接 下 来 可 以自定 义你的 game啦~