rpc服务目录

proto 文件

greet.proto

  1. syntax = "proto3";
  2. package stream;
  3. option go_package = "./greet";
  4. message StreamReq {
  5. string name = 1;
  6. }
  7. message StreamResp {
  8. string greet = 1;
  9. }
  10. service StreamGreeter {
  11. rpc greet(StreamReq) returns (StreamResp);
  12. }

goctl rpc proto

以下为旧指令 goctl rpc proto ...

  1. $ goctl rpc proto -src greet.proto -dir .

生成的目录结构

  1. .
  2. ├── etc // yaml配置文件
  3. └── greet.yaml
  4. ├── go.mod
  5. ├── greet // pb.go文件夹①
  6. └── greet.pb.go
  7. ├── greet.go // main函数
  8. ├── greet.proto // proto 文件
  9. ├── greetclient // call logic ②
  10. └── greet.go
  11. └── internal
  12. ├── config // yaml配置对应的实体
  13. └── config.go
  14. ├── logic // 业务代码
  15. └── pinglogic.go
  16. ├── server // rpc server
  17. └── greetserver.go
  18. └── svc // 依赖资源
  19. └── servicecontext.go

[!TIP] ① pb文件夹名(老版本文件夹固定为pb)称取自于proto文件中option go_package的值最后一层级按照一定格式进行转换,若无此声明,则取自于package的值,大致代码如下:

  1. if option.Name == "go_package" {
  2. ret.GoPackage = option.Constant.Source
  3. }
  4. ...
  5. if len(ret.GoPackage) == 0 {
  6. ret.GoPackage = ret.Package.Name
  7. }
  8. ret.PbPackage = GoSanitized(filepath.Base(ret.GoPackage))
  9. ...

[!TIP] GoSanitized方法请参考google.golang.org/protobuf@v1.25.0/internal/strs/strings.go:71

[!TIP] ② call 层文件夹名称取自于proto中service的名称,如该sercice的名称和pb文件夹名称相等,则会在srervice后面补充client进行区分,使pb和call分隔。

  1. if strings.ToLower(proto.Service.Name) == strings.ToLower(proto.GoPackage) {
  2. callDir = filepath.Join(ctx.WorkDir, strings.ToLower(stringx.From(proto.Service.Name+"_client").ToCamel()))
  3. }

goctl rpc protoc

当 goctl 版本大于等于 1.3.0 时,按照如下指令生成

  1. goctl rpc protoc greet.proto --go_out=. --go-grpc_out=. --zrpc_out=.

目录结构如下

  1. .
  2. ├── etc
  3. └── greet.yaml
  4. ├── go.mod
  5. ├── greet // ①
  6. ├── greet.pb.go
  7. └── greet_grpc.pb.go
  8. ├── greet.go
  9. ├── greet.proto
  10. ├── internal
  11. ├── config
  12. └── config.go
  13. ├── logic
  14. └── greetlogic.go
  15. ├── server
  16. └── streamgreeterserver.go
  17. └── svc
  18. └── servicecontext.go
  19. └── streamgreeter // ②
  20. └── streamgreeter.go

以上目录和 goctl rpc proto 生成的区别在于: goctl rpc proto 是 goctl 控制输出目录,用户不可通过参数灵活指定 而 goctl rpc protoc 生成是由 protocprotoc-gen-go 或者 protoc-gen-grpc-go(如果安装且protoc-gen-go为 google 仓库维护的版本) 来决定,用户自行掌握,goctl 只负责 zrpc 目录的控制;

因此上文的目录中 ① ② 名称并非固定的,是取决于 proto 文件中的 package | option xx_packageservice 名称分别决定。