go-zero
练习 demo;创建目录结构goctl api new greet
cd greet && go run main.go -f etc/config.yaml
.
├── api
│ └── upload.api
├── etc
│ └── config.yaml
├── main.go
├── go.mod
├── go.sum
└── internal
├── config
│ └── config.go
├── handler
│ ├── routes.go
│ └── uploadhandler.go
├── logic
│ └── uploadlogic.go
├── svc
│ └── servicecontext.go
│ └── model.go
└── types
└── types.go
- api目录:我们前面定义的API接口描述文件,无需多言
- etc目录:这个是用来放置yaml配置文件的
- main.go:main函数所在文件
- internal/config目录:服务的配置定义
- internal/handler目录:API文件里定义的路由对应的handler实现
- internal/logic目录:用来放每个路由对应的业务处理逻辑,之所以区分handler和logic是为了让业务处理部分尽可能减少依赖,把HTTP requests和逻辑处理代码隔离开,便于后续按需拆分成RPC service
- internal/svc目录:用来定义业务逻辑处理的依赖,我们可以在main里面创建依赖的资源,然后通过ServiceContext传递给handler和logic
- internal/types目录:定义了API的request、response的struct,根据api自动生成,不建议编辑
/etc/config.yaml
写入数据库链接、账号、密钥等参数main.go
将config.yaml格式 转换成 struct格式(internal/config/config.go)svc/servicecontext.go
中上下文 加载 数据库配置
/etc/config.yaml
写入数据库链接、账号、密钥等参数main.go
将config.yaml格式 转换成 struct格式(internal/config/config.go)svc/servicecontext.go
默认已经加载了config.go
的数据,所以可以读取jwt的数据
type CourseLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func (l *CourseLogic) GetCourseList(req *types.PageReq) (resp *types.Response, err error) {
println(l.svcCtx.Config.Auth.AccessSecret)
}
goctl model mysql datasource -url="account:password@tcp(rm-wz9445yi0pv0t68a2wo.mysql.rds.aliyuncs.com:3306)/evaluation" -table="course,course_snapshot,course_student" -dir="./"
- 因model文件在 internal/svc 下,进入到该目录执行命令
-table
参数表示生成指定的表-dir
参数表示在当前目录下 生成的model的目录结构
- 编写流程 handler -> logic-> types -> routes
- handler 写 控制器入口
- logic 写 业务逻辑入口
- types 写 业务层所需要的struct,比如 业务中间流程需要声明的结构
- routes 写 路由
- middleware目录添加 中间件文件
- 在路由文件新增middleware
server.AddRoutes(
rest.WithMiddlewares([]rest.Middleware{serverCtx.OperationRecord},
[]rest.Route{}...
)
servicecontext.go
文件添加中间件依赖