【发布时间】:2019-03-22 07:20:38
【问题描述】:
我有一个生成 C# 和 Go 代码的 protobuf。
protobuf 包含:
syntax = "proto3";
package myprotobuf;
option go_package = "gitlab.example.com/mycompany/myprotobuf.git";
我将 go-micro 和 protoc-gen-micro 用于我的 Go GRPC。我的 Go 包使用 Go modules。我将生成的 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 模块需要“模块”和“包”定义来匹配 URL。
- C# 不喜欢“.”在命名空间中。
所以看起来 Go 和 C# 总是会在端点前面加上认为的包/命名空间是什么,并且他们永远不会就包/命名空间应该是什么达成一致。
有没有办法覆盖以 GRPC 端点为前缀的命名空间?
【问题讨论】:
标签: protocol-buffers grpc go-micro