我有一个生成 C# 和 Go 代码的 protobuf。
protobuf 包含:
syntax = "proto3";
package myprotobuf;
option go_package = "gitlab.example.com/mycompany/myprotobuf.git";
我正在为我的 Go GRPC 使用go-micro和protoc-gen-micro。我正在为我的 Go 包使用Go 模块。我将生成的 Go 代码推送到我的 protobuf 存储库有几个原因:(a) 使用 Git 子模块可能会很痛苦 (b) 引用外部包中的类型的 protobuf 要求外部包具有定义的绝对包 URL (c) 这就是谷歌的做法(例如structpb),所以这似乎是“标准”。
从该原型生成的 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
似乎需要 .git 在包 URL 的末尾。- go modules 需要 "module" 和 "package" 定义来匹配 URL。
- C# 不喜欢“。” 在命名空间中。
因此,似乎 Go 和 C# 总是会在端点前面加上认为的包/命名空间是什么,并且他们永远不会就包/命名空间应该是什么达成一致。
有没有办法覆盖以 GRPC 端点为前缀的命名空间?