(Translated by https://www.hiragana.jp/)
GitHub - go-cinch/layout: Go Cinch Project Template
Skip to content

go-cinch/layout

 
 

Repository files navigation

Go Cinch Layout

Layout一套轻量级微服务项目模版.

Go version Kratos version MySQL version Go redis version Gorm version Wire version License

简介

起源きげん

你的单体ふく务架构是ぐういたいち些问题, 不能ふのう满足业务需求? 么微ふく务会このみてきかい决方あん.
Cinch一套轻量级微服务脚手架, もと于Kratos, 节省もと础服务搭けん时间, 快速かいそく投入とうにゅう业务开发.
わが参考さんこうりょうGoてき许多ほろふく务架构, 结合实际需求, さい终选择简洁的Kratosさく为基せき(B站架构), 从架构的设计おもえ以及だい码的书写格式かくしきわが非常ひじょうひきはい.

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 - くに际化支持しじ, 简单きり换多语言

とうぜん版本はんぽん Current version

使用しようcinch工具こうぐ快速かいそく创建Gameふく

go install github.com/go-cinch/cinch/cmd/cinch@latest

cinch new game

ざい线演しめせ

Vue3入口いりくち
React入口いりくち

项目结构

├── 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           // httpgrpc实例てき创建配置はいち
│   │   ├── 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
    
    
    # 简单启动いち个单つくえばんmysqlredis
    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

创建Gameふく

# 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啦~

ぶん

以下いか几个较为常用じょうよう, 当然とうぜん你也以按顺序查看Docs