前言

有位同学在群里说:“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的妙用,轻松应对微服务开发挑战!(三)的更多相关文章

  1. 微服务架构 技能图谱skill-map

    # 微服务架构 技能图谱 ## 理论基础### 概念#### 多微合适 - 非代码函数 - 非重写时间 - 适合团队最重要 - 独立业务属性 - 全功能团队 #### 进程隔离 - 服务运行在独立的进 ...

  2. Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashboar ...

  3. 2019年MTP管理技能提升培训笔记

    2019年MTP管理技能提升培训笔记 管理专题培训–MTP管理技能提升培训 高水准的问题分析解决 何为高水准 高 多层探寻,高度分析,即需要有深度 水 团队讨论,水平思考,即需要有广度 准 预防应变, ...

  4. Java技能提升之路

    James收集Java技能提升方面的资料,分为:基础篇.提高篇.高级篇… 给出“入口”,自我提升 1. Java工程师成神之路:http://www.hollischuang.com/archives ...

  5. Packt发布了2018年技能提升报告

    2018年技能提升报告Skill Up 2018 - Developer Skills Report | PACKT Bookshttps://www.packtpub.com/skill-up-20 ...

  6. 微服务效率工具 goctl 深度解析(上)

    前言 本文根据 安前松 的视频分享整理而来,视频回放地址如下: https://www.bilibili.com/video/BV1Hr4y1x7Ne goctl 的由来 1. goctl 的诞生 g ...

  7. 基于微服务的DevOps落地指南 交付效率提升40%

    基于微服务的DevOps落地指南 交付效率提升40% 2015-2016年,珍爱线下门店已新增覆盖城市9个,与此同时,CRM系统大小故障却发生了数十起... ... 珍爱网是以“网络征选+人工红娘”模 ...

  8. go微服务框架go-micro深度学习-目录

    go微服务框架go-micro深度学习(一) 整体架构介绍 go微服务框架go-micro深度学习(二) 入门例子 go微服务框架go-micro深度学习(三) Registry服务的注册和发现 go ...

  9. go微服务框架go-micro深度学习(四) rpc方法调用过程详解

    上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取server的地 ...

  10. go微服务框架go-micro深度学习 rpc方法调用过程详解

    摘要: 上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取serv ...

随机推荐

  1. KingbaseES V8R6运维案例之---MySQL和KingbaseES字符串排序规则对比

    案例说明: 相同数据排序后查询,在MySQL和KingbaseES下得到的排序顺序不一致,本案例从MySQL和KingbaseES的排序规则分析,两种数据库排序的异同点. 适用版本: Kingbase ...

  2. debootstrap 命令行安装 debian12(stable) btrfs文件系统 uefi引导 (像arch一样)

    1,制作debian12 live 启动盘 2.联网,可以手机usb共享,可以用wpasupplicant连wifi 3.修改镜像列表 sudo nano /etc/apt/source.list 修 ...

  3. MySQL命令创建只读权限用户

    查询用户 select user,authentication_string,host,Select_priv,Delete_priv from mysql.user; 创建用户 CREATE USE ...

  4. Unity 2022.3.20f1新功能,异步实例化预制体Object.InstantiateAsync

    今天查看Unity 2022.3.20f1更新日志,发现新增了个异步实例化的功能,这个功能解决了Unity历史上实例化预制体卡顿的痛点,简直不要太爽. 具体的API文档请点击跳转. 做了个简单的实例化 ...

  5. 深入理解HashMap和TreeMap的区别

    目录 简介 HashMap和TreeMap本质区别 排序区别 Null值的区别 性能区别 共同点 深入理解HashMap和TreeMap的区别 简介 HashMap和TreeMap是Map家族中非常常 ...

  6. OpenHarmony 3.1 Release版本关键特性解析——ArkUI框架又有哪些新增能力?

     ArkUI 是一套 UI 开发框架,它提供了开发者进行应用 UI 开发时所必须的能力.随着 OpenAtom OpenHarmony(以下简称"OpenHarmony") 3.1 ...

  7. ThinkPHP6.x 使用指南

    PHP 版本:PHP 8.1.0 框架版本:ThinkPHP 6 编辑工具:PHPStorm 2021.3.3 系统环境:Windows 10 0x01 概述 (1)简介 ThinkPHP 框架简称 ...

  8. python 代码编写环境及编辑器配置

    前言 关于python 环境编辑器的配置. 正文 第一步:python解释器,到网上下载安装下就行. 网址:https://www.python.org/downloads/windows/ 值得注意 ...

  9. ElasticSearch 7.7 + Kibana的部署

    ElasticSearch目前最新版是7.7.0,其中部署的细节和之前的6.x有很多的不同,所以这里单独拉出来写一下,希望对用7.x的童鞋有一些帮助,然后部署完ES后配套的kibana也是7.7.0, ...

  10. b站的视频进度条悬浮预览视频画面实现方式

    1.探究 在看b站视频,滑到进度条的时候突发奇想,想知道这个预览图是怎么做到的 打开控制台,发现每次移动鼠标悬浮位置的时候都会发出一条网络请求,并且该请求的size显示来源于内存,当时以为每次加载视频 ...