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

 有空 寫下怎么用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM