笔者当前版本: go version go1.18.1 darwin/arm64 goctl version 1.3.4 darwin/arm64
通过这4份脚手架,我们将一个完整的微服务通过数据库表,可以在5分钟创建出来所有基本可用的所有方法 在go-zero官方解释:分页属于客户的业务,所以在go-zero设计之初就没有考虑将分页的orm加入到系统中,后续会和大家分享go-zero使用分页的设计
一、升级goctl 降级goctl
goctl是go-zero微服务框架下的代码生成工具 使用 goctl 可显著提升开发效率,让开发人员将时间重点放在业务开发上 其功能有:
- api服务生成
- rpc服务生成
- model代码生成
- 模板管理
1、查看当前 goctl 版本号
版本号说明
- version:goctl 版本号
- os:当前操作系统名称
- arch: 当前系统架构名称
goctl -v
goctl version 1.3.4 darwin/arm64
2、通过查看帮助 升级goctl
goctl -h
升级 goctl
goctl upgrade
3、 降级 goctl 到指定的版本(如:v1.3.2)
go install github.com/zeromicro/go-zero/tools/goctl@v1.3.2
二、一键生成 protobuf
这里需要参考开软软件 sql2pb sql2pb - github :https://github.com/Mikaelemmmm/sql2pb
sql2pb -h
参数如下:
1、操作指令:
sql2pb -go_package ./pb -host 数据库链接地址 -package pb -password 数据库密码 -port 3306 -schema 数据库名 -service_name 生成的rpc名称(如:workorderrpc,这是在proto中service的命名) -user 账户 -table 表名(可以用逗号隔离,如:table1,table2) > ./workorderrpc.proto (生成的proto的文件名)
三、一键生成 model (orm脚手架)
摘自官方: goctl model 为go-zero下的工具模块中的组件之一,目前支持识别mysql ddl进行model层代码生成,通过命令行或者idea插件(即将支持)可以有选择地生成带redis cache或者不带redis cache的代码逻辑。
生成的目录结构
model
├── usermodel.go
├── usermodel_gen.go
└── vars.go
1、操作指令(通过datasource生成)
goctl model mysql datasource -url="账户:密码@tcp(数据库连接地址:3306)/数据库名" -table="表名" -dir=./internal/model --style=goZero
2、重要提示(数据库设计问题)
建议:我们在数据库设计时,将所有字段都设置为不能为空 为什么要这么设计呢?为了更好的和go-zero的orm框架融合 如上图所示 我们如果设计数据库的表字段不为空时,会生成 sql.NullInt64 类似这种的类型,这种类型会影响我们在rpc与api调用之间的便利性
四、一键生成 Rpc
1、操作指令
强调2点:
- –style=goZero :可以将我们生成的文件名驼峰
- sed -i:消除生成的文件中 json含有omitempty类型
goctl rpc protoc workorderrpc.proto(proto文件名) --go_out=. --go-grpc_out=. --zrpc_out=. --style=goZero
sed -i "" 's/,omitempty//g' pb/workorderrpc.pb.go
sed -i "" 's/,omitempty//g' pb/workorderrpc_grpc.pb.go
2、生成目录如下:
.
├── etc
│ └── greet.yaml
├── go.mod
├── go.sum
├── greet
│ ├── greet.go
│ ├── greet.pb.go
│ └── greet_grpc.pb.go
├── greet.go
├── greet.proto
└── internal
├── config
│ └── config.go
├── logic
│ └── pinglogic.go
├── server
│ └── greetserver.go
└── svc
└── servicecontext.go
五、一键生成 Api
1、操作指令
goctl api go -api workorderapi.api(api文件名) -dir . --style=goZero
六、问题处理
这里会持续更新,欢迎小伙伴来补充!!
1、undefined: grpc.WithBalancerName
问题:google.golang.org/grpc v1.46.0 版本过高 goctl跟不上 解决方式:降级为1.45.0及以下
2、protoc-gen-go: unable to determine Go import path for “x”
问题描述如下:
protoc-gen-go: unable to determine Go import path for "xxx.proto"
Please specify either:
? a "go_package" option in the .proto source file, or
? a "M" argument on the command line.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated
--go_out: protoc-gen-go: Plugin failed with status code 1.
报错截图如下: 问题:protobuf中缺少 option 参数 解决:需要在protobuf中加入 option的参数,尽量保持package与opention命名一致
|