您现在的位置是:网站首页> 编程资料编程资料

基于go微服务效率工具goctl深度解析_Golang_

2023-05-26 410人已围观

简介 基于go微服务效率工具goctl深度解析_Golang_

前言

本文根据安前松的视频分享整理而来,视频回放地址如下:

www.bilibili.com/video/BV1Hr…

一、goctl 的由来

1. goctl 的诞生

goctl 的最早功能是为了解决 GRPC 内网调试问题,大约是在 2019 年,在我们的生产环境中,rpc 是内网隔离的,不可通过外网访问,为了快速去 mock 一些线上 RPC client 的请求,就简单的实现了第一版本的代码生成,主要目的是去访问 RPC Server 做一些调试。

2. 为什么需要 goctl?

  • 降低沟通成本

    沟通,是团队协作进行信息交换的一种形式,沟通的方式有很多种,会议沟通、文档沟通、聊天交流,相信不管是哪种方式,沟通都是团队中最难的一个环节,会议沟通需要占用大量时间,动则半小时起步,文档沟通同样,也会占据大量时间去构思和编写大篇幅的文档,最后可能还没表达出预期目标,线上聊天,需要双方都在线上才能进行信息交换,当然我们这里沟通交换的信息更多是指开发中的一些内容,如接口信息、部署信息等。

  • 降低团队耦合

    有了沟通,那么团队之间的协作的耦合是避免不了的,例如:在前后端开发中,最大的耦合是接口的耦合,前端完成了规定 UI 绘制后,需要等待后端的接口部署到对应环境才能实现功能的调试,在此期间,前端的团队资源就会大大浪费,由此还会导致项目的延期等问题。

  • 提高开发效率

    除了沟通成本和团队耦合以外,每个团队在进行项目开发时也有很多时间是在做重复的工作,例如:我们在开发一个新的功能时,需要去定义接口,编写接口文档,编码准备工作,业务开发,model 文件,编写 Dockerfile 文件,编写 k8s yaml 文件,在这些上面我们可以在每个环节上都有提升的空间,让用户将真正的时间集中在业务开发上。

  • 降低错误率

    在之前的开发实践中,经常会出现 grpc server 实现不完全的问题,grpc server 实现类经常会出现编译不过的情况;除此之外,数据库查询层代码开发,sql 语句的编写多参,少参,参数错位,在编译过程中很难发现,一般可能到 QA 环节才能发现,更甚者会导致线上问题。

3. 怎么理解开发规范?

开发规范,包括编码规范,工程规范,提交规范,代码审核规范,部署规范等等,团队内如果将开发规范统一起来,其收益可想而知,举个例子:假如你所在的公司没有统一开发规范,这时需要你去做一些跨部门协作或者支持,焕然一新的开发环境让你望而却步,还没开始就有了抵触的念头,这岂不是违背了支持的初衷。

4. 怎么理解工程效率?

工程效率,要理解工程效率,可以先看看『效率』的定义:

效率是指单位时间内完成的工作量

效率的目标是快,但快并不是效率,换句话说就是在单位时间内完成的高质量工作,这才是我们要追求的目标,那么工程效率就是为了『缩短从开发到线上的距离』

二 、goctl 的安装及功能介绍

1. 介绍

  • goctl 定义

    goctl 定义,准确说是定位吧,可以理解为一个代码生成脚手架,其核心思想是通过对 DSL 进行语法解析、语义分析到数据驱动实现完成代码生成功能,旨在帮助开发者从工程效率角度提高开发者的开发效率。

  • 解决的问题

    • 提高开发效率:goctl 的代码生成覆盖了Go、Java、Android、iOS、TS 等多门语言,通过 goctl 可以一键生成各端代码,让开发者将精力集中在业务开发上。
    • 降低沟通成本:使用 zero-api 替代 API 文档,各端以 zero-api 为中心生成各端代码,无需再通过会议、API 文档来进行接口信息传递。
    • 降低耦合度: 在之前的开发实践中,没有 goctl 之前,我们采用的是传统的 API 文档来作为接口信息传递的载体,然后通过会议来进行二次 review,我们都知道,前端开发工作中,除了 UI 的绘制外就是 UI 联调,如果比较积极的前端开发者,可能会自己利用一些脚手架或者自己 mock 一些数据去进行 UI 联调,反之,也有原地等待后端部署后再联调的 case,原因是自己写 mock 数据太耗时,也不想去动,如果前端的开发进度在后端之前,那么在后端部署到环境中这期间,前端只能安静的原地等待,这不仅是一种资源的浪费,也会造成项目进度的延期,有了 zero-api ,前端可以利用 goctl 去生成适量的 mock 数据来进行 UI联调。
  • 发展历史

goctl 发展历史可以大概的过一下,挑几个标志性的功能讲讲吧!

首先是 goctl rpc,goctl rpc 的第一版本就是 goctl 的雏形,主要是为了生成 client 代码对 rpc 做调试使用,具体就不展开了。goctl rpc 的发展经过了很多曲折,印象比较深刻的应该算 goctl rpc proto 向 goctl rpc protoc 的转变,这期间为了解决很多问题,才做了相应的变更,具体细节在分享 rpc 代码生成使用那块再详细分享,在这里面其实对我来说印象最深刻的一个功能算是 goctl model 了,其算是我开始维护 goctl 的一个入手点吧,也是我从业务开发实践中挖掘的解决方案吧,终究我还是比较 "懒",记得在当时开发一个业务模块,由于业务比较大,需要创建的数据表也很多,在没有 goctl 前都是自己去手动编码完成,这一块我记忆犹新,花了仅一天的时间来写 model 文件,因为我没有用 orm 的习惯,所以这块 sql 完全是裸 sql 语句,服务跑起来后才发现有很多 sql 传参上的错误,基本都是多参少参问题,除此之外,每次新增索引,或者字段变更,缓存的相关逻辑维护也让我十分头疼,于是结合当时的开发最佳实践,将其按照缓存与否把这块的工作交给了 goctl,第一版本 goctl model 生成主要是网页版本,后面陆续集成到 goctl 里了,这给我后续开发带来了很大的开发效率收益。

  • 展望未来

    goctl 集成了比较多的功能,其基本是以代码生成为主,开发规范为辅,goctl 是围绕 zero-api 为中心做代码生成的,因此在将来,zero-api 的建设会成为我们的重心:

    • ast 的改造:替换原有比较重的 antlr4,可以解决很多人安装 goctl 时 内存不够,系统架构不支持的各种问题,这
    • goctl mock 的支持,最大限度解耦各端依赖耦合

2. 安装

Goctl 安装有两种方式,分别是 go get 或者 go install,其次是 docker。

go get/install

# Go 1.16 之前版本 $ GO111MODULE=on GOPROXY=https://goproxy.cn/,direct go get -u github.com/zeromicro/go-zero/tools/goctl@latest # Go 1.16 及以后版本 $ GOPROXY=https://goproxy.cn/,direct go install github.com/zeromicro/go-zero/tools/goctl@latest # macOS $ brew install goctl # 验证 $ goctl --version goctl version 1.3.5 darwin/amd64 # 查看 goctl $ cd $GOPATH/bin && ls | grep "goctl" 

如果执行 goctl --version 提示 command not found: goctl 的错误,请先排查 $GOBIN 是否在环境变量下。

docker

# 1. pull $ docker pull kevinwan/goctl .... # 2. ls $ docker image ls | grep "goctl" kevinwan/goctl latest 7fd46843de3d 5 weeks ago 383MB # 3. run $ docker run -it kevinwan/goctl /bin/sh 

3. 功能介绍

我们接下来看看功能介绍,通过指令 goctl --help 可以列出我们当前已经支持的功能,可能大家在看文档时也没有专心下来对这块指令做研究,只是用到一些高频指令,今天既然是 goctl 的专题分享,我们就花点时间来一起过过,带着大家从 0 到 1 熟悉 goctl。

$ goctl --help A cli tool to generate api, zrpc, model code Usage: goctl [command] Available Commands: api Generate api related files bug Report a bug completion Generate the autocompletion script for the specified shell docker Generate Dockerfile env Check or edit goctl environment help Help about any command kube Generate kubernetes files migrate Migrate from tal-tech to zeromicro model Generate model code quickstart quickly start a project rpc Generate rpc code template Template operation upgrade Upgrade goctl to latest version Flags: -h, --help help for goctl -v, --version version for goctl Use "goctl [command] --help" for more information about a command. 

goctl 的功能比较丰富,所以难免指令参数比较多,大家在使用时除了看文档外,也善用 --help 这个flag,因为他会告诉你每个指令或者子指令的用法,需要什么参数,参数类型是字符串还是布尔,是必填还是可选,切不可自己猜测他应该用什么 flag,虽然 goctl 是我自己主要维护,其实很多时候,有些指令比较文档,没有太多 feature 去更新,我也记不住,我也是通过 --help 去查看功能介绍的

goctl completion

查看 goctl 版本

$ goctl --version goctl version 1.3.5 darwin/amd64 

1.3.5

本节内容仅适合 goctl 版本在 1.3.5及之前的的自动补全设置参考,1.3.5版本及之前仅支持类 Unix 操作系统,不支持 Windows 的自动补全,1.3.5 之后的请跳过此节内容

  • 执行 goctl completion -h 查看使用说明
$ goctl completion --help NAME: goctl completion - generation completion script, it only works for unix-like OS USAGE: goctl completion [command options] [arguments...] OPTIONS: --name value, -n value the filename of auto complete script, default is [goctl_autocomplete] 

根据帮助说明得知,goctl completion 支持通过 --name 传递一个参数生成自动补全脚本文件名,但该参数为非必填,默认不填时为goctl_autocomplete 文件,其位于 $GOCTLHOME 目录下。

  • 执行 goctl completion 来生成自动补全脚本
$ goctl completion generation auto completion success! executes the following script to setting shell: echo PROG=goctl source /Users/keson/.goctl/.auto_complete/zsh/goctl_autocomplete >> ~/.zshrc && source ~/.zshrc # 或者 echo PROG=goctl source /Users/keson/.goctl/.auto_complete/bash/goctl_autocomplete >> ~/.bashrc && source ~/.bashrc 
  • 查看当前 shell
$ echo $SHELL /bin/zsh 
  • 选择对应 shell 的脚本执行,我这里为 zsh,所以执行指令如下
$ echo PROG=goctl source /Users/keson/.goctl/.auto_complete/zsh/goctl_autocomplete >> ~/.zshrc && source ~/.zshrc 
  • 重启终端验证结果
# 键入 goctl 后按下 tab 键查看自动补全提示 $ goctl # tab api -- generate api related files bug -- report a bug completion -- generation completion script, it only works for unix-like OS docker -- generate Dockerfile env -- check or edit goctl environment help h -- Shows a list of commands or help for one command kube -- generate kubernetes files migrate -- migrate from tal-tech to zeromicro model -- generate model code rpc -- generate rpc code template -- template operation upgrade -- upgra
                
                

-六神源码网