【问题标题】:Can I override the endpoint prefix set in a Go GRPC client call?我可以覆盖在 Go GRPC 客户端调用中设置的端点前缀吗?
【发布时间】:2019-03-22 07:20:38
【问题描述】:

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

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) 这就是谷歌的做法(参考例如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


    【解决方案1】:

    我发现的一种解决方法是将包放在“mypb”目录中的 protos 下一级:

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 2020-04-29
      • 1970-01-01
      • 2020-06-25
      • 2012-05-06
      • 2014-02-12
      • 1970-01-01
      • 2017-12-28
      • 2020-01-18
      相关资源
      最近更新 更多