1.goctl基础

1.1 api

api: goctl api go -api *.api -dir ../ --style=goZero

doc: goctl api dpc --dir ./

1.2 rpc

goctl rpc protoc user.proto --go_out=../ --go-grpc_out=../ --zrpc_out=../ --style=goZero

sql2pb -go_package ./pb -host 192.168.72.128 -package pb -password root -port 3306 -schema douyin -service_name user -table user -user root > user.proto

1.3 protoc

protoc -I ./ --go_out=paths=source_relative:. --go-grpc_out=paths=source_relative:. userModel.proto

1.4 model

goctl model mysql datasource -url ="root:root:@tcp(192.168.72.128:3306)/douyin" -table = "follow" -dir="./" --style=goZero -c --home= ""

goctl model mysql ddl -src="./*.sql" -dir="" -c --style=goZero -c --home= ""

2. go-zero 实践

简易版抖音项目,YangZhang-dev/douyin: 基于go-zero的极简版抖音后端项目 (github.com)open in new window接口文档

大概有用户服务,视频服务,用户聊天,关注用户,点赞视频,评论视频

2.1 数据库

根据微服务架构来建好数据库。

建如下数据库:

  1. douyin_user
  2. douyin_video

2.2 生成model文件

首先在commom下创建三个全局的文件夹,一个用于httpresult,一个是全局的key,一个是存放错误码

douyin\deploy> goctl model mysql ddl -src="./sql/*.sql" -dir="../model" -c --style=goZero -c --home .\goctl\1.4.3\

goctl model mysql ddl -src="./sql/*.sql" -dir="../model" -c --style=goZero -c --home .\goctl\1.4.3\

运行 go mod tidy 下载依赖

2.3 目录结构

创建app目录

app下创建user和video

user下创建cmd和model

cmd下创建api和rpc

video同理

2.4 编写api文件

在api下创建desc文件夹,用于存放api文件

对于api中的实例信息,建立文件夹存放,在desc下建立user文件夹存放user实例

可以搭配validator进行参数校验

2.5 生成api代码

douyin\app\user\cmd\api\desc> goctl api go -api userApi.api -dir ../  --style=goZero --home ../../../../../deploy/goctl/1.4.3/

在etc/userApi.yaml中配置信息

Name: userApi
Host: 0.0.0.0
Port: 8888

Log:
  ServiceName: userApi
  Encoding: plain
  Level: info

2.6 编写proto文件

使用sql2pb工具生成pb文件

douyin\app\user\cmd\rpc\pb> sql2pb -go_package  ./pb -host 192.168.72.128 -package pb -password root -port 3306 -schema douyin_user -service_name user -table user -user root > userRpc.proto

根据自己的需求进行修改

2.7 生成rpc代码

douyin\app\user\cmd\rpc\pb> goctl rpc protoc videoRpc.proto --go_out=../ --go-grpc_out=../ --zrpc_out=../ --style=goZero --home ../../../../../deploy/goctl/1.4.3/

在etc/userRpc.yaml中配置信息

Name: userRpc
ListenOn: 0.0.0.0:8080
Mode: dev
Etcd:
  Hosts:
    - 127.0.0.1:2379
  Key: userRpc

Log:
  ServiceName: userRpc
  Encoding: plain
  Level: info

2.8 rpc配置数据库和缓存连接

在etc/userApi.yaml中配置信息

# DB,Cache
DB:
  DataSource: root:root@tcp(127.0.0.1:3306)/douyin_user?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai
Cache:
  - Host: 127.0.0.1:6379
    Pass:

在config/config.go配置

type Config struct {
zrpc.RpcServerConf
DB struct { // 数据库配置,除mysql外,可能还有mongo等其他数据库
DataSource string // mysql链接地址,满足 $user:$password@tcp($ip:$port)/$db?$queries 格式即可
}
Cache   cache.CacheConf // redis缓存
}

在svc/serviceContext.go中配置信息

type ServiceContext struct {
   Config    config.Config
   UserModel model.UserModel
}

func NewServiceContext(c config.Config) *ServiceContext {
   return &ServiceContext{
      Config:    c,
      UserModel: model.NewUserModel(sqlx.NewMysql(c.DB.DataSource), c.Cache),
   }
}

2.9 api配置连接rpc

在etc/user.yaml中配置信息

UserRpcConf:
  Etcd:
    Hosts:
      - 0.0.0.0:2379
    Key: userRpc

在internal/config中配置

type Config struct {
rest.RestConf
UserRpcConf zrpc.RpcClientConf
}

在svc/serviceContext.go中配置

type ServiceContext struct {
Config                config.Config
OptionalJWTMiddleware rest.Middleware
UserRpc               userrpc.UserRpc
}

func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config:                c,
OptionalJWTMiddleware: middleware.NewOptionalJWTMiddleware().Handle,
UserRpc:               userrpc.NewUserRpc(zrpc.MustNewClient(c.UserRpcConf)),
}
}
上次更新:
Contributors: YangZhang