grpc go_package 的理解

grpc go_package 的理解

最近在用 golang 开发注册中心和配置中心,由于要兼容 nacos,所以使用 nacos 的 proto 文件生成了 pb 然后使用,结果发现服务找不到,再细看,发现 nacos 是 /Request/request 而自研的服务有前缀,是 /nacos.Request/request,于是有了本文;

proto 文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
syntax = "proto3";

import "google/protobuf/any.proto";

message Metadata {
  string type = 3;
  string clientIp = 8;
  map<string, string> headers = 7;
}

message Payload {
  Metadata metadata = 2;
  google.protobuf.Any body = 3;
}

service Request {
  // Sends a commonRequest
  rpc request (Payload) returns (Payload) {
  }
}

service BiRequestStream {
  // Sends a biStreamRequest
  rpc requestBiStream (stream Payload) returns (stream Payload) {
  }
}

以上为 nacos server 端的 pb 文件,由于要生成 golang 代码,所以在 import 下面我加了:

option go_package = "./nacos";

生成命令如下:

protoc -I ${GOPATH}/src -I ./proto --go_out=./rpc/nacos/pb --go-grpc_out=./rpc/nacos/pb ./proto/nacos.proto

然后生成的文件中有这么一行:

1
2
3
const (
    Request_Request_FullMethodName = "/nacos.Request/request"
)

当然了,其他地方也有类似这样的前缀,我期望没有 nacos. 这个前缀;

方案 1

删掉 nacos ,./nacos 变更为 ./

option go_package = "./";

发现可行,但是生成的 pb.go 文件的包名是 __; 但我希望这个包名是能用的正常包名;

方案 2

经过一番搜索,发现别人有类似这样的写法:

option go_package = "./;pb";

然后照着改了下,发现出现了奇迹,nacos. 这个前缀没了,同时,有包名,包名为 pb,所以我认为 go_package 的格式应该是:"./prefix;package" 如果不设置 prefix; 则使用 package 作为 prefix

最后更新于