我可以覆盖Go GRPC客户端调用中设置的端点前缀吗?

时间:2019-03-22 07:20:38

标签: protocol-buffers grpc go-micro

我只有一个protobuf,可以生成C#和Go代码。

protobuf包含:

syntax = "proto3";
package myprotobuf;
option go_package = "gitlab.example.com/mycompany/myprotobuf.git";

我将go-microprotoc-gen-micro用于Go GRPC。我的Go软件包使用的是Go modules。我将生成的Go代码推送到protobuf存储库的原因有几个:(a)使用Git子模块可能很麻烦(b)引用外部包中的类型的protobuf要求外部包具有已定义的绝对包URL (c)这就是Google的做法(例如,structpb),因此这似乎是“标准”。

由此proto生成的C#服务器/客户端为“ /myprotobuf.Service/Method”提供服务/命中了一个端点,并且运行正常。

C#的GRPC_TRACE给出:

Decode: ':path: /myprotobuf.Service/Method', elem_interned=1 [1], k_interned=1, v_interned=1 (edited) 

调用C#服务器的Go / go-micro客户端提供:

Decode: ':path: /myprotobuf.git.Service/Method', elem_interned=0 [2], k_interned=1, v_interned=0

其后是一个错误。请注意,路径是不同的。 C#GRPC处理程序中的断点和Console.WriteLine永远不会被命中,这是有道理的,因为我们没有命中已知的端点。

对此有什么解决方案?

  • go get似乎在包URL的末尾需要.git。
  • go模块需要“模块”和“包”定义来匹配URL。
  • C#不喜欢“。”在名称空间中。

因此,似乎Go和C#都总是在端点之前加上软件包/名称空间的含义,而他们永远也不会就软件包/名称空间的含义达成共识。

是否有办法覆盖以GRPC终结点为前缀的名称空间?

1 个答案:

答案 0 :(得分:0)

我发现的一种解决方法是将程序包放置在“ mypb”目录中的protos下的某个位置:

package mypb;
option go_package = "gitlab.example.com/mycompany/myprotobuf.git/mypb";
option csharp_namespace = "MyCompany.Protobuf.MyPB";

这有点骇人听闻,但我不太介意,特别是因为它会将生成的代码置于我真正关心的原始源代码之外。这样,生成的C#和Go在它们使用终结点作为前缀的名称空间/包上达成一致。幸运的是,驼色MyPB与小写mypb似乎无关紧要。