如圖 目前的流程是這樣的 ,每次 調用服務 的時候 先在數據庫查 ,然后 查出來 的是 自己定義的 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
有空 寫下怎么用