Go-Zero技能提升:深度探究goctl的妙用,轻松应对微服务开发挑战!(三)

go,zero,goctl · 浏览次数 : 7

小编点评

**使用Goctl工具快速搭建api服务、rpc服务和model代码的生成** 本文将深入探讨 Go-Zero 的 goctl 工具,带你从 0 到 1 轻松使用该工具生成代码、文档、部署 k8s yaml、dockerfile 等。 **goctl 是什么?** goctl 是 Go-Zero 内置的脚手架,可以一键生成代码、文档、部署 k8s yaml、dockerfile 等。 **使用 goctl 生成代码的步骤:** 1. 创建一个代码生成目录。 2. 在代码生成目录中运行以下命令: ```bash goctl [指令选项] [代码生成文件] ``` **常用指令:** * `goctl api new`: 用于快速生成 Go HTTP 服务。 * `goctl model mysql datasource -url="root:PXDN93VRKUm8TeE7@tcp(127.0.0.1:33069)/lottery"`: 用于生成 MySQL 数据表代码。 **示例:** ```bash # 创建代码生成目录 mkdir -p goctl-demo # 生成 API 服务代码 goctl api go -api demo.api -dir . -style gozero # 生成模型代码 goctl model mysql datasource -url="root:PXDN93VRKUm8TeE7@tcp(127.0.0.1:33069)/lottery"` -table="lottery" -dir="./genModel" -cache=true --style=goZero # 生成 swagger 文档 goctl swagger -plugin goctl-swagger=\"swagger -filename demo.json\" -api demo.api -dir . ``` **生成代码的步骤:** 1. 创建代码生成目录。 2. 在代码生成目录中运行以下命令: ```bash goctl [指令选项] [代码生成文件] ``` **生成模型代码的步骤:** 1. 创建 `genModel` 文件夹。 2. 在 `genModel` 文件夹中运行以下命令: ```bash goctl model [指令选项] [代码生成文件] ``` **注意:** * 需要安装 Go 等工具。 * 代码生成过程可能需要一些时间。 * 可以使用 `-help` 参数来查看可用指令和选项。

正文

前言

有位同学在群里说:“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
  1. 配置环境
    将$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语言或者微服务感兴趣,欢迎关注我,也欢迎直接私信我。

微信:wangzhongyang1993

与Go-Zero技能提升:深度探究goctl的妙用,轻松应对微服务开发挑战!(三)相似的内容:

Go-Zero技能提升:深度探究goctl的妙用,轻松应对微服务开发挑战!(三)

前言 有位同学在群里说:“Go-Zero官方文档太简洁了,对小白有点不友好。好奇你们是怎么学习的?项目是怎么封装的?有什么提高开发效率的技巧吗?”。 来来来,这期内容给你安排上,先教你goctl的妙用! 前两篇文章分享了 Go-Zero微服务快速入门和最佳实践(一) 和 Go-Zero从0到1实现微

Go-Zero从0到1实现微服务项目开发(二)

继续更新GoZero微服务实战系列文章:上一篇被GoZero作者万总点赞了,本文将继续使用 Go-zero 提供的工具和组件,从零开始逐步构建一个基本的微服务项目。手把手带你完成:项目初始化+需求分析+表结构设计+api+rpc+goctl+apifox调试+细节处理。带你实现一个完整微服务的开发。

Go-Zero微服务快速入门和最佳实践(一)

前言 并发编程和分布式微服务是我们Gopher升职加薪的关键。 毕竟Go基础很容易搞定,不管你是否有编程经验,都可以比较快速的入门Go语言进行简单项目的开发。 虽说好上手,但是想和别人拉开差距,提高自己的竞争力,搞懂分布式微服务和并发编程还是灰常重要的,这也是我今年更新文章的重点。 更文计划 我会更

Go-Zero定义API实战:探索API语法规范与最佳实践(五)

前言 上一篇文章带你实现了Go-Zero模板定制化,本文将继续分享如何使用GO-ZERO进行业务开发。 通过编写API层,我们能够对外进行接口的暴露,因此学习规范的API层编写姿势是很重要的。 通过本文的分享,你将能够学习到Go-Zero的API语法规范,以及学会实际上手使用。 概述 下文所说的是

Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率(四)

gozero如何自定义goctl?本文详解和实战,通过本文你将了解goctl的妙用,提高你的开发效率。介绍如何使用goctl工具实现模板定制化,并根据实际项目业务需求进行模板定制化实现。

Go微服务开发指南

在这篇深入探讨Go语言在微服务架构中的应用的文章中,我们介绍了选择Go构建微服务的优势、详细分析了主要的Go微服务框架,并探讨了服务发现与注册和API网关的实现及应用。 关注TechLead,复旦博士,分享云服务领域全维度开发技术。拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,复旦机器

Go 使用原始套接字捕获网卡流量

Go 使用原始套接字捕获网卡流量 Go 捕获网卡流量使用最多的库为 github.com/google/gopacket,需要依赖 libpcap 导致必须开启 CGO 才能够进行编译。 为了减少对环境的依赖可以使用原始套接字捕获网卡流量,然后使用 gopacket 的协议解析功能,这样就省去了解析

Go 如何对多个网络命令空间中的端口进行监听

Go 如何对多个网络命令空间中的端口进行监听 需求为 对多个命名空间内的端口进行监听和代理。 刚开始对 netns 的理解不够深刻,以为必须存在一个新的线程然后调用 setns(2) 切换过去,如果有新的 netns 那么需要再新建一个线程切换过去使用,这样带来的问题就是线程数量和 netns 的数

【建议收藏】Go语言关键知识点总结

容器 数组和切片 在Go语言中,数组和切片是两个基本的数据结构,用于存储和操作一组元素。它们有一些相似之处,但也有许多不同之处。下面我们详细介绍数组和切片的特点、用法以及它们之间的区别。 数组 数组是固定长度的序列,存储相同类型的元素。数组的长度在定义时就固定下来,不能改变。 package mai

如何基于R包做GO分析?实现秒出图

GO分析 基因本体论(Gene Ontology, GO)是一个用于描述基因和基因产品属性的标准术语体系。它提供了一个有组织的方式来表示基因在生物体内的各种角色。基因本体论通常从三个层面对基因进行描述:细胞成分(Cellular Component,CC)、生物学过程(Biological Proc