博客 / 詳情

返回

Go-Zero技能提升:深度探究goctl的妙用,輕鬆應對微服務開發挑戰!(三)

前言

有位同學在羣裏説:“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

  1. 編譯goctl-swagger插件

    GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/goctl-swagger@latest
  2. 配置環境
    將$GOPATH/bin中的goctl-swagger添加到環境變量

使用goctl-swagger生成swagger.json

goctl api plugin -plugin goctl-swagger="swagger -filename demo.json" -api demo.api -dir . 

生成如下文檔

  1. 導入ApiFox

  1. 導入demo.json

  1. 配置開發環境路由前綴

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語言或者微服務感興趣,歡迎關注我,也歡迎直接私信我。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.