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

Can I override the endpoint prefix set in a Go GRPC client call?

我有一个生成 C# 和 Go 代码的 protobuf。

protobuf 包含:

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

我正在使用 go-micro and protoc-gen-micro for my Go GRPC. I'm using Go modules for my Go packages. I'm pushing generated Go code to my protobuf repository for a few reasons: (a) Git submodules can be painful to work with (b) a protobuf referencing a type in an external package requires that external package to have a defined absolute package URL and (c) that's how Google do it (ref e.g. structpb) 所以它似乎是 "standard".

从该原型生成的 C# 服务器/客户端服务/命中“/myprotobuf.Service/Method”处的端点,并且工作正常。

GRPC_TRACE 对于 C# 给出:

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 和 C# 总是会在端点前加上包/命名空间的前缀,他们永远不会就包/命名空间应该是什么达成一致。

有没有办法覆盖 GRPC 端点前缀的命名空间?

我发现的一个解决方法是将包放在 "mypb" 目录中原型下的一个级别:

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

这有点 hack,但我不太介意,尤其是因为它使生成的代码远离我真正关心的原始源代码。这样,生成的 C# 和 Go 就它们作为端点前缀的名称空间/包达成一致。值得庆幸的是,驼峰式 MyPB 与小写 mypb 似乎无关紧要。