You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
go-zero/tools/goctl/rpc
kevin f411178a4f refine rpc generator 4 years ago
..
command refine goctl rpc generator 4 years ago
ctx refine rpc generator 4 years ago
execx rpc service generation (#26) 4 years ago
gen refine rpc generator 4 years ago
parser refine goctl rpc generator 4 years ago
CHANGELOG.md rpc service generation (#26) 4 years ago
README.md refine goctl rpc generator 4 years ago

README.md

Rpc Generation

Goctl Rpc是goctl脚手架下的一个rpc服务代码生成模块支持proto模板生成和rpc服务代码生成通过此工具生成代码你只需要关注业务逻辑编写而不用去编写一些重复性的代码。这使得我们把精力重心放在业务上从而加快了开发效率且降低了代码出错率。

特性

  • 简单易用
  • 快速提升开发效率
  • 出错率低

快速开始

生成proto模板

$ goctl rpc template -o=user.proto
syntax = "proto3";

package remote;

message Request {
  // 用户名
  string username = 1;
  // 用户密码
  string password = 2;
}

message Response {
  // 用户名称
  string name = 1;
  // 用户性别
  string gender = 2;
}

service User {
  // 登录
  rpc Login(Request)returns(Response);
}

生成rpc服务代码

生成user rpc服务

$ goctl rpc proto -src=user.proto

代码tree

user
    ├── etc
    │   └── user.json
    ├── internal
    │   ├── config
    │   │   └── config.go
    │   ├── handler
    │   │   ├── loginhandler.go
    │   │   └── userhandler.go
    │   ├── logic
    │   │   └── loginlogic.go
    │   └── svc
    │       └── servicecontext.go
    ├── pb
    │   └── user.pb.go
    ├── shared
    │   ├── mockusermodel.go
    │   ├── types.go
    │   └── usermodel.go
    ├── user.go
    └── user.proto

准备工作

  • 安装了go环境
  • 安装了protoc并且已经设置环境变量

protoc-gen-go

在使用goctl生成rpc服务代码时我们默认会根据开发人员正在开发的工程依赖的github.com/golang/protobuf自动将插件重新go install${GOPATH}/bin中, 寻找方法:

go mod 工程

对于$ go version不低于1.5版本的的工程,会优先寻找$ go env GOMODCACHE目录,如果没有则去${GOPATH}中查找(见下文),而低于1.5版本的则会优先从${GOPATH}/pkg/mod目录下查找,否则也从% GOPATH中查找(见下文)

go path工程

对于没有使用go mod的工程则默认当作在${GOPATH}中处理暂不支持用户自定义的GOPATH而这种情况下则会默认从${GOPATH}/src中查找

注意:

  • 对于以上两种工程如果没有在对应目录查找到protoc-gen-go则会提示相应错误,尽管protoc-gen-go可能在其他已经设置环境变量的目录中,这个将在后面版本进行优化。
  • 对于go mod工程如果工程没有依赖github.com/golang/protobuf则需要提前引入。

好处

  • 保证grpc代码生成规范的一致性

用法

$ goctl rpc proto -h
NAME:
   goctl rpc proto - generate rpc from proto"

USAGE:
   goctl rpc proto [command options] [arguments...]

OPTIONS:
   --src value, -s value         the file path of the proto source file
   --dir value, -d value         the target path of the code,default path is "${pwd}". [option]
   --service value, --srv value  the name of rpc service. [option]
   --shared value                the dir of the shared file,default path is "${pwd}/shared. [option]"
   --idea                        whether the command execution environment is from idea plugin. [option]

  • 参数说明
    • --src 必填proto数据源目前暂时支持单个proto文件生成这里不支持不建议外部依赖

    • --dir 非必填默认为proto文件所在目录生成代码的目标目录

    • --service 服务名称非必填默认为proto文件所在目录名称但是如果proto所在目录为一下结构

      user
          ├── cmd
          │   └── rpc
          │       └── user.proto
      

      则服务名称亦为user而非proto所在文件夹名称了这里推荐使用这种结构可以方便在同一个服务名下建立不同类型的服务(api、rpc、mq等),便于代码管理与维护。

    • --shared 非必填,默认为$dir(xxx.proto)/sharedrpc client逻辑代码存放目录。

      注意这里的shared文件夹名称将会是代码中的package名称。

    • --idea 非必填是否为idea插件中执行保留字段终端执行可以忽略

开发人员需要做什么

关注业务代码编写将重复性、与业务无关的工作交给goctl生成好rpc服务代码后开饭人员仅需要修改

  • 服务中的配置文件编写(etc/xx.json、internal/config/config.go)
  • 服务中业务逻辑编写(internal/logic/xxlogic.go)
  • 服务中资源上下文的编写(internal/svc/servicecontext.go)

扩展

对于需要进行rpc mock的开发人员在安装了mockgen工具的前提下可以在rpc的shared文件中生成好对应的mock文件。

注意事项

  • proto不支持暂多文件同时生成
  • proto不支持外部依赖包引入message不支持inline
  • 目前main文件、shared文件、handler文件会被强制覆盖而和开发人员手动需要编写的则不会覆盖生成这一类在代码头部均有
    // Code generated by goctl. DO NOT EDIT!
    // Source: xxx.proto
    
    的标识,请注意不要将也写业务性代码写在里面。

下一步规划

  • 尽快支持windows端rpc生成