前言
有位同學在羣裏説:“Go-Zero官方文檔太簡潔了,對小白有點不友好。好奇你們是怎麼學習的?項目是怎麼封裝的?有什麼提高開發效率的技巧嗎?”。
來來來,這期內容給你安排上,先教你goctl的妙用!
前兩篇文章分享了 Go-Zero微服務快速入門和最佳實踐(一) 和 Go-Zero從0到1實現微服務項目開發(二)。
本文將繼續深入探討Go-Zero的強大,並帶你從0到1學會使用goctl。
通過本文的教程,你將能夠親自實踐並完成goctl生成模板代碼,進一步提升你的開發效率。
概述
goctl 是 go-zero 的內置腳手架,是提升開發效率的一大利器,可以一鍵生成代碼、文檔、部署 k8s yaml、dockerfile 等。
官方文檔:goctl 安裝 | go-zero Documentation
goctl安裝
go install github.com/zeromicro/go-zero/tools/goctl@latest
驗證
goctl --version
goctl使用實戰
接下來和我使用goctl實現快速搭建api服務、rpc服務腳手架以及model代碼的生成:
goctl api
goctl api是goctl中的核心模塊之一,通過該命令可以快速生成一個api演示項目。
我們可以通過goctl api --help查看goctl api的所有指令。
goctl api --help
goctl api new
用於快速生成 Go HTTP 服務,需要指定服務名稱,輸出目錄為當前工作目錄。
-
創建demo服務
goctl api new demo這樣在當前目錄下就能夠生成demo的api服務了。
下圖為生成的項目目錄結構:
-
在logic下面的demologic.go編寫邏輯
func (l *DemoLogic) Demo(req *types.Request) (resp *types.Response, err error) { // todo: add your logic here and delete this line return &types.Response{ Message: "hello world", }, nil } -
啓動服務
# 跳到demo服務根目錄 cd demo # 啓動服務(默認8888端口,可在etc/demo-api.yaml配置) go run demo.go -f etc/demo-api.yaml -
訪問服務
http://localhost:8888/from/you
至此一個Go-Zero的單體服務就完成啦。
goctl api doc
- 根據 api 文件生成 markdown 文檔。
-
-dir表示文檔輸出目錄
goctl api doc -dir ./
goctl api go
根據api文件生成Go HTTP代碼。-api表示api文件路徑,-dir表示代碼輸出目錄,--style表示輸出文件和目錄的命名風格格式化符號。
詳情見 文件風格
--home表示自定義模板文件目錄(自定義模板我們會在後續進行講解,別忘了關注我)
-
修改demo.api文件內容,增加一個post接口
type PostDemoReq { Message string `json:"message"` } type PostDemoResp { Message string `json:"message"` } service demo-api { @handler PostDemoHandler post /postDemo(PostDemoReq) returns (PostDemoResp) } -
重新生成代碼
cd demo goctl api go -api demo.api -dir . -style gozero會生成這兩個文件
-
修改logic邏輯
func (l *PostDemoLogic) PostDemo(req *types.PostDemoReq) (resp *types.PostDemoResp, err error) { // todo: add your logic here and delete this line return &types.PostDemoResp{ Message: req.Message, }, nil } -
重新啓動服務
go run demo.go -f etc/demo-api.yaml - 使用ApiFox發起請求
至此我們已經學會怎麼創建單體服務,並創建get和post接口啦,已經能應對大多數單體項目的開發需求。
當然我們做接口測試的時候一個個手動輸入到ApiFox十分麻煩,這時候我們可以藉助goctl api的插件生成swagger導入到ApiFox當中。
生成swagger文檔
goctl-swagger 用於一鍵生成 api 的 swagger 文檔
安裝goctl-swagger
-
編譯goctl-swagger插件
GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/goctl-swagger@latest - 配置環境
將$GOPATH/bin中的goctl-swagger添加到環境變量
使用goctl-swagger生成swagger.json
goctl api plugin -plugin goctl-swagger="swagger -filename demo.json" -api demo.api -dir .
生成如下文檔
- 導入ApiFox
- 導入demo.json
- 配置開發環境路由前綴
6.進行接口測試
goctl rpc
goctl rpc 是 goctl 中的核心模塊之一,其可以通過 .proto 文件一鍵快速生成一個 rpc 服務,如果僅僅是啓動一個 go-zero 的 rpc 演示項目, 你甚至都不用編碼,就可以完成一個 rpc 服務開發及正常運行。
goctl rpc new
-
快速生成一個 rpc 服務,其接收一個終端參數來指定服務名稱。
goctl rpc new RPCDemo - 生成項目目錄結構如下圖所示
goctl rpc -o
用於快速生成一個 proto 模板文件,其接收一個 proto 文件名稱參數。
goctl rpc -o demoProto.proto
- 會在相同目錄下生成proto模板文件
goctl rpc protoc
-
根據 protobufer 文件生成 rpc 服務。
cd .\RPCDemo goctl rpc protoc RPCDemo.proto --go_out=./ --go-grpc_out=./ --zrpc_out=./ --style=goZero
- 由於沒安裝Etcd,因此我們把etc/rpcdemo.yaml的Etcd相關配置註釋掉
-
在logic/pingLogic.go修改為如下邏輯
func (l *PingLogic) Ping(in *rPCDemo.Request) (*rPCDemo.Response, error) { // todo: add your logic here and delete this line return &rPCDemo.Response{ Pong: in.Ping, }, nil } -
運行服務
cd .\RPCDemo go run . - 項目默認跑在8080端口,可根據需求修改
將proto導入ApiFox進行測試
- 新建項目
- 新建gRPC項目
- 添加項目中的RPCDemo.proto
- 右上角選擇環境
- 測試接口
-
至此,我們已經能夠根據proto文件生成gRPC接口並進行測試啦。
goctl model
goctl model 為 goctl 提供的數據庫模型代碼生成指令,目前支持 MySQL、PostgreSQL、Mongo 的代碼生成,MySQL 支持從 sql 文件和數據庫連接兩種方式生成,PostgreSQL 僅支持從數據庫連接生成。
本文主要以MySQL為數據表來源生成代碼,其他數據庫類似。
- 創建genModel文件夾
-
生成代碼。對應位置的MySQL連接參數改為你的即可。-table表示你的表名,-dir表示生成代碼的輸出目錄 -cache表示是否生成帶緩存的代碼
goctl model mysql datasource -url="root:PXDN93VRKUm8TeE7@tcp(127.0.0.1:33069)/lottery" -table="lottery" -dir="./genModel" -cache=true --style=goZero - 顯示Done.説明成功。
至此我們成功使用goctl model根據數據庫中的數據表生成了model 代碼。
後續通過修改模板代碼我們可以實現生成代碼的定製化需求,記得關注我!
總結
這篇文章相比官方文檔,詳細介紹瞭如何使用Go-Zero的goctl工具進行api服務、rpc服務和model層代碼的生成,以及生成swagger文件,並提供了Demo進行實際操作。
我將繼續更新Go-Zero系列文章,如果你對Go語言或者微服務感興趣,歡迎關注我,也歡迎直接私信我。