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

本文主要是介绍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 linereturn &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 PostDemoHandlerpost /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 linereturn &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 linereturn &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的妙用,轻松应对微服务开发挑战!(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/967169

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

关于DNS域名解析服务

《关于DNS域名解析服务》:本文主要介绍关于DNS域名解析服务,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录DNS系统的作用及类型DNS使用的协议及端口号DNS系统的分布式数据结构DNS的分布式互联网解析库域名体系结构两种查询方式DNS服务器类型统计构建DNS域

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁