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

 有空 写下怎么用
posted @ 2022-03-01 19:02  ifnk  阅读(1230)  评论(0编辑  收藏  举报