grpc 安装 插件 (protoc-gen-gorm)
如图 目前的流程是这样的 ,每次 调用服务 的时候 先在数据库查 ,然后 查出来 的是 自己定义的 entity ,转换成 grpc 格式 在 返回 给调用 者
需要自己 多 定义 一遍实体 ,想偷懒 不 定义 这个实体了 ,但是 用的是 gorm ,不定义实体的话 这些 go 必须要 这些特性 就很麻烦
然后 在 github上面找到 一个库 protoc-gen-gorm ,你定义 了 proto 文件 他就会自动 给你 加上 gorm 的那些特性 ,这样 我就 不用 自己 额外 定义 entity 了 ,也不用手动转换 ,直接 拿 grpc 生成 的 实体 传给别的微服务
安装 protoc-gen-gorm
go get -u github.com/golang/protobuf/protoc-gen-go
然后在项目根目录下创建个 文件夹 third-party
,用来放 grpc 的 插件
新建个 proto 文件夹, 把 proto文件 拷进去
修改下 protoc 命令
修改 你 要定义 的 proto 文件 里面的实体 我这里是 user.proto
文件
然后 执行 make protoc
然后 就会发现 产物 多了 一个
可以看到 给你标了 gorm 的 特性了!
自动生成 service
看了 github的 文档 发现他还有 自动创建 service 的功能 这个很方便啊 果断用上
定义 service 的时候 加上 option (gorm.server).autogen = true;
这行话 ,然后 rpc 的名字得 是 符合 Create|Read|Update|Delete开头 才行(文档有写)
然后 make protoc 生成 下 ,发现 代码 已经给你生成好了
注意,他这里的 gorm 是 老版本 的 gorm v1版本jinzhu gorm ,但是我们项目用的是 新版本的gorm 新版本gorm
我把项目换成 jinzhu 老版本 gorm 的话 ,pg 迁移 数据表的时候 会报错 ,所以 我取巧了下,创建了两个 gorm ,新版本 的用来迁移 ,老版本 的用来 应付 自动生成 的grpc 代码
然后 这个生成了 以后 我们直接 连 server 都不用写了 直接在 v1.RegisterUserServiceServer
注册 server 的时候 把 生成 的 UserServiceDefaultServer 往里面 写就好了
会发现 ide 给报红了,因为没有实现 这个 mustEmbedUnimplementedUserServiceServer
方法
查看 原本 的 UserServiceServer
接口 发现他里面 就 有 mustEmbedUnimplementedUserServiceServer
方法, 而我们的 UserServiceDefaultServer
只实现了 CreateUser
方法
所以我们给他加上 mustEmbedUnimplementedUserServiceServer
就好啦
然后 因为默认生成的 crud 方法 都是写死的, 我们想要自定义的话 ,就可以 利用 他的 钩子函数 ,比如我想在创建 user 之前 把 uuid 赋值
查看 create 生成的代码 发现了这个钩子
所以我只要对 SysUserORM
添加 对应的 BeforeCreate_
方法就行了
拓展
同理 如果 你想 给 实体 加上 json 的 tag 标记 ,下面 有个 库 可以 参考着用
https://github.com/favadi/protoc-go-inject-tag
https://github.com/srikrsna/protoc-gen-gotag
有空 写下怎么用