关于go:微服务效率工具-goctl-深度解析上

50次阅读

共计 16773 个字符,预计需要花费 42 分钟才能阅读完成。

前言

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

https://www.bilibili.com/video/BV1Hr4y1x7Ne

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 之后的请跳过此节内容

  1. 执行 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 目录下。

  1. 执行 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
  1. 查看以后 shell
$ echo $SHELL                                                  
/bin/zsh
  1. 抉择对应 shell 的脚本执行,我这里为 zsh,所以执行指令如下
$ echo PROG=goctl source /Users/keson/.goctl/.auto_complete/zsh/goctl_autocomplete >> ~/.zshrc && source ~/.zshrc
  1. 重启终端验证后果
# 键入 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        -- upgrade goctl to latest version
1.3.6

本节内容仅适宜 goctl 版本在 1.3.6 及之后的的主动补全设置参考,1.3.6 之前的请跳过此节内容

  1. 如果你是从 1.3.5 降级到 1.3.6 及当前,则须要执行如下指令来革除旧版本主动补全配置,这里以 zsh 为例子,否则请跳过这一步
# 编辑 ~/.zshrc
$ vim ~/.zshrc
# 找到 PROG=goctl 所在行并删除
# source
$ source ~/.zshrc && rm .zcompdump*
# 重启终端
  1. 执行 goctl completion -h 查看应用阐明,从应用帮忙中能够查看到目前反对 bash、fish、powershell、zsh 4 种 shell 的主动补全。
$ goctl completion --help
Generate the autocompletion script for goctl for the specified shell.
See each sub-command's help for details on how to use the generated script.

Usage:
goctl completion [command]

Available Commands:
bash        Generate the autocompletion script for bash
fish        Generate the autocompletion script for fish
powershell  Generate the autocompletion script for powershell
zsh         Generate the autocompletion script for zsh

Flags:
-h, --help   help for completion

Use "goctl completion [command] --help" for more information about a command.
  1. 查看以后应用的 shell
$ echo $SHELL                                                  
/bin/zsh
  1. 因为以后应用的 zsh,所以咱们来看一下 zsh 的主动补全设置帮忙
$ goctl completion zsh --help
Generate the autocompletion script for the zsh shell.

If shell completion is not already enabled in your environment you will need
to enable it.  You can execute the following once:

        echo "autoload -U compinit; compinit" >> ~/.zshrc

To load completions for every new session, execute once:

#### Linux:

        goctl completion zsh > "${fpath[1]}/_goctl"

#### macOS:

        goctl completion zsh > /usr/local/share/zsh/site-functions/_goctl

You will need to start a new shell for this setup to take effect.

Usage:
goctl completion zsh [flags]

Flags:
-h, --help              help for zsh
--no-descriptions   disable completion descriptions

从上文能够看出,依据操作系统的不同,主动补全的设置形式也不一样,我这里是 macOS,咱们执行一下对应的指令:

$ goctl completion zsh > /usr/local/share/zsh/site-functions/_goctl

咱们先重开一个终端来试一下:

# 键入 goctl 后按下 tab 键查看主动补全提醒
$ goctl # tab
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

常见谬误

  1. goctl Error: unknown flag: –generate-goctl-completion
  2. (eval):1: command not found: _goctl
    依照 1.3.6 主动补全配置从新进行配置

goctl migrate

帮忙开发者从 1.3.0 之前版本无缝迁徙到 1.3.0 及后的任意版本, 如果应用的 go-zero 版本自身就是 1.3.0 及之后的,则无需做此操作。

为什么须要迁徙?

go-zero 在 1.3.0 版本做了组织变更,即用 zeromicro 替换原来的 tal-tech 组织名称。

我当初有一个演示我的项目 awesomemigrate 是用旧版本 goctl 生成的,该项目标 go-zero 的 module 为

module awesomemigrate

go 1.18

require github.com/tal-tech/go-zero v1.2.5

...

假如咱们须要将该项目标 go-zero 降级至截止目前最新版本 1.3.3,要实现我的项目从 tal-tech 到 zeromicro 的降级 前须要确保 goctl 版本大于 v1.3.2,而后在执行 goctl 迁徙指令执行,如果 goctl 版本小于 v1.3.2,则须要降级。

# 1. 查看以后 goctl 版本
$ goctl --version
goctl version 1.2.5 darwin/amd64

# 2. 因为 goctl 版本小于 v1.3.2,则须要降级至最新,如果 goctl 版本曾经是 1.3.2 及之后了,则能够不必降级
$ go install github.com/zeromicro/go-zero/tools/goctl@latest

# 3. 查看一下迁徙指令应用帮忙
$ goctl migrate --help                                  
NAME:
goctl migrate - migrate from tal-tech to zeromicro

USAGE:
goctl migrate [command options] [arguments...]

DESCRIPTION:
migrate is a transition command to help users migrate their projects from tal-tech to zeromicro version

OPTIONS:
--verbose, -v    verbose enables extra logging
--version value  the target release version of github.com/zeromicro/go-zero to migrate

# 4. 进入待迁徙的我的项目下,执行迁徙指令
$ goctl migrate --version 1.3.3

# 5. 验证依赖是否存在问题
$ go test .
?       awesomemigrate  [no test files]

迁徙实现后,咱们再来看看 module 文件

module awesomemigrate

go 1.18

require github.com/zeromicro/go-zero v1.3.3
...

在 project 搜寻一下 tal-tech 的匹配后果会发现为 0:

goctl env

goctl env 次要是用于环境检测、装置、环境参数管制等性能,除此之外还能够查看以后 goctl 的一些环境信息,以至于用户在遇到 bug 时能够依据此环境上报以后 goctl 处于的环境。

首先咱们看看其应用阐明

$ goctl env --help                                    
NAME:
goctl env - check or edit goctl environment

USAGE:
goctl env command [command options] [arguments...]

COMMANDS:
install  goctl env installation
check    detect goctl env and dependency tools

OPTIONS:
--write value, -w value  edit goctl environment
--help, -h               show help

goctl env 反对环境查看、参数批改、依赖检测装置几个性能,咱们顺次来看一下

1. 环境查看

在不输出任何 flag 的状况下,则是查看以后 goctl 环境。

$ goctl env                                             
GOCTL_OS=darwin                        
GOCTL_ARCH=amd64
GOCTL_HOME=/Users/keson/.goctl
GOCTL_DEBUG=false
GOCTL_CACHE=/Users/keson/.goctl/cache
GOCTL_VERSION=1.3.5
PROTOC_VERSION=3.19.4
PROTOC_GEN_GO_VERSION=v1.27.1
PROTO_GEN_GO_GRPC_VERSION=1.2.0

以上参数的大略阐明为

参数名称 参数类型 参数阐明
GOCTL_OS STRING 以后操作系统,常见值有 darwin、windows、linux 等
GOCTL_ARCH STRING 以后零碎架构,常见值有 amd64, 386 等
GOCTL_HOME STRING 默认为 ~/.goctl
GOCTL_DEBUG BOOLEAN 是否开启 debug 模式,默认为 false,目前暂未应用,次要是 goctl 开发中可能用于管制调试模式
GOCTL_CACHE STRING goctl 缓存目录,次要缓存下载的依赖 protoc、protoc-gen-go、protoc-gen-go-grpc 等
GOCTL_VERSION STRING 以后 goctl 版本
PROTOC_VERSION STRING 以后 protoc 版本,如未装置则为空字符串
PROTOC_GEN_GO_VERSION STRING 以后 protoc-gen-go 版本,如未装置或者从 github.com/golang/protobuf 装置版本为 v1.3.2 之前的则为空字符串
PROTO_GEN_GO_GRPC_VERSION STRING 以后 protoc-gen-go-grpc 版本,如未装置则为空字符串
2. 批改参数

比方咱们将 GOCTL_DEBUG 批改为 true

# 批改前
$ goctl env | grep 'GOCTL_DEBUG'
GOCTL_DEBUG=false

# 批改 GOCTL_DEBUG 为 true
$ goctl env -w GOCTL_DEBUG=true

# 批改后
goctl env | grep 'GOCTL_DEBUG'
GOCTL_DEBUG=true
3. 依赖检测 / 装置

咱们来检测一下我以后的依赖都是否装置好,目前依赖检测内容为 protoc、protoc-gen-go、protoc-gen-go-grpc

# 咱们来检查一下依赖装置
$ goctl env check --verbose                              
[goctl-env]: preparing to check env

[goctl-env]: looking up "protoc"
[goctl-env]: "protoc" is not found in PATH

[goctl-env]: looking up "protoc-gen-go"
[goctl-env]: "protoc-gen-go" is not found in PATH

[goctl-env]: looking up "protoc-gen-go-grpc"
[goctl-env]: "protoc-gen-go-grpc" is not found in PATH

[goctl-env]: check env finish, some dependencies is not found in PATH, you can execute
command 'goctl env check --install' to install it, for details, please execute command
'goctl env check --help'

# 装置依赖,装置依赖有 2 中形式
# 形式一
# $ goctl env check --install --force --verbose

# 形式二
$ goctl env install --verbose -f                       
[goctl-env]: preparing to check env

[goctl-env]: looking up "protoc"
[goctl-env]: "protoc" is not found in PATH
[goctl-env]: preparing to install "protoc"
[goctl-env]: "protoc" is already installed in "/Users/keson/go/bin/protoc"

[goctl-env]: looking up "protoc-gen-go"
[goctl-env]: "protoc-gen-go" is not found in PATH
[goctl-env]: preparing to install "protoc-gen-go"
[goctl-env]: "protoc-gen-go" is already installed in "/Users/keson/go/bin/protoc-gen-go"

[goctl-env]: looking up "protoc-gen-go-grpc"
[goctl-env]: "protoc-gen-go-grpc" is not found in PATH
[goctl-env]: preparing to install "protoc-gen-go-grpc"
[goctl-env]: "protoc-gen-go-grpc" is already installed in "/Users/keson/go/bin/protoc-gen-go-grpc"

[goctl-env]: congratulations! your goctl environment is ready!

goctl rpc

首先咱们来看一下该指令的应用帮忙

goctl rpc -h                                                       
Generate rpc code

Usage:
goctl rpc [flags]
goctl rpc [command]

Available Commands:
new         Generate rpc demo service
protoc      Generate grpc code
template    Generate proto template

Flags:
--branch string   The branch of the remote repo, it does work with --remote
-h, --help            help for rpc
--home string     The goctl home path of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
--o string        Output a sample proto file
--remote string   The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
The git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure

Use "goctl rpc [command] --help" for more information about a command.

该指令提供了三个子指令,new 是疾速创立一个 zrpc 服务,protoc 是依据 proto 形容文件生成 zrpc 代码,而 template 则是疾速生成一个 proto 模板,咱们将重点围绕 goctl rpc protoc 指令来开展,看看 goctl rpc protoc 的应用阐明:

goctl rpc protoc -h                                              
Generate grpc code

Usage:
goctl rpc protoc [flags]

Examples:
goctl rpc protoc xx.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=.

Flags:
--branch string     The branch of the remote repo, it does work with --remote
-h, --help              help for protoc
--home string       The goctl home path of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
--remote string     The remote git repo of the template, --home and --remote cannot be set at the same time, if they are, --remote has higher priority
The git repo directory must be consistent with the https://github.com/zeromicro/go-zero-template directory structure
--style string      The file naming format, see [https://github.com/zeromicro/go-zero/tree/master/tools/goctl/config/readme.md] (default "gozero")
-v, --verbose           Enable log output
--zrpc_out string   The zrpc output directory

goctl rpc protoc 到底怎么应用,为什么示例外面有 –go_out、–go-grpc_out 参数,而查看 help 的时候却没有看到介绍?目前咱们先这样了解,咱们先抛开 goctl,依据官网 protoc 生成 grpc 代码时的指令是什么?会用到哪些 flag,对于 zrpc 的代码生成,你能够了解为 goctl 生成 zrpc 只是在生成 grpc 代码指令的根底上加了 goctl rpc 前缀和一些 goctl 生成 zrpc 须要的 flag,而对于 protoc 及 插件 protoc-gen-go、protoc-gen-grpc-go 的相干参数 goctl 只是做继承,没有必要显示的在 help 外面再形容一遍,前面在剖析源码时能够给大家具体解说一些这块的设计和思考,接下来咱们用一个例子来演示一下,假如咱们有一个 greet.proto 文件,抛开 goctl,咱们生成 grpc 代码须要执行的指令如下:

如果不晓得 grpc 代码是怎么生成的,这块倡议参考官网文档 https://grpc.io/

# 进入 greet.proto 所在目录
$ protoc greet.proto --go_out . --go-grpc_out .
$ tree
.
├── greet.proto
└── pb
├── greet.pb.go
└── greet_grpc.pb.go

那么依照上文对 goctl rpc protoc 的介绍,咱们生成 zrpc 代码的指令则应该为

# 这里多了一个 --zrpc_out 用于指定 zrpc 代码的输入目录
$ goctl rpc protoc greet.proto --go_out=. --go-grpc_out=. --zrpc_out=. --verbose
[goctl-env]: preparing to check env

[goctl-env]: looking up "protoc"
[goctl-env]: "protoc" is installed

[goctl-env]: looking up "protoc-gen-go"
[goctl-env]: "protoc-gen-go" is installed

[goctl-env]: looking up "protoc-gen-go-grpc"
[goctl-env]: "protoc-gen-go-grpc" is installed

[goctl-env]: congratulations! your goctl environment is ready!
[command]: protoc greet.proto --go_out . --go-grpc_out .
Done.
$ tree
.
├── etc
│   └── greet.yaml
├── go.mod
├── greet
│   └── greet.go
├── greet.go
├── greet.proto
├── internal
│   ├── config
│   │   └── config.go
│   ├── logic
│   │   └── pinglogic.go
│   ├── server
│   │   └── greetserver.go
│   └── svc
│       └── servicecontext.go
└── pb
├── greet.pb.go
└── greet_grpc.pb.go

8 directories, 11 files

如果在生成代码时须要输入日志,能够加 –verbose 来显示日志。
goctl rpc protoc 在生成 zrpc 代码时会先对你的环境依赖进行检测,如果没有装置则会主动装置依赖再生成代码。

4. 编辑器插件

为了晋升大家对 zero-api 文件的编写效率,咱们别离对 intellij 和 vscode 提供了相应的编辑器插件, intellij 插件介绍及应用请参考 https://github.com/zeromicro/…,vscode 插件介绍及应用请参考 https://github.com/zeromicro/…

三、goctl 应用中遇到的问题

goctl 从最后的一个性能 rpc proxy 到以后版本(v1.3.5) 曾经领有 13 个一级指令和近 30 个二级指令, 期间 goctl 做了一些调整,而且,gcotl 自身的后退步调也十分快,他更像是在摸索中后退,朝着更快,更好用的方向倒退,因而在迭代的路上,goctl 会显得有些不稳固,大家兴许也遇到很多问题,这里大略总结一下大家在社区中反馈比拟多的一些问题来分享一下。

1. 386 架构上装置 goctl 失败!

形容:antlr 生成的源码中,没有对 386 架构的 uint 的边界值进行很好的解决,导致边界溢出

修复版本:v1.3.3

2. grpc 到底装置什么版本插件?

形容:相熟 grpc 的人应该都晓得,生成 grpc 代码的插件 protoc-gen-go 有两个仓库在保护,有 3 个装置起源,2 个保护仓库别离是:

# 1. golang
# github.com/golang/protobuf/protoc-gen-go
# 2. protocolbuffers
# github.com/protocolbuffers/protobuf-go/cmd/protoc-gen-go

三个装置起源是

# 1. golang 保护的仓库,目前已不举荐应用
# github.com/golang/protobuf/protoc-gen-go
# 2. protocolbuffers 保护的,目前举荐应用的
# github.com/protocolbuffers/protobuf-go/cmd/protoc-gen-go
# 3. goolge 装置,这其实和第二种装置的是一个二进制,他的源码就是 protocolbuffers 保护的雷同仓库
# google.golang.org/protobuf/cmd/protoc-gen-go

在 v.1.3.4 前,如果应用 goctl rpc proto 生成 zrpc 代码则倡议装置旧版本的插件, 即 golang 保护的,因而该指令生成 zrpc 代码是 goctl 为了用户生成指令的简略,做了很厚的封装,但随之带来的问题就是难兼容,因而该指令已不举荐应用。

在 v.1.3.4 及当前,没有对 protoc-gen-go 做限度,用户能够自由选择不同的起源进行装置,但倡议还是装置 protocolbuffer 保护的版本(官网文档曾经替换为这个),而且必须要装置 protoc-gen-grpc-go 插件,这样做的目标是跟着 grpc 官网走,不过用户不必有太大的心理累赘,一下装置这么多依赖,很麻烦,goctl 都曾经帮你实现了,你只有应用 goctl rpc protoc 生成代码时会自动检测依赖并装置。

综上所述,倡议大家还在应用该指令的用户尽早用 goctl rpc protoc 代替。

3. 为什么 Windows 上生成 api/zrpc 代码时,总是提醒 The system cannot find the path specified 相似谬误?

goctl.exe api go -api test.api -dir .
Stat : The system cannot find the path specified.

形容:产生该起因是因为 go list -json -m 获取 go module 时拿到的是一个固定值 command-line-arguments,该问题曾经在 https://github.com/zeromicro/… 进行修复,版本将在 v1.3.6 失效。

4. No help topic ‘proto’

形容:该指令在 v1.3.4 曾经移除,用 goctl rpc protoc 代替

5. zrpc 生成代码时报 go_package 谬误

protoc-gen-go: unable to determine Go import path for "greet.proto"

Please specify either:
• a "go_package" option in the .proto source file, or
• a "M" argument on the command line.

See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.

--go_out: protoc-gen-go: Plugin failed with status code 1.

6. zrpc 生成代码时指定了 pb 的输入目录为以后服务 main 目录

the output of pb.go and _grpc.pb.go must not be the same with --zrpc_out:
pb output: /Users/keson/workspace/awesome-goctl/zwesome-zrpc/pb_in_main
zrpc out: /Users/keson/workspace/awesome-goctl/zwesome-zrpc/pb_in_main

7. 为什么我的代码生成的 pb client(不)带 client 标记?

这是旧版本 goctl rpc proto 生成 zrpc 代码时才有这个问题,目前曾经移除了该指令。

8. 为什么我生成的目录构造和文档演示不一样?

对于 goctl rpc protoc 生成 zrpc 代码的目录构造,总的构造上是不会存在差别的,惟一存在差别的是 pb 的输入目录,这个取决于你指定的参数来管制,管制 pb 输入目录的因素有 go_optgo-grpc_optgo_package,详情可参考《Protocol Buffers: Go Generated Code》。

9. 为什么我装置了 goctl 编辑器插件还是不能高亮

关上 Goland 的设置,搜寻 FileTypes 设置 api 文件后缀即可。

我的项目地址

https://github.com/zeromicro/go-zero

欢送应用 go-zerostar 反对咱们!

微信交换群

关注『微服务实际 』公众号并点击 交换群 获取社区群二维码。

正文完
 0