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
- 编译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语言或者微服务感兴趣,欢迎关注我,也欢迎直接私信我。
微信:wangzhongyang1993
Go-Zero技能提升:深度探究goctl的妙用,轻松应对微服务开发挑战!(三)的更多相关文章
- 微服务架构 技能图谱skill-map
# 微服务架构 技能图谱 ## 理论基础### 概念#### 多微合适 - 非代码函数 - 非重写时间 - 适合团队最重要 - 独立业务属性 - 全功能团队 #### 进程隔离 - 服务运行在独立的进 ...
- Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)
目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashboar ...
- 2019年MTP管理技能提升培训笔记
2019年MTP管理技能提升培训笔记 管理专题培训–MTP管理技能提升培训 高水准的问题分析解决 何为高水准 高 多层探寻,高度分析,即需要有深度 水 团队讨论,水平思考,即需要有广度 准 预防应变, ...
- Java技能提升之路
James收集Java技能提升方面的资料,分为:基础篇.提高篇.高级篇… 给出“入口”,自我提升 1. Java工程师成神之路:http://www.hollischuang.com/archives ...
- Packt发布了2018年技能提升报告
2018年技能提升报告Skill Up 2018 - Developer Skills Report | PACKT Bookshttps://www.packtpub.com/skill-up-20 ...
- 微服务效率工具 goctl 深度解析(上)
前言 本文根据 安前松 的视频分享整理而来,视频回放地址如下: https://www.bilibili.com/video/BV1Hr4y1x7Ne goctl 的由来 1. goctl 的诞生 g ...
- 基于微服务的DevOps落地指南 交付效率提升40%
基于微服务的DevOps落地指南 交付效率提升40% 2015-2016年,珍爱线下门店已新增覆盖城市9个,与此同时,CRM系统大小故障却发生了数十起... ... 珍爱网是以“网络征选+人工红娘”模 ...
- go微服务框架go-micro深度学习-目录
go微服务框架go-micro深度学习(一) 整体架构介绍 go微服务框架go-micro深度学习(二) 入门例子 go微服务框架go-micro深度学习(三) Registry服务的注册和发现 go ...
- go微服务框架go-micro深度学习(四) rpc方法调用过程详解
上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取server的地 ...
- go微服务框架go-micro深度学习 rpc方法调用过程详解
摘要: 上一篇帖子go微服务框架go-micro深度学习(三) Registry服务的注册和发现详细解释了go-micro是如何做服务注册和发现在,服务端注册server信息,client获取serv ...
随机推荐
- Oracle 触发器迁移至KingbaseES常见的问题
oracle数据库的触发器迁移到KingbaseES的时候经常会出现一下两类错误: 1.SQL 错误 [42809]: 错误: "xxxxxxxx" 是一个视图.Detail: 视 ...
- 修改debian apt搜索的软件包颜色(原本是绿色)
sudo nano /etc/apt/apt.conf 加入以下内容 apt::color::highlight "#"; 再搜索软件包会变成白色 不足之处是包的前面会加上#号
- BIO ,NIO ,AIO
一.同步阻塞I/O(BIO): 服务器实现模式: 一个连接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理 弊端:如果这个连接不做任何事情会造成不必要的线程开销 解决措施:可以通过线程池 ...
- #轮廓线dp#HDU 1400 Mondriaan's Dream
题目传送门 分析 状压dp会TLE,考虑用轮廓线dp, 设 \(dp[i][j][S]\) 表示现在处理到 \((i,j)\) 这个位置轮廓线上状态为 \(S\) 的情况 二进制位为1表示左边或者上方 ...
- 成长计划校园极客秀 | 玩转OpenHarmony开发智能煤气检测系统
成果展示 1.整体展示 2.碰一碰无感配网 3.报警 简介 目前,煤气泄漏给居民生活带来伤害的事情仍时有发生,但我相信万物互联能够有效避免这种伤害,于是我基于OpenHarmony设计了一款煤气检测装 ...
- Java实现打包压缩文件或文件夹生成zip以实现多文件批量下载
有时候在系统中需要一次性下载多个文件,但逐个下载文件比较麻烦.这时候,最好的解决办法是将所有文件打包成一个压缩文件,然后下载这个压缩文件,这样就可以一次性获取所有所需的文件了. 下面是一个名为Comp ...
- HarmonyOS实现几种常见图片点击效果
一. 样例介绍 HarmonyOS提供了常用的图片.图片帧动画播放器组件,开发者可以根据实际场景和开发需求,实现不同的界面交互效果,包括:点击阴影效果.点击切换状态.点击动画效果.点击切换动效. 相关 ...
- Next.js 实战
0x1 CSR,SSR,SSG CSR 客户端渲染(Client-Side Rendering).常见 B 端 Web 应用开发模式,前后端分离,服务器压力相对更轻,渲染工作在客户端进行,服务器直接返 ...
- jenkins 持续集成和交付 —— 触发器(六)
前言 什么是触发器呢?当某种条件达到的时候将会触发某个机关. 正文 jenkins 内置4种触发器: 1.触发远程构建 2.其他工程构建后触发 3.定时触发 4.轮询SCM 那么就来介绍一下这几种吧. ...
- Sparse稀疏检索介绍与实践
Sparse稀疏检索介绍 在处理大规模文本数据时,我们经常会遇到一些挑战,比如如何有效地表示和检索文档,当前主要有两个主要方法,传统的文本BM25检索,以及将文档映射到向量空间的向量检索. BM25效 ...